public static Set<Term> extractHeads(final KAFDocument document, @Nullable final Iterable<Term> ancestors, @Nullable final Iterable<Term> span, @Nullable final java.util.function.Predicate<Term> predicate) { Set<Term> ancestorSet; if (ancestors != null) { ancestorSet = ImmutableSet.copyOf(ancestors); } else { ancestorSet = Sets.newHashSet(); final Set<Term> termSet = Sets.newHashSet(span); for (final Term term : termSet) { final Dep dep = document.getDepToTerm(term); if (dep == null || !termSet.contains(dep.getFrom())) { ancestorSet.add(term); } } } final Set<Term> result = Sets.newHashSet(); for (final Term ancestor : ancestorSet) { extractHeadsHelper(document, ancestor, predicate, result); } if (span != null) { result.retainAll(ImmutableSet.copyOf(span)); } // System.err.println(document.getPublic().uri + " -> " + termFilter + " / " + ancestors // + " -> " + result); return result; }
private static boolean extractHeadsHelper(final KAFDocument document, final Term term, final java.util.function.Predicate<Term> predicate, final Collection<Term> result) { final String pos = extendedPos(document, term); boolean accepted = false; if (pos.startsWith("V")) { final Term srlHead = syntacticToSRLHead(document, term); if (!term.equals(srlHead)) { accepted = extractHeadsHelper(document, srlHead, predicate, result); } } if (!accepted && (predicate == null || predicate.test(term))) { result.add(term); accepted = true; } if (accepted) { for (final Dep dep : document.getDepsFromTerm(term)) { if (dep.getRfunc().toUpperCase().contains("COORD")) { extractHeadsHelper(document, dep.getTo(), predicate, result); } } } else { for (final Dep dep : document.getDepsFromTerm(term)) { extractHeadsHelper(document, dep.getTo(), predicate, result); } } return accepted; }