Получить определенные узлы из дерева разбора
Я работаю над проектом, связанным с разрешением анафоры по алгоритму Хоббса. Я проанализировал мой текст, используя анализатор Стэнфорда, и теперь я хотел бы манипулировать узлами, чтобы реализовать мой алгоритм.
На данный момент я не понимаю, как:
Доступ к узлу на основе его POS-тега (например, мне нужно начать с местоимения - как мне получить все местоимения?).
Используйте посетителей. Я немного новичок в Java, но в C++ мне нужно было реализовать функтор Visitor, а затем работать над его хуками. Я не мог найти много для структуры дерева Стэнфордского парсера все же. Это jgrapht? Если да, не могли бы вы дать мне несколько указателей на фрагменты кода?
2 ответа
Ответ @dhg работает отлично, но вот еще два варианта, о которых также может быть полезно знать:
Tree
реализует классIterable
, Вы можете перебрать все узлыTree
или, строго говоря, поддеревья, возглавляемые каждым узлом в обходе предварительного заказа, с:for (Tree subtree : t) { if (subtree.label().value().equals("PRP")) { pronouns.add(subtree); } }
Вы также можете получить только узлы, которые удовлетворяют некоторым (потенциально довольно сложным образцам), используя
tregex
, который ведет себя скорее какjava.util.regex
разрешив сопоставления с образцом над деревьями. Вы бы хотели что-то вроде:TregexPattern tgrepPattern = TregexPattern.compile("PRP"); TregexMatcher m = tgrepPattern.matcher(t); while (m.find()) { Tree subtree = m.getMatch(); pronouns.add(subtree); }
Вот простой пример, который анализирует предложение и находит все местоимения.
private static ArrayList<Tree> findPro(Tree t) {
ArrayList<Tree> pronouns = new ArrayList<Tree>();
if (t.label().value().equals("PRP"))
pronouns.add(t);
else
for (Tree child : t.children())
pronouns.addAll(findPro(child));
return pronouns;
}
public static void main(String[] args) {
LexicalizedParser parser = LexicalizedParser.loadModel();
Tree x = parser.apply("The dog walks and he barks .");
System.out.println(x);
ArrayList<Tree> pronouns = findPro(x);
System.out.println("All Pronouns: " + pronouns);
}
Это печатает:
(ROOT (S (S (NP (DT The) (NN dog)) (VP (VBZ walks))) (CC and) (S (NP (PRP he)) (VP (VBZ barks))) (. .)))
All Pronouns: [(PRP he)]