我正在使用Stadford Core NLP库(使用java)来获取解析的词汇树(包括短语结构和依赖)。
TL; DR; : Head-finder(可能)不能在StanfordCoreNlp输出解析树中正确处理二进制化的人工节点(@XX),也找不到输出根的头字。
血腥的细节:
我正在使用StanfordCoreNlp,然后阅读注释,以便找到选区,情感,依赖等等。我初始化管道并按如下方式使用它:
Properties props = new Properties();
props.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse, depparse, sentiment");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
我解析一个文本并遍历其中的句子以找到头部:
public processText(text) {
HeadFinder hf = new CollinHeadFinder(); // or one of descendants
Annotation annotation = pipeline.process(myText);
for (CoreMap sentence : annotation.get(CoreAnnotations.SentencesAnnotation.class)) {
Tree tree = sentence.get(SentimentCoreAnnotations.SentimentAnnotatedTree.class);
determineHeads(tree, null, hf)
}
}
private determineHeads(Tree node, Tree parent, HeadFinder hf) {
Tree head = node.headTerminal(headFinder, parent);
// do something with head
for(Tree child : node.children()) {
dfs(child, node, headFinder);
}
}
作为问题的前言,重要的是要考虑到管道返回的解析树是二值化的,将具有两个以上女儿的节点分成子树链,添加仅具有二进制推导的人工节点(参见图1)。另外,省略“冗余”节点(例如 ROOT 下的 S ,见图2)。
图片1:树二值化
图片2:固定树ROOT
现在回答问题:
tree.headTerminal(...)
)会产生预期的结果(我将头部单词添加为红色)。我的导师和我介绍了代码,它似乎没有很好地处理@CX。在AbstractCollinsHeadFinder.determineNonTrivialHead中,只有母亲有“@”,我认为如果出于某种原因进行递归调用,它应该是正常的,似乎不会产生预期的结果。java.lang.IllegalArgumentException'异常。没有使用类edu.stanford.nlp.trees.CollinsHeadFinder(ROOT)为ROOT定义的头规则 (NP(DT) (@NP(JJ快) (@NP(JJ brown)(NN狐狸)))) (@S (副总裁(VBD跳跃) (PP(IN) (NP(DT) (@NP(JJ胖) (@NP(JJ懒)(NN狗)))))) (。))))
我做错了吗?这些是否按预期工作?任何想法如何获得根的头?