spaCy 依赖句分词器在不同语言之间处理换行符的方式不一致,

gdrx4gfi  于 2个月前  发布在  其他
关注(0)|答案(3)|浏览(29)

如何重现行为

当解析包含换行符的句子时,意大利语解析器有时会将换行符分配给一个单独的句子,例如:

Ma regolamenta solo un settore, a differenza dell’azione a largo raggio dell’Inflation Act.
I tentativi di legiferare per stimolare l’industria non hanno avuto molto successo.

产生3个句子:

There are various experiments with different combinations of punctuation in the notebook.
Looking at the tokens and their is_sent_start property, it seems under some circumstances the \n and I tokens are both assigned as the start of a new sentence.
I have not been able to cause this problem with en_core_web_sm , which always correctly identifies 2 sentences.
Although I understand that基于依赖解析器的句子分割是概率性的,并不总是正确,但在这里似乎存在一些语言之间的不一致性,我认为对于空白标记被分配为句子的开始永远不会是正确的。

你的环境

  • spaCy版本: 3.6.1
  • 平台: Linux-5.15.120+-x86_64-with-glibc2.35
  • Python版本: 3.10.12
  • 管道: it_core_news_sm (3.6.0), en_core_web_sm (3.6.0)
gopyfrb3

gopyfrb31#

感谢你报告这个问题!
虽然我理解基于依赖解析的句子分割是概率性的,并不总是正确,但这里似乎存在一些语言之间的不一致性。你能详细说明一下这些不一致性吗?
我认为空白标记永远不会被分配为句子的开始。
虽然这是一个合理的解释,但请记住,spaCy的预训练模型(如it_core_news_xx)是在自然语言语料库上训练的。\n是一个control character,而不是出现在自然(意大利或其他)文本中的内容,因此在这里训练的模型性能可能不会很好。
我建议你从你的文本中删除这样的字符,或者使用sentencizer component(如果需要的话,根据你的使用情况进行调整)。

x759pob2

x759pob22#

你能详细解释一下语言之间的不一致性吗?
我认为这种行为在意大利语中比其他语言更常见。除了笔记本中的例子,英语似乎能够识别出2个句子,而意大利语能识别出3个,我还在处理一个部分平行语料库,意大利语的平均句子/文档数明显高于任何其他语言(21 vs 14-16),这让我认为这是一个意大利语特有的问题。
我建议从你的文本中删除这些字符,或者使用 sentencizer component (并根据需要调整它)。
我原本希望使用解析器方法,因为文档中的标点符号并不理想,但我尝试了添加 \n 到 chars 列表中的 sentencizer,实际上效果还不错。这也缩小了意大利语与其他语言的句子/文档差距(现在是19 vs 15-16),所以我认为这进一步表明依赖句法分析器之间存在一些行为差异。

iyfjxgzm

iyfjxgzm3#

这可能是空白增强出现问题,它只应该将空白附加到前一个标记上,而不是创建新的句子。我们稍后可能会对此进行研究。
我们正在使用这个增强与语料库一起使用-请随时查看并/或使用修改后的设置训练自己的模型:

[corpora.train.augmenter]
@augmenters = "spacy.combined_augmenter.v1"
lower_level = 0.1
whitespace_level = 0.1
whitespace_per_token = 0.05
whitespace_variants = "[\" \",\"\\t\",\"\\n\",\"\\u000b\",\"\\f\",\"\\r\",\"\\u001c\",\"\\u001d\",\"\\u001e\",\"\\u001f\",\" \",\"\\u0085\",\"\\u00a0\",\"\\u1680\",\"\\u2000\",\"\\u2001\",\"\\u2002\",\"\\u2003\",\"\\u2004\",\"\\u2005\",\"\\u2006\",\"\\u2007\",\"\\u2008\",\"\\u2009\",\"\\u200a\",\"\\u2028\",\"\\u2029\",\"\\u202f\",\"\\u205f\",\"\\u3000\"]"
orth_level = 0.0
orth_variants = null

相关问题