CoreNLP 使用IndexedWord的word()和value()方法存在问题,

20jt8wwn  于 5个月前  发布在  其他
关注(0)|答案(3)|浏览(87)

你好,在dkpro的StanfordCoreferenceResolver中,我发现了以下问题:
Stanford CoreNLP(v3.4.1)似乎计划对IndexedWord进行更改:word()和value()都存在,但根据一条评论,应该在某个时候统一。
详情:
StanfordCoreferenceResolver通过以下方式创建折叠依赖关系:
ParserAnnotatorUtils.fillInParseAnnotations(false, true, gsf, sentence, treeCopy);
Dcoref的Document.java使用SemanticGraph的getNodeByWordPattern函数,后者反过来使用w.word()。这似乎没有被fillInParseAnnotations设置。
然而,value()是设置的,所以我在StanfordCoreferenceResolver中添加了以下代码来初步解决问题。
SemanticGraph deps = sentence.get(SemanticGraphCoreAnnotations.CollapsedDependenciesAnnotation.class);
for (IndexedWord vertex : deps.vertexSet()) {
vertex.setWord(vertex.value());
}
问题应该在StanfordCoreNLP中得到解决。

dhxwm5r4

dhxwm5r41#

是的,传统上由于word()和value()的分离,确实存在各种bug,尽管这其中有一些合理的原因。

但是你尝试在v3.5或当前的主分支上重现这个问题了吗?我刚刚根据你上面的代码,在StanfordCoreNLPITest:test()测试中添加了代码:

// check that dependency graph Labels have word()                                                                                               
  SemanticGraph deps = sentence.get(SemanticGraphCoreAnnotations.CollapsedDependenciesAnnotation.class);
  for (IndexedWord vertex : deps.vertexSet()) {
    Assert.assertNotNull(vertex.word());
    Assert.assertEquals(vertex.word(), vertex.value());
  }

这段代码对我来说是可以通过的。所以也许这个问题已经解决了?如果没有,你能提供一个失败的测试用例吗?

(我知道你现在可能有保持不在Java 8上的兼容性原因,但我怀疑现在我们没有精力发布v3.4.2版本,除非发现更多或更严重的问题......)

lrpiutwd

lrpiutwd2#

我已经复制了DKPro Core的斯坦福共指解析器(StanfordCoreferenceResolver)的主线版本中出现的问题,该版本使用了CoreNLP 3.5.0。
在调用MentionExtractor之前,我们使用以下步骤将所需的注解从UIMA CAS表示转换为CoreNLP表示:

  • 转换tokens
  • 使用LabeledScoredTreeFactory和TreeUtils.createStanfordTree转换解析树
  • 转换句子
  • 使用从TreebankLanguagePack获取的GrammaticalStructureFactory从解析树重新生成依赖关系,并使用ParserAnnotatorUtils.fillInParseAnnotations完成转换。

在这个过程中,value()和word()没有被设置为相同的值。我按照Anne的建议添加了代码作为解决方法。
所以我想你是说,当tokens从UIMA转换为CoreNLP时,DKPro Core应该将word()和value()设置为相同的值吗?目前,我们只设置了以下内容:

  • originalText
  • word
  • beginPosition
  • endPosition
  • lemma (可选)
  • tag (可选)
goqiplq2

goqiplq23#

我尝试在DKPro Core中通过调用setValue(token-text)来修复这个问题,当将UIMA token转换为CoreNLP token(实际上是CoreLabel)时。同时移除了Anne建议的修复方法。然而,这种替代修复方法并不起作用。不确定在上述过程中"value"在哪里/为什么丢失。

相关问题