从解析树中获取某些节点

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

目前,我不明白如何:

  • 基于其POS标签访问节点(例如,我需要以代词开头 – 我如何得到所有代词?)。

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

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

  • Tree类实现了Iterable 。 您可以在预先遍历遍历中遍历Tree所有节点,或者严格地,遍历每个节点的子树,具有:

     for (Tree subtree : t) { if (subtree.label().value().equals("PRP")) { pronouns.add(subtree); } } 
  • 您还可以通过使用tregex获得满足某些(可能非常复杂的模式)的节点, 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 findPro(Tree t) { ArrayList pronouns = new ArrayList(); 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 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)]