我在使用NLTK解析器处理一些俄罗斯经典书籍时遇到了错误。下面的文本不是一个句子:
import nltk
text = "Но ведь вот что при этом, добрейший Родион Романович, наблюдать следует: ведь общего-то случая-с, того самого, на который все юридические формы и правила примерены и с которого они рассчитаны и в книжки записаны, вовсе не существует-с по тому самому, что всякое дело, всякое, хоть, например, преступление, как только оно случится в действительности, тотчас же и обращается в совершенно частный случай-с; да иногда ведь в какой: так-таки ни на что прежнее не похожий-с. Прекомические иногда случаи случаются в этом роде-с. Да оставь я иного-то господина совсем одного: не бери я его и не беспокой, но чтоб знал он каждый час и каждую минуту, или по крайней мере подозревал, что я всё знаю, всю подноготную, и денно и нощно слежу за ним, неусыпно его сторожу, и будь он у меня сознательно под вечным подозрением и страхом, так ведь, ей-богу, закружится, право-с, сам придет да, пожалуй, еще и наделает чего-нибудь, что уже на дважды два походить будет, так сказать, математический вид будет иметь, — оно и приятно-с. Это и с мужиком сиволапым может произойти, а уж с нашим братом, современно умным человеком, да еще в известную сторону развитым, и подавно!"
print(nltk.sent_tokenize(text, language="russian"))
这段文本应该分成几个句子:
Но ведь вот что при этом, добрейший Родион Романович, наблюдать следует: ведь общего-то случая-с, того самого, на который все юридические формы и правила примерены и с которого они рассчитаны и в книжки записаны, вовсе не существует-с по тому самому, что всякое дело, всякое, хоть, например, преступление, как только оно случится в действительности, тотчас же и обращается в совершенно частный случай-с; да иногда ведь в какой: так-таки ни на что прежнее не похожий-с.
Прекомические иногда случаи случаются в этом роде-с.
Да оставь я иного-то господина совсем одного: не бери я его и не беспокой, но чтоб знал он каждый час и каждую минуту, или по крайней мере подозревал, что я всё знаю, всю подноготную, и денно и нощно слежу за ним, неусыпно его сторожу, и будь он у меня сознательно под вечным подозрением и страхом, так ведь, ей-богу, закружится, право-с, сам придет да, пожалуй, еще и наделает чего-нибудь, что уже на дважды два походить будет, так сказать, математический вид будет иметь, — оно и приятно-с.
Это и с мужиком сиволапым может произойти, а уж с нашим братом, современно умным человеком, да еще в известную сторону развитым, и подавно!
6条答案
按热度按时间tjrkku2a1#
使用
print(nltk.sent_tokenize(text))
。4nkexdtk2#
@tropa,这个方法是有效的。但是文档(https://www.nltk.org/api/nltk.tokenize.html#nltk.tokenize.sent_tokenize)提到
sent_tokenize()
具有language
参数,而NLTK支持俄语。我应该使用language="russian"
来处理俄语文本吗?up9lanfz3#
经过调查,我得出结论,这个特定的例子可能不适用于nltk_data中打包的Punkt分词器模型。我对Punkt分词器的实现细节不太了解,只知道它是使用无监督学习方法进行训练的,所以我无法提供一个具体的原因来解释为什么它不起作用。我在许多(承认更简单的)句子上尝试了
sent_tokenize()
和language="russian"
,没有发现问题。有趣的是,俄语模型在
nltk_data/tokenizers/punkt
的README中被排除在外。此外,文档确实说“这种方法已被证明对许多欧洲语言效果很好”。我不确定这是否包括俄语。如果这个问题在很多情况下都很明显,那么NLTK可能需要寻找/训练另一个模型。否则,我建议关闭这个问题。
vd2z7a6w4#
给定的示例确实只生成了一句。
然而,仅使用英文分词器会产生:
这肯定不是理想的。在检查Punkt模型here时,它显示俄罗斯模型是到目前为止最小的,压缩后大小仅为33 KB。第二小的是美国英语,为424 KB,而所有其他模型的大小在500和2000 KB之间。
我不确定俄罗斯模型是否曾经工作得很好。
编辑:低大小是因为
params.collocations
和params.ortho_content
被移除了,因为保留它们对性能更好。参见:nltk/nltk_data#118。x7yiwoj45#
这是一个关于NLTK(自然语言处理工具包)中Punkt分词器的问题。Punkt分词器是NLTK中最常用的分词器之一,它可以对英文和俄文进行分词。在这个问题中,作者发现了Punkt分词器在处理俄文句子时出现了一些问题,即在某些情况下会将句子拆分成多个部分,而不是按照预期的方式进行分词。作者提出了两种解决方案:
с
等短标记。_first_pass_annotation
以仅在破折号后可选地检查缩写标记。然后,俄罗斯模型可以将其设置为false,而其他模型仍然具有旧的功能。这个选项可以存储在 PunktLanguageVars 类中。作者还提到了其他更复杂的解决方案,例如创建一个不应在
-
之后检查的标记集合。此外,作者还不知道俄语句子以-с
结尾的频率如何,因此很难判断这个问题有多大的影响。最后,作者指出Punkt最初并不是为俄语设计的。wko9yo5t6#
据我所知,
-c
后缀在较早的俄语中使用过,但现在已经不再使用了(这与该词组是从经典文本分词中出现的这一事实相一致)。编辑:请参阅一个关于here的俄语Stack Exchange讨论。