获取某些节点进行分析树(Get certain nodes out of a Parse Tree)

2019-07-29 07:25发布

我的工作涉及通过霍布斯算法照应解析的一个项目。 我已经解析使用斯坦福解析器我的文字,现在我想操纵节点,以实现我的算法。

此刻,我不知道如何:

  • 访问基于其POS标签的节点(例如我要开始一个代名词 - ?我怎么得到所有代词)。

  • 旅客使用。 我是位Java的菜鸟,但在C ++中,我需要实现一个游客函子,然后在其挂钩工作。 我找不到太多的斯坦福解析器的树结构虽然。 那是jgrapht? 如果是,你能为我提供的代码片段一些指点?

Answer 1:

@ 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); } 


Answer 2:

下面是分析句子,发现所有的代词的一个简单的例子。

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


文章来源: Get certain nodes out of a Parse Tree