📜  训练分词器和过滤停用词

📅  最后修改于: 2020-10-14 09:10:14             🧑  作者: Mango


为什么要训练自己的句子标记器?

这是一个非常重要的问题,如果我们拥有NLTK的默认句子标记器,那么为什么我们需要训练一个句子标记器?这个问题的答案在于NLTK的默认句子标记器的质量。 NLTK的默认令牌生成器基本上是通用令牌生成器。尽管效果很好,但对于非标准文本而言可能不是一个不错的选择,但对于我们的文本或具有独特格式的文本而言,它可能不是一个好选择。为了对此类文本进行标记并获得最佳结果,我们应该训练自己的句子标记器。

实施实例

对于此示例,我们将使用网络文本语料库。我们将从该语料库中使用的文本文件的文本格式设置为如下所示的对话框:

Guy: How old are you?
Hipster girl: You know, I never answer that question. Because to me, it's about
how mature you are, you know? I mean, a fourteen year old could be more mature
than a twenty-five year old, right? I'm sorry, I just never answer that question.
Guy: But, uh, you're older than eighteen, right?
Hipster girl: Oh, yeah.

我们已使用名称training_tokenizer保存了此文本文件。 NLTK提供了一个名为PunktSentenceTokenizer的类,借助它我们可以在原始文本上进行训练以生成自定义句子标记器。我们可以通过读取文件或使用raw()方法从NLTK语料库中获取原始文本。

让我们看下面的例子,以更深入地了解它-

首先,从nltk.tokenize包中导入PunktSentenceTokenizer类-

from nltk.tokenize import PunktSentenceTokenizer

现在,从nltk.corpus包中导入Webtext语料库

from nltk.corpus import webtext

接下来,通过使用raw()方法,从training_tokenizer.txt文件中获取原始文本,如下所示:

text = webtext.raw('C://Users/Leekha/training_tokenizer.txt')

现在,创建一个PunktSentenceTokenizer的实例,并从文本文件中打印标记化语句,如下所示:

sent_tokenizer = PunktSentenceTokenizer(text)
sents_1 = sent_tokenizer.tokenize(text)
print(sents_1[0])

输出

White guy: So, do you have any plans for this evening?
print(sents_1[1])
Output:
Asian girl: Yeah, being angry!
print(sents_1[670])
Output:
Guy: A hundred bucks?
print(sents_1[675])
Output:
Girl: But you already have a Big Mac...

完整的实施示例

from nltk.tokenize import PunktSentenceTokenizer
from nltk.corpus import webtext
text = webtext.raw('C://Users/Leekha/training_tokenizer.txt')
sent_tokenizer = PunktSentenceTokenizer(text)
sents_1 = sent_tokenizer.tokenize(text)
print(sents_1[0])

输出

White guy: So, do you have any plans for this evening?

要了解NLTK的默认句子标记器与我们自己训练有素的句子标记器之间的区别,让我们使用默认句子标记器(即send_tokenize())标记相同的文件。

from nltk.tokenize import sent_tokenize
   from nltk.corpus import webtext
   text = webtext.raw('C://Users/Leekha/training_tokenizer.txt')
sents_2 = sent_tokenize(text)

print(sents_2[0])
Output:

White guy: So, do you have any plans for this evening?
print(sents_2[675])
Output:
Hobo: Y'know what I'd do if I was rich?

借助输出中的差异,我们可以理解这样的概念,即为什么训练我们自己的句子标记器很有用。

什么是停用词?

文本中存在但对句子的含义没有帮助的一些常用词。这样的词对于信息检索或自然语言处理的目的一点都不重要。最常见的停用词是“ the”和“ a”。

NLTK停用词语料库

实际上,自然语言工具套件附带一个停用词语料库,其中包含多种语言的单词列表。让我们借助以下示例了解其用法-

首先,从nltk.corpus包中导入停用copus-

from nltk.corpus import stopwords

现在,我们将使用英语中的停用词

english_stops = set(stopwords.words('english'))
words = ['I', 'am', 'a', 'writer']
[word for word in words if word not in english_stops]

输出

['I', 'writer']

完整的实施示例

from nltk.corpus import stopwords
english_stops = set(stopwords.words('english'))
words = ['I', 'am', 'a', 'writer']
[word for word in words if word not in english_stops]

输出

['I', 'writer']

查找支持的语言的完整列表

借助以下Python脚本,我们还可以找到NLTK停用词语料库支持的语言的完整列表-

from nltk.corpus import stopwords
stopwords.fileids()

输出

[
   'arabic', 'azerbaijani', 'danish', 'dutch', 'english', 'finnish', 'french',
   'german', 'greek', 'hungarian', 'indonesian', 'italian', 'kazakh', 'nepali',
   'norwegian', 'portuguese', 'romanian', 'russian', 'slovene', 'spanish',
   'swedish', 'tajik', 'turkish'
]