寻找头 - 标准与二叉树

时间:2016-05-27 14:51:59

标签: java nlp stanford-nlp

我正在使用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:树二值化

Standard Binzarized Tree

图片2:固定树ROOT

Fixed Tree ROOT

现在回答问题:

  1. 处理二进制树时,寻找者似乎出现了问题。看起来,如果其中一个女儿是人造节点,则处理不当会导致选择错误的头部。例如,考虑左分支中的第一个@NP节点选择“快速”而不是选择名词“狐狸”。相比之下,您可以看到在标准(非二值化)解析子树上使用相同的机制(tree.headTerminal(...))会产生预期的结果(我将头部单词添加为红色)。我的导师和我介绍了代码,它似乎没有很好地处理@CX。在AbstractCollinsHeadFinder.determineNonTrivialHead中,只有母亲有“@”,我认为如果出于某种原因进行递归调用,它应该是正常的,似乎不会产生预期的结果。
  2. Head Terminal in Standard vs. Binarized

    1. 在管道返回的Tree中,我无法使用head-finder。我可以前往的最后一个节点是NP和VP,并且root上的函数调用给我一个错误:
    2.   

      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狗))))))       (。))))

      我做错了吗?这些是否按预期工作?任何想法如何获得根的头?

0 个答案:

没有答案