package edu.stanford.nlp.sempre; import fig.basic.LispTree; import fig.basic.LogInfo; import fig.basic.Option; import java.util.List; /** * Given a particular position i, return the ith element on the RHS of the * derivation's rule. * * @author Andrew Chou */ public class SelectFn extends SemanticFn { public static class Options { @Option(gloss = "Verbose") public int verbose = 0; } public static Options opts = new Options(); // Which child derivation to select and return. int position = -1; public SelectFn() { } public SelectFn(int position) { init(LispTree.proto.newList("SelectFn", position + "")); } public void init(LispTree tree) { super.init(tree); this.position = Integer.valueOf(tree.child(1).value); } public DerivationStream call(final Example ex, final Callable c) { return new SingleDerivationStream() { @Override public Derivation createDerivation() { FeatureVector features = new FeatureVector(); // TODO(pliang): move into FeatureExtractor if (FeatureExtractor.containsDomain("skipPos")) { for (int i = 0; i < c.getChildren().size(); ++i) { if (i != position) { Derivation child = c.child(i); for (int index = child.start; index < child.end; ++index) { List<String> posTags = ex.languageInfo.posTags; features.add("skipPos", posTags.get(index)); if (opts.verbose > 0) { LogInfo.logs( "SelectFn: adding pos-skipping feature, pos: %s, word: %s", posTags.get(index), ex.languageInfo.tokens.get(index)); } } } } } return new Derivation.Builder() .withCallable(c) .withFormulaFrom(c.child(position)) .localFeatureVector(features) .createDerivation(); } }; } }