Получить определенные узлы из дерева разбора

Я работаю над проектом, связанным с разрешением анафоры по алгоритму Хоббса. Я проанализировал мой текст, используя анализатор Стэнфорда, и теперь я хотел бы манипулировать узлами, чтобы реализовать мой алгоритм.

На данный момент я не понимаю, как:

  • Доступ к узлу на основе его 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)]
Другие вопросы по тегам