如何获得与在线演示完全一样的依赖解析输出?
How to get dependency parse output exactly as online demo?
如何使用 stanford corenlp 以编程方式获得与在线演示中相同的依赖项解析?
我正在使用 corenlp 包获取以下句子的依赖解析。
当局称,得克萨斯州第二名医护人员埃博拉检测呈阳性。
我尝试使用下面的代码以编程方式获取解析
Properties props = new Properties();
props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
String text = "Second healthcare worker in Texas tests positive for Ebola , authorities say ."; // Add your text here!
Annotation document = new Annotation(text);
pipeline.annotate(document);
String[] myStringArray = {"SentencesAnnotation"};
List<CoreMap> sentences = document.get(SentencesAnnotation.class);
for(CoreMap sentence: sentences) {
SemanticGraph dependencies = sentence.get(BasicDependenciesAnnotation.class);
IndexedWord root = dependencies.getFirstRoot();
System.out.printf("root(ROOT-0, %s-%d)%n", root.word(), root.index());
for (SemanticGraphEdge e : dependencies.edgeIterable()) {
System.out.printf ("%s(%s-%d, %s-%d)%n", e.getRelation().toString(), e.getGovernor().word(), e.getGovernor().index(), e.getDependent().word(), e.getDependent().index());
}
}
}
我使用 stanford corenlp 3.5.0 包得到以下输出。
root(ROOT-0, worker-3)
amod(worker-3, Second-1)
nn(worker-3, healthcare-2)
prep(worker-3, in-4)
amod(worker-3, positive-7)
dep(worker-3, say-12)
pobj(in-4, tests-6)
nn(tests-6, Texas-5)
prep(positive-7, for-8)
pobj(for-8, ebola-9)
nsubj(say-12, authorities-11)
但是在线演示给出了不同的答案,将 say 标记为根,并且在解析中的单词之间具有其他关系,例如 ccomp。
amod(worker-3, Second-1)
nn(worker-3, healthcare-2)
nsubj(tests-6, worker-3)
prep(worker-3, in-4)
pobj(in-4, Texas-5)
ccomp(say-12, tests-6)
acomp(tests-6, positive-7)
prep(positive-7, for-8)
pobj(for-8, Ebola-9)
nsubj(say-12, authorities-11)
root(ROOT-0, say-12)
如何解析我的输出以匹配在线演示?
不同输出的原因是,如果您使用 parser demo,则使用的是独立解析器分布,而您的代码使用整个 CoreNLP 分布。虽然它们都使用相同的解析器和相同的模型,但 CoreNLP 的默认配置在 运行 解析器之前运行词性 (POS) 标记器,并且解析器合并了可能导致不同结果的 POS 信息在某些情况下。
为了获得相同的结果,您可以通过更改注释器列表来禁用词性标注器:
props.put("annotators", "tokenize, ssplit, parse, lemma, ner, dcoref");
但是请注意,lemma、ner 和 dcoref 注释器都需要 POS 标记,因此您必须更改注释器的顺序。
还有一个 CoreNLP demo 应该始终产生与您的代码相同的输出。
如何使用 stanford corenlp 以编程方式获得与在线演示中相同的依赖项解析?
我正在使用 corenlp 包获取以下句子的依赖解析。
当局称,得克萨斯州第二名医护人员埃博拉检测呈阳性。
我尝试使用下面的代码以编程方式获取解析
Properties props = new Properties();
props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
String text = "Second healthcare worker in Texas tests positive for Ebola , authorities say ."; // Add your text here!
Annotation document = new Annotation(text);
pipeline.annotate(document);
String[] myStringArray = {"SentencesAnnotation"};
List<CoreMap> sentences = document.get(SentencesAnnotation.class);
for(CoreMap sentence: sentences) {
SemanticGraph dependencies = sentence.get(BasicDependenciesAnnotation.class);
IndexedWord root = dependencies.getFirstRoot();
System.out.printf("root(ROOT-0, %s-%d)%n", root.word(), root.index());
for (SemanticGraphEdge e : dependencies.edgeIterable()) {
System.out.printf ("%s(%s-%d, %s-%d)%n", e.getRelation().toString(), e.getGovernor().word(), e.getGovernor().index(), e.getDependent().word(), e.getDependent().index());
}
}
}
我使用 stanford corenlp 3.5.0 包得到以下输出。
root(ROOT-0, worker-3)
amod(worker-3, Second-1)
nn(worker-3, healthcare-2)
prep(worker-3, in-4)
amod(worker-3, positive-7)
dep(worker-3, say-12)
pobj(in-4, tests-6)
nn(tests-6, Texas-5)
prep(positive-7, for-8)
pobj(for-8, ebola-9)
nsubj(say-12, authorities-11)
但是在线演示给出了不同的答案,将 say 标记为根,并且在解析中的单词之间具有其他关系,例如 ccomp。
amod(worker-3, Second-1)
nn(worker-3, healthcare-2)
nsubj(tests-6, worker-3)
prep(worker-3, in-4)
pobj(in-4, Texas-5)
ccomp(say-12, tests-6)
acomp(tests-6, positive-7)
prep(positive-7, for-8)
pobj(for-8, Ebola-9)
nsubj(say-12, authorities-11)
root(ROOT-0, say-12)
如何解析我的输出以匹配在线演示?
不同输出的原因是,如果您使用 parser demo,则使用的是独立解析器分布,而您的代码使用整个 CoreNLP 分布。虽然它们都使用相同的解析器和相同的模型,但 CoreNLP 的默认配置在 运行 解析器之前运行词性 (POS) 标记器,并且解析器合并了可能导致不同结果的 POS 信息在某些情况下。
为了获得相同的结果,您可以通过更改注释器列表来禁用词性标注器:
props.put("annotators", "tokenize, ssplit, parse, lemma, ner, dcoref");
但是请注意,lemma、ner 和 dcoref 注释器都需要 POS 标记,因此您必须更改注释器的顺序。
还有一个 CoreNLP demo 应该始终产生与您的代码相同的输出。