package edu.stanford.nlp.sempre; import java.util.*; import fig.basic.IntPair; /** * Extract features specific to the floating parser. * * @author ppasupat */ public class FloatingFeatureComputer implements FeatureComputer { @Override public void extractLocal(Example ex, Derivation deriv) { extractFloatingRuleFeatures(ex, deriv); extractFloatingSkipFeatures(ex, deriv); } // Conjunction of the rule and each lemma in the sentence void extractFloatingRuleFeatures(Example ex, Derivation deriv) { if (!FeatureExtractor.containsDomain("floatRule")) return; for (String lemma : ex.getLemmaTokens()) deriv.addFeature("floatRule", "lemma=" + lemma + ",rule=" + deriv.rule.toString()); } // Look for words with no anchored rule applied void extractFloatingSkipFeatures(Example ex, Derivation deriv) { if (!FeatureExtractor.containsDomain("floatSkip")) return; if (!deriv.isRoot(ex.numTokens())) return; // Get all anchored tokens boolean[] anchored = new boolean[ex.numTokens()]; List<Derivation> stack = new ArrayList<>(); stack.add(deriv); while (!stack.isEmpty()) { Derivation currentDeriv = stack.remove(stack.size() - 1); if (deriv.start != -1) { for (int i = deriv.start; i < deriv.end; i++) anchored[i] = true; } else { for (Derivation child : currentDeriv.children) { stack.add(child); } } } // Fire features based on tokens that are (not) anchored // See if named entities are skipped for (IntPair pair : ex.languageInfo.getNamedEntitySpans()) { for (int i = pair.first; i < pair.second; i++) { if (!anchored[i]) { String nerTag = ex.languageInfo.nerTags.get(i); deriv.addFeature("floatSkip", "skipped-ner=" + nerTag); break; } } } // See which POS tags are skipped for (int i = 0; i < anchored.length; i++) { if (!anchored[i]) { deriv.addFeature("floatSkip", "skipped-pos=" + ex.posTag(i)); } } } }