为什么在构建依赖关系解析树时,StanfordCoreNlp管道的属性设置很重要?

时间:2016-09-27 23:05:55

标签: stanford-nlp

我一直在玩Stanford-CoreNLP,我发现使用以下代码构建依赖关系解析树

String text = "Are depparse and parse equivalent properties for building dependency parse tree?"
Properties props = new Properties();
props.setProperty("annotators", "tokenize, ssplit, parse, lemma, ner");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
Annotation document = new Annotation(text);
pipeline.annotate(document);
List<CoreMap> sentences = document.get(CoreAnnotations.SentencesAnnotation.class);
for (CoreMap sentence : sentences) {
    SemanticGraph graph = sentence.get(SemanticGraphCoreAnnotations.BasicDependenciesAnnotation.class);
    System.out.println(graph.toString(SemanticGraph.OutputFormat.LIST ));
}

正在输出

root(ROOT-0, tree-11)
cop(tree-11, Are-1)
amod(properties-6, depparse-2)
cc(depparse-2, and-3)
conj(depparse-2, parse-4)
compound(properties-6, equivalent-5)
nsubj(tree-11, properties-6)
case(dependency-9, for-7)
compound(dependency-9, building-8)
nmod(properties-6, dependency-9)
amod(tree-11, parse-10)
punct(tree-11, ?-12)

然而这段代码

String text = "Are depparse and parse equivalent properties for building dependency parse tree?"
Properties props = new Properties();
props.setProperty("annotators", "tokenize, ssplit, lemma, ner, depparse");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
Annotation document = new Annotation(text);
pipeline.annotate(document);
List<CoreMap> sentences = document.get(CoreAnnotations.SentencesAnnotation.class);
for (CoreMap sentence : sentences) {
    SemanticGraph graph = sentence.get(SemanticGraphCoreAnnotations.BasicDependenciesAnnotation.class);
    System.out.println(graph.toString(SemanticGraph.OutputFormat.LIST ));
}

输出

root(ROOT-0, properties-6)
cop(properties-6, Are-1)
compound(properties-6, depparse-2)
cc(depparse-2, and-3)
conj(depparse-2, parse-4)
amod(properties-6, equivalent-5)
case(tree-11, for-7)
amod(tree-11, building-8)
compound(tree-11, dependency-9)
amod(tree-11, parse-10)
nmod(properties-6, tree-11)
punct(properties-6, ?-12)

那么为什么我用这两种方法得不到相同的输出?是否可以将后面的代码更改为等同于第一个代码,因为加载选区解析器也会使解析变得如此之慢?您如何建议设置属性以获得最准确的依赖关系解析树?

1 个答案:

答案 0 :(得分:1)

选区解析器(parse注释器)和依赖解析器(depparse注释器)实际上是完全不同的模型和代码路径。在一种情况下,我们预测一个选区树并将其转换为依赖图。在另一种情况下,我们直接运行依赖解析器。一般来说,depparse预计会更快(O(n)vs O(n ^ 3))并且在生成依赖树时更准确,但不会产生选区树。