CoreNLP 引用归属:收集引用 gatherQuotes返回一组具有意外索引号的引用,

omqzjyyz  于 6个月前  发布在  其他
关注(0)|答案(2)|浏览(54)

操作系统:Linux Mint 20.1 Ulyssa(基础:Ubuntu 20.04 focal)
Java:openjdk版本 "11.0.9.1"
CoreNLP:4.2.0(还有4.1.0,以及具有提交040b846的dev分支作为HEAD)
命令行:

java -Xmx10g edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner,depparse,coref,quote -file bug1input.txt -outputFormat text

给定附加文件作为输入bug1input.txt,输出结果在以下文件中:bug1output.txt
注意输出文件底部的Extracted Quotes部分。

预期:引用的索引号应从0开始,是连续的整数范围,没有重复。
实际:索引号7没有出现,索引号8被使用了两次,实际上是同一个引用出现了两次。

Extracted quotes:
...
Unknown:	“I don't trust pharmaceuticals. I really don't. And it doesn't sound like it's going to be safe,”	[index=8, charOffsetBegin=2370]
Unknown:	“I don't trust pharmaceuticals. I really don't. And it doesn't sound like it's going to be safe,”	[index=8, charOffsetBegin=2370]
...

我在调用gatherQuotes()存储带属性的引用后发现了这个问题。我的假设是,对于给定文本中的每个引用,引用索引是唯一的,并且每个引用索引只应在返回的集合中出现一次。这个假设正确吗?还是我理解错了?我也在其他情况下看到过这种情况,所以它不仅仅局限于这段文字。命令行执行还生成了以下警告:

WARNING: unmatched quote of type " found at index 1905 in text segment: You’re going to need to get quite large proportions of the population vaccinated before you see a real effect."
About 33.8 million Americans, or 10% o...

[编辑:附加详细信息如下]

关于输入文本的一些观察

输入文本实际上并不包含任何嵌入式引用。然而,它使用简单无向引用和"以及有向引用“”的混合。特别是,有一个以有向开头但以无向结尾的引用:

“You’re going to need to get quite large proportions of the population vaccinated before you see a real effect."

...以及一个以无向开头但以有向结尾的引用:

"I feel like I have plenty of time before I get a chance to get (the vaccine) anyway, to find out if there are bad side effects and whether it’s even worth getting it,”

CoreNLP无法识别这种错误(期望人类做得更好 :-)),因此将文本的大片区域视为一系列实际不是引用的嵌入式引用。

fnatzsnv

fnatzsnv1#

我已经深入研究了这个问题,发现有两个不同的问题。一个与私有方法QuoteAnnotator.setQuoteIndices有关,我将在单独的评论中详细说明,尽管在那里找到解决方案可能是唯一需要的。第二个问题是可以解决的,即使不是问题的确切原因,在QuoteAnnotator.gatherQuotes方法中讨论。
在注解之后,查看上面提到的bug1output.txt文件,嵌入在引用1中的是引用6和8。嵌入在引用6中的是引用8。因此,引用8出现在两个深度级别2和3上。QuoteAnnotator.gatherQuotes将所有引用作为扁平集合返回,因此引用8在集合中出现了两次。
幸运的是,引用8在两个地方都是完全相同的对象,所以一个潜在的解决方案是使用简单的对象身份比较从返回的集合中过滤掉重复项。
然而,还有一个单独的问题是引用8是否应该作为引用6的兄弟出现以及引用6的子级(嵌入在引用6中)?如果这是意料之外的结果,那么问题发生在注解阶段,在这里修复它只会掩盖真正的问题。如果是正常的,那么我建议实现重复过滤器。

2eafrhcq

2eafrhcq2#

经过更多的实验,我发现将 quote.asciiQuotes 设置为 true 可以解决我的问题,至少对于像我处理的这样的输入文本。嵌入式引号在处理的文本中并不常见,所以我对这个设置的副作用预期很少。尽管引用标注器可能存在一个值得解决的健壮性问题,但我将把这个问题留给CoreNLP的维护者来决定。

我要快速指出的是,当我逐步执行 QuoteAnnotator.setQuoteIndices 以获得对原始问题的感觉时,我观察到最终被识别为引用8的对象最初的索引为7,但随后在同一循环的下一次迭代中,该对象的索引又被覆盖为8。我怀疑这是因为那个引号既是Quote 6的兄弟,也是其子节点。

相关问题