哪个分词器更适合与 nltk 一起使用

which tokenizer is better to be used with nltk

我已经开始学习 nltk 并遵循 this 教程。首先,我们使用 sent_tokenize 来使用内置分词器,然后我们使用 PunktSentenceTokenizer。本教程提到 PunktSentenceTokenizer 能够进行无监督机器学习。

那么这是否意味着它比默认的更好?或者各种tokenizers之间比较的标准是什么?

句子和单词通常是手动标记化的。存在各种根据句子上下文处理词的词性标注的语料库。 PunktSentenceTokenizer 当您的数据(句子和单词)需要训练以统一理解单词应如何在上下文中标记时使用。数据科学家可能会为一大堆句子手动注释单词标签,然后告诉机器学习它们(监督学习)。但是,PunktSentenceTokenizer 使用 ML 算法自行学习这些标签(无监督)。您只需选择它训练的数据。

根据您正在处理的数据,sent_tokenize 的结果以及 word_tokenize 的结果可能与 PunktSentenceTokenizer 的结果没有太大区别。分词器之间的选择留给数据科学家,但标准总是与手动注释的标签进行比较(因为它们是最正确的标签)。

查看 sent_tokenize()source code 表明此方法当前使用预训练的 punkt 分词器,因此它等同于 PunktSentenceTokenizer。您是否需要重新训练分词器取决于您使用的文本的性质。如果它不是太奇特的东西,比如报纸文章,那么您可能会发现预训练的分词器就足够了。分词归结为分类任务,因此可以通过对标记数据使用典型指标(如精度、召回率、f 分数等)来比较不同的分词器。

punkt tokenizer 基于以下论文中发表的工作:

http://www.mitpressjournals.org/doi/abs/10.1162/coli.2006.32.4.485#.V2ouLXUrLeQ

从根本上说,它是一种基于启发式的方法,旨在从缩写中消除句子边界的歧义——这是句子标记化的祸根。称其为启发式方法并不意味着贬低。我以前使用过内置的句子分词器,它对我所做的工作很好,当然,我的任务并不真正依赖于准确的句子分词。或者更确切地说,我能够在无关紧要的地方投入足够的数据。

这是一个关于 SO 的问题示例,其中用户发现缺少预训练的分词器,需要训练一个新分词器:

How to tweak the NLTK sentence tokenizer

有问题的文本是 Moby Dick,奇怪的句子结构使分词器出错。您可能需要训练自己的分词器的一些示例是社交媒体(例如推特)或技术文献,其中包含许多预训练分词器未遇到的奇怪缩写。