Python nltk使用自定义缩写进行不正确的句子标记化

Python nltk使用自定义缩写进行不正确的句子标记化,python,nlp,nltk,tokenize,Python,Nlp,Nltk,Tokenize,我正在使用图书馆来拆分英语句子。 许多句子包含缩写,例如例如或例如,因此我用这些自定义缩写更新了标记器。 我发现一个句子有一种奇怪的标记化行为: 导入nltk nltk.下载(“punkt”) 句子_tokenizer=nltk.data.load(“tokenizers/punkt/english.pickle”) 额外缩写=['e.g','eg'] 句子标记器。参数。缩写类型。更新(额外缩写) 行='客户机框架(如React、Vue.js)和测试(如Karma、磁带)所需经验' 对于句子中的

我正在使用图书馆来拆分英语句子。 许多句子包含缩写,例如
例如
例如
,因此我用这些自定义缩写更新了标记器。
我发现一个句子有一种奇怪的标记化行为:

导入nltk
nltk.下载(“punkt”)
句子_tokenizer=nltk.data.load(“tokenizers/punkt/english.pickle”)
额外缩写=['e.g','eg']
句子标记器。参数。缩写类型。更新(额外缩写)
行='客户机框架(如React、Vue.js)和测试(如Karma、磁带)所需经验'
对于句子中的s_tokenizer.tokenize(第行):
印刷品
#输出
#客户机框架(如React、Vue.js)和测试(如。
#业力(磁带)
因此,正如您所看到的,标记器不会在第一个缩写上拆分(正确),但在第二个缩写上拆分(不正确)

奇怪的是,如果我在其他任何地方更改了单词
Karma
,它就会正常工作

导入nltk
nltk.下载(“punkt”)
句子_tokenizer=nltk.data.load(“tokenizers/punkt/english.pickle”)
额外缩写=['e.g','eg']
句子标记器。参数。缩写类型。更新(额外缩写)
行='客户机框架(如React、Vue.js)和测试(如SomethingElse、Tape)所需的经验'
对于句子中的s_tokenizer.tokenize(第行):
印刷品
#输出
#具备客户机框架(如React、Vue.js)和测试(如SomethingElse、磁带)方面的经验

有什么线索可以解释为什么会发生这种情况吗?

你可以看到为什么punkt会使用这种方法来进行中断选择

>>用于句子中的d\u标记器。调试\u决策(第行):
...     打印(nltk.tokenize.punkt.format\u debug\u decision(d))
... 
文本:'(例如,React'(在偏移量47处)
断句?无(默认判决)
搭配?错
“例如:
已知缩写:True
是首字母:False
“反应”:
已知句子起始语:False
正字法启发式提示是句子的起点吗?未知
训练中的正交上下文:{'MID-UC','MID-LC'}
文本:‘(例如,业力’(偏移量80处)
断句?正确(缩写+正字法)
搭配?错
“例如:
已知缩写:True
是首字母:False
“因果报应”:
已知句子起始语:False
正字法启发法表明是句子的起始语吗?是的
训练中的正交上下文:{'MID-LC'}

这句话告诉我们,在训练语料库中,“反应”和“反应”都出现在句子的中间,所以它不会在你的句子中“反应”之前发生。然而,只有小写形式的“因果报应”发生,所以它认为这是一个可能的句子起始点。 注意,这与库的文档一致:

然而,Punkt被设计成在无监督的情况下从类似于目标域的语料库中学习参数(缩写列表等)。因此,预包装的模型可能不合适:使用
PunktSentenceTokenizer(text)
从给定文本中学习参数

PunktTrainer
从部分文本中学习参数,如缩写列表(无需监督)。使用
PunktTrainer
可直接进行增量培训和修改超参数,用于确定什么是缩写等

因此,虽然针对这一特殊情况的快速破解方法是调整私有参数,但进一步说“业力”也可能出现在句子中间:

>>> sentence_tokenizer._params.ortho_context['karma'] |= nltk.tokenize.punkt._ORTHO_MID_UC
>>> sentence_tokenizer.tokenize(line)
['Required experience with client frameworks (e.g. React, Vue.js) and testing (e.g. Karma, Tape)']
相反,您可能应该从CVs中添加额外的培训数据,包括所有这些库名称:

from nltk.tokenize.punkt import PunktSentenceTokenizer, PunktTrainer
trainer = PunktTrainer()
# tweak trainer params here if helpful
trainer.train(my_corpus_of_concatted_tech_cvs)
sentence_tokenizer = PunktSentenceTokenizer(trainer.get_params())

谢谢你的回答,非常有用。不幸的是,这只是一个例子,有许多句子有相同的问题。有没有办法建议忽略启发式(大写标记)如果上一个标记是缩写?@revy已编辑以澄清我使用您自己的培训数据的意思。我很欣赏如何培训标记器的示例。我在文档中没有找到。