3

我正在研究一个通过霍布斯算法涉及回指解析的项目。我已经使用斯坦福解析器解析了我的文本,现在我想操纵节点以实现我的算法。

目前,我不明白如何:

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

  • 使用访客。我对 Java 有点小白,但在 C++ 中,我需要实现一个访问者函子,然后处理它的钩子。不过,我找不到太多斯坦福解析器的树结构。那是jgrapht吗?如果是的话,你能给我一些关于代码片段的指针吗?

4

2 回答 2

10

@dhg 的回答很好,但这里有两个其他选项可能也很有用:

  • 该类Tree实现Iterable. 您可以Tree在前序遍历中遍历 a 的所有节点,或者严格来说,以每个节点为首的子树,其中:

    for (Tree subtree : t) { 
        if (subtree.label().value().equals("PRP")) {
            pronouns.add(subtree);
        }
    }
    
  • 您还可以通过 using 获得满足某些(可能非常复杂的模式)的节点tregex,其行为类似于java.util.regex允许模式匹配树。你会有类似的东西:

    TregexPattern tgrepPattern = TregexPattern.compile("PRP");
    TregexMatcher m = tgrepPattern.matcher(t);
    while (m.find()) {
        Tree subtree = m.getMatch();
        pronouns.add(subtree);
    }
    
于 2012-05-08T04:13:05.150 回答
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)]
于 2012-05-07T02:43:02.200 回答