nltk sent_tokenize在俄语中的错误

nfeuvbwi  于 4个月前  发布在  其他
关注(0)|答案(6)|浏览(44)

我在使用NLTK解析器处理一些俄罗斯经典书籍时遇到了错误。下面的文本不是一个句子:

import nltk
text = "Но ведь вот что при этом, добрейший Родион Романович, наблюдать следует: ведь общего-то случая-с, того самого, на который все юридические формы и правила примерены и с которого они рассчитаны и в книжки записаны, вовсе не существует-с по тому самому, что всякое дело, всякое, хоть, например, преступление, как только оно случится в действительности, тотчас же и обращается в совершенно частный случай-с; да иногда ведь в какой: так-таки ни на что прежнее не похожий-с. Прекомические иногда случаи случаются в этом роде-с. Да оставь я иного-то господина совсем одного: не бери я его и не беспокой, но чтоб знал он каждый час и каждую минуту, или по крайней мере подозревал, что я всё знаю, всю подноготную, и денно и нощно слежу за ним, неусыпно его сторожу, и будь он у меня сознательно под вечным подозрением и страхом, так ведь, ей-богу, закружится, право-с, сам придет да, пожалуй, еще и наделает чего-нибудь, что уже на дважды два походить будет, так сказать, математический вид будет иметь, — оно и приятно-с. Это и с мужиком сиволапым может произойти, а уж с нашим братом, современно умным человеком, да еще в известную сторону развитым, и подавно!"
print(nltk.sent_tokenize(text, language="russian"))

这段文本应该分成几个句子:

Но ведь вот что при этом, добрейший Родион Романович, наблюдать следует: ведь общего-то случая-с, того самого, на который все юридические формы и правила примерены и с которого они рассчитаны и в книжки записаны, вовсе не существует-с по тому самому, что всякое дело, всякое, хоть, например, преступление, как только оно случится в действительности, тотчас же и обращается в совершенно частный случай-с; да иногда ведь в какой: так-таки ни на что прежнее не похожий-с. 

Прекомические иногда случаи случаются в этом роде-с. 

Да оставь я иного-то господина совсем одного: не бери я его и не беспокой, но чтоб знал он каждый час и каждую минуту, или по крайней мере подозревал, что я всё знаю, всю подноготную, и денно и нощно слежу за ним, неусыпно его сторожу, и будь он у меня сознательно под вечным подозрением и страхом, так ведь, ей-богу, закружится, право-с, сам придет да, пожалуй, еще и наделает чего-нибудь, что уже на дважды два походить будет, так сказать, математический вид будет иметь, — оно и приятно-с. 

Это и с мужиком сиволапым может произойти, а уж с нашим братом, современно умным человеком, да еще в известную сторону развитым, и подавно!
tjrkku2a

tjrkku2a1#

使用print(nltk.sent_tokenize(text))

4nkexdtk

4nkexdtk2#

@tropa,这个方法是有效的。但是文档(https://www.nltk.org/api/nltk.tokenize.html#nltk.tokenize.sent_tokenize)提到sent_tokenize()具有language参数,而NLTK支持俄语。我应该使用language="russian"来处理俄语文本吗?

up9lanfz

up9lanfz3#

经过调查,我得出结论,这个特定的例子可能不适用于nltk_data中打包的Punkt分词器模型。我对Punkt分词器的实现细节不太了解,只知道它是使用无监督学习方法进行训练的,所以我无法提供一个具体的原因来解释为什么它不起作用。我在许多(承认更简单的)句子上尝试了sent_tokenize()language="russian",没有发现问题。
有趣的是,俄语模型在nltk_data/tokenizers/punkt的README中被排除在外。此外,文档确实说“这种方法已被证明对许多欧洲语言效果很好”。我不确定这是否包括俄语。
如果这个问题在很多情况下都很明显,那么NLTK可能需要寻找/训练另一个模型。否则,我建议关闭这个问题。

vd2z7a6w

vd2z7a6w4#

给定的示例确实只生成了一句。
然而,仅使用英文分词器会产生:

# coding=utf8
import nltk
text = "Но ведь вот что при этом, добрейший Родион Романович, наблюдать следует: ведь общего-то случая-с, того самого, на который все юридические формы и правила примерены и с которого они рассчитаны и в книжки записаны, вовсе не существует-с по тому самому, что всякое дело, всякое, хоть, например, преступление, как только оно случится в действительности, тотчас же и обращается в совершенно частный случай-с; да иногда ведь в какой: так-таки ни на что прежнее не похожий-с. Прекомические иногда случаи случаются в этом роде-с. Да оставь я иного-то господина совсем одного: не бери я его и не беспокой, но чтоб знал он каждый час и каждую минуту, или по крайней мере подозревал, что я всё знаю, всю подноготную, и денно и нощно слежу за ним, неусыпно его сторожу, и будь он у меня сознательно под вечным подозрением и страхом, так ведь, ей-богу, закружится, право-с, сам придет да, пожалуй, еще и наделает чего-нибудь, что уже на дважды два походить будет, так сказать, математический вид будет иметь, — оно и приятно-с. Это и с мужиком сиволапым может произойти, а уж с нашим братом, современно умным человеком, да еще в известную сторону развитым, и подавно!"
for i, sent in enumerate(nltk.sent_tokenize(text), start=1):
    print(i, sent, "\n")

这肯定不是理想的。在检查Punkt模型here时,它显示俄罗斯模型是到目前为止最小的,压缩后大小仅为33 KB。第二小的是美国英语,为424 KB,而所有其他模型的大小在500和2000 KB之间。
我不确定俄罗斯模型是否曾经工作得很好。
编辑:低大小是因为params.collocationsparams.ortho_content被移除了,因为保留它们对性能更好。参见:nltk/nltk_data#118

x7yiwoj4

x7yiwoj45#

这是一个关于NLTK(自然语言处理工具包)中Punkt分词器的问题。Punkt分词器是NLTK中最常用的分词器之一,它可以对英文和俄文进行分词。在这个问题中,作者发现了Punkt分词器在处理俄文句子时出现了一些问题,即在某些情况下会将句子拆分成多个部分,而不是按照预期的方式进行分词。作者提出了两种解决方案:

  1. 从已知的缩写标记集合中删除 с 等短标记。
  2. 修改 _first_pass_annotation 以仅在破折号后可选地检查缩写标记。然后,俄罗斯模型可以将其设置为false,而其他模型仍然具有旧的功能。这个选项可以存储在 PunktLanguageVars 类中。

作者还提到了其他更复杂的解决方案,例如创建一个不应在 - 之后检查的标记集合。此外,作者还不知道俄语句子以 结尾的频率如何,因此很难判断这个问题有多大的影响。最后,作者指出Punkt最初并不是为俄语设计的。

wko9yo5t

wko9yo5t6#

据我所知,-c后缀在较早的俄语中使用过,但现在已经不再使用了(这与该词组是从经典文本分词中出现的这一事实相一致)。
编辑:请参阅一个关于here的俄语Stack Exchange讨论。

相关问题