将子节点添加到斯坦福树

时间:2014-05-08 23:10:35

标签: java tree stanford-nlp

我正在尝试向stanford解析tree添加一个新节点,尽管我目前尝试的不起作用:

所以我使用TregexMatcher并返回一棵树,如:

(VP 
    (VB run) 
    (PP 
        (To to) 
        (NP 
            (DT the) 
            (NN shop) 
        ) 
    )
)

我试图插入(V​​BD确实)成为(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)
        )
    )
)

1 个答案:

答案 0 :(得分:2)

错误在于使用SimpleTreeSimpleTree只是一个没有节点标签的树结构,所以没有多大用处。我在文档中添加了一条说明。使用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);
}