2012-05-06 2 views
3

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

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

  • доступа узел на основе его POS-тега (например, мне нужно начинать с местоимения - как я могу получить все местоимения?).

  • Использование посетителей. Я немного нуб Java, но на C++ мне нужно было реализовать функтор Visitor, а затем работать над его перехватами. Хотя я не мог найти много для структуры дерева Стэнфордского Парсера. Это jgrapht? Если да, можете ли вы предоставить мне некоторые указатели на фрагменты кода?

ответ

10

@ ответ DHG прекрасно работает, но вот два других варианта, что это может также быть полезно знать:

  • The 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); 
    } 
    
+0

Спасибо! Метод .children() для меня достаточно, чтобы написать на нем итератор BFS, но для будущей ссылки, почему я не совместим с jgrapht? Я читал, что вы использовали эту библиотеку для создания своей древовидной структуры, поэтому я подумал, что это должно быть! Последнее, что мне нужно, это получить слово, помеченное тегом POS - скажем, у меня есть t = (PRP he). С t.label(). Value() Я могу получить PRP, как мне получить «он»? Еще раз спасибо! =) – Tex

+0

О, это получилось. Это был только ребенок. Все хорошо! : D – Tex

+0

В классе Tree не используется jgrapht. (Хотя он был модифицирован по-разному, например, с внедрением Iterable, класс Tree был первоначально написан против JDK 1.1, до того, как существовал jgrapht, и каким-то образом показывает его возраст ....) Мы ранее использовали jgrapht за нашими графиками зависимостей , но недавно отошли от него.Наше впечатление заключалось в том, что многие люди предпочитали меньше библиотечных зависимостей. Чтобы получить слово, вы направляетесь на один уровень вниз 'subtree.firstChild(). Label(). Value()'. –

5

Вот простой пример, который анализирует предложение и находит все местоимения.

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)] 
+0

Спасибо! Можете ли вы дать мне дополнительную информацию о посещении этого дерева? Например, t.children() посещение BFS? – Tex

+1

@Davide: 'children' возвращает только детей, поэтому вам нужно построить обход DFS или BFS. См. [API docs] (http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/trees/Tree.html). –

+0

Еще один вопрос: я получаю тег POS с t.label(). Value(). Как получить фактическое слово? например, у меня есть t = (PRP he). С t.label(). Value() Я могу получить PRP, как мне получить «он»? – Tex

Смежные вопросы