我试图解决一些Tree对象,需要连接""""占有(POS)节点到它们各自的名词(NN)。
我目前希望tsurgeon工具能够做到这一点,而且他们确实似乎已经完成了这项工作。但是,我的错误是奇怪的,没有效率。
我会尝试使用应用程序和输出的上下文尽可能地设置它,已经编写了一个小的测试程序来弄清楚这个用例,但我甚至害怕这有点大而复杂,请原谅我的设置。
List<CoreMap> sentences = annotation.get(CoreAnnotations.SentencesAnnotation.class);
//Pattern: http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/trees/tregex/TregexPattern.html
TregexPattern adjoinPOS = TregexPattern.compile("POS=pos , NN=noun");
TsurgeonPattern tsurgeon = Tsurgeon.parseOperation("adjoin pos@ noun");
for( CoreMap sentence : sentences ) {
Tree tree = sentence.get(TreeCoreAnnotations.TreeAnnotation.class);
tree = Tsurgeon.processPattern(adjoinPOS, tsurgeon, tree);
tree.pennPrint();
}
不幸的是,这没有什么效果,而是在stanford nlp中得到一个空指针异常:
Exception in thread "main" java.lang.NullPointerException at edu.stanford.nlp.trees.tregex.tsurgeon.AdjoinNode$Matcher.evaluate(AdjoinNode.java:49) at edu.stanford.nlp.trees.tregex.tsurgeon.TsurgeonPatternRoot$Matcher.evaluate(TsurgeonPatternRoot.java:63) at edu.stanford.nlp.trees.tregex.tsurgeon.Tsurgeon.processPattern(Tsurgeon.java:579)
at my.code.line of the processPattern call (yeah, I cleaned this up a little for brevity)
我们假设句子树是:
(ROOT(SBARQ(WHNP(WP What))(SQ(VBZ is)(NP(NP(NP(DT))(NN) 炮弹)(POS&#39; s))(NN最大值)(NN高度))(PP(IN))(NP (NN航班)))))(。?)))
任何人都可以给我任何关于如何使用树外科医生编辑这棵树的指示吗?
答案 0 :(得分:0)
在这种情况下,您不想使用 adjoin ,因为 adjoin 用于组合PTB格式的子树和另一棵树的节点。
我认为你想做的事情是这样的:
Tree t = Tree.valueOf("(ROOT (SBARQ (WHNP (WP What)) (SQ (VBZ is) (NP (NP (NP (DT the) (NN cannonball) (POS 's)) (NN maximum) (NN altitude)) (PP (IN during) (NP (NN flight))))) (. ?)))");
//Pattern: http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/trees/tregex/TregexPattern.html
TregexPattern adjoinPOS = TregexPattern.compile("(POS=postag < __=pos ) $- NN=noun");
TsurgeonPattern tsurgeon = Tsurgeon.parseOperation("[move pos >-1 noun] [delete postag]");
Tsurgeon.processPattern(adjoinPOS, tsurgeon, t);
这将移动 cannonball 旁边的clite (NN将有两个孩子)并删除POS节点。