我正在尝试向stanford解析tree添加一个新节点,尽管我目前尝试的不起作用:
所以我使用TregexMatcher并返回一棵树,如:
(VP
(VB run)
(PP
(To to)
(NP
(DT the)
(NN shop)
)
)
)
我试图插入(VBD确实)成为(VP)给树的第一个孩子:
(VP
(VBD did)
(VB run)
(PP
(To to)
(NP
(DT the)
(NN shop)
)
)
)
以下是我尝试的代码:
private Tree addNode(Tree tree, Label posTag, Label value, int index) {
SimpleTree posNode = new SimpleTree(posTag);
posNode.setValue(posTag.value());
SimpleTree valueNode = new SimpleTree(value);
valueNode.setValue(value.value());
posNode.addChild(valueNode);
tree.insertDtr(posNode, index);
return tree;
}
我一直在使用online documentation,虽然我不确定如何处理这个问题。
我哪里错了?在网上是否有人可以将我链接到?
编辑:上述代码之后的更改树是:
(VP
( )
(VB run)
(PP
(TO to)
(NP
(DT the)
(NN shop)
)
)
)
答案 0 :(得分:2)
错误在于使用SimpleTree
。 SimpleTree
只是一个没有节点标签的树结构,所以没有多大用处。我在文档中添加了一条说明。使用LabeledScoredTreeNode
它可以正常工作:
private static Tree addNodeFixed(Tree tree, Label posTag, Label value, int index) {
Tree posNode = new LabeledScoredTreeNode(posTag);
posNode.setValue(posTag.value());
Tree valueNode = new LabeledScoredTreeNode(value);
valueNode.setValue(value.value());
posNode.addChild(valueNode);
tree.insertDtr(posNode, index);
return tree;
}
但是,如果您正在使用Tregex来匹配树木,您可能会发现使用Tsurgeon更容易。但要注意插入时的无限循环!
private static Tree addNodeTsurgeon(Tree tree, String tag, String word) {
TregexPattern pat = TregexPattern.compile("__=root !> __ !< " + tag);
TsurgeonPattern surgery = Tsurgeon.parseOperation(
"insert (" + tag + " " + word +") >1 root");
return Tsurgeon.processPattern(pat, surgery, tree);
}