从解析树中获取某些节点

时间:2012-05-06 22:28:56

标签: java nlp stanford-nlp jgrapht

我正在研究一个涉及通过Hobbs算法进行回指解析的项目。我使用Stanford解析器解析了我的文本,现在我想操作节点以实现我的算法。

目前,我不明白如何:

  • 根据POS标签访问节点(例如,我需要以代词开头 - 如何获取所有代词?)。

  • 使用访客。我有点像Java的菜鸟,但是在C ++中我需要实现一个Visitor仿函数然后处理它的钩子。我找不到Stanford Parser的Tree结构。那是jgrapht吗?如果是的话,你能否在代码片段中提供一些指示?

2 个答案:

答案 0 :(得分:10)

@ 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); } 相似,允许在树上进行模式匹配。你会有类似的东西:

    {{1}}

答案 1 :(得分: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)]