我的工作涉及通过霍布斯算法照应解析的一个项目。 我已经解析使用斯坦福解析器我的文字,现在我想操纵节点,以实现我的算法。
此刻,我不知道如何:
访问基于其POS标签的节点(例如我要开始一个代名词 - ?我怎么得到所有代词)。
旅客使用。 我是位Java的菜鸟,但在C ++中,我需要实现一个游客函子,然后在其挂钩工作。 我找不到太多的斯坦福解析器的树结构虽然。 那是jgrapht? 如果是,你能为我提供的代码片段一些指点?
我的工作涉及通过霍布斯算法照应解析的一个项目。 我已经解析使用斯坦福解析器我的文字,现在我想操纵节点,以实现我的算法。
此刻,我不知道如何:
访问基于其POS标签的节点(例如我要开始一个代名词 - ?我怎么得到所有代词)。
旅客使用。 我是位Java的菜鸟,但在C ++中,我需要实现一个游客函子,然后在其挂钩工作。 我找不到太多的斯坦福解析器的树结构虽然。 那是jgrapht? 如果是,你能为我提供的代码片段一些指点?
@ 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); }
下面是分析句子,发现所有的代词的一个简单的例子。
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)]