@Override public Set<Feature> getFeatures(Constituent c) throws EdisonException { TextAnnotation ta = c.getTextAnnotation(); Set<Feature> features = new LinkedHashSet<>(); TreeView parse = (TreeView) ta.getView(dependencyViewName); // get equivalent of c in the parse view Constituent c2 = parse.getConstituentsCoveringToken(c.getStartSpan()).get(0); List<Relation> incomingRelations = c2.getIncomingRelations(); if (incomingRelations.size() > 0) { Constituent c1 = parse .getConstituentsCoveringToken(incomingRelations.get(0).getSource().getStartSpan()) .get(0); Pair<List<Constituent>, List<Constituent>> paths = PathFeatureHelper.getPathsToCommonAncestor(c1, c2, 400); List<String> path = new ArrayList<>(); List<String> pos = new ArrayList<>(); for (int i = 0; i < paths.getFirst().size() - 1; i++) { Constituent cc = paths.getFirst().get(i); path.add( cc.getIncomingRelations().get(0).getRelationName() + PathFeatureHelper.PATH_UP_STRING); pos.add( WordHelpers.getPOS(ta, cc.getStartSpan()) + ":" + cc.getIncomingRelations().get(0).getRelationName() + PathFeatureHelper.PATH_UP_STRING); } Constituent top = paths.getFirst().get(paths.getFirst().size() - 1); pos.add(WordHelpers.getPOS(ta, top.getStartSpan()) + ":*"); path.add("*"); if (paths.getSecond().size() > 1) { for (int i = paths.getSecond().size() - 2; i >= 0; i--) { Constituent cc = paths.getSecond().get(i); pos.add( WordHelpers.getPOS(ta, cc.getStartSpan()) + ":" + PathFeatureHelper.PATH_DOWN_STRING); path.add(PathFeatureHelper.PATH_DOWN_STRING); } } features.addAll(getNgrams(path, "")); features.addAll(getNgrams(pos, "pos")); } return features; }
@Override public List<Constituent> transform(Constituent input) { TextAnnotation ta = input.getTextAnnotation(); int tokenPosition = input.getStartSpan(); TreeView dependency = (TreeView) ta.getView(ViewNames.DEPENDENCY); Constituent verbNode = dependency.getConstituentsCoveringToken(tokenPosition).get(0); boolean done = false; while (!done) { String pos = WordHelpers.getPOS(ta, verbNode.getStartSpan()); if (POSUtils.isPOSVerb(pos)) { done = true; } else { List<Relation> incoming = verbNode.getIncomingRelations(); if (incoming == null || incoming.size() == 0) { return new ArrayList<>(); } else verbNode = incoming.get(0).getSource(); } } return Collections.singletonList(addPointerToSource(input, verbNode)); }