2.7 停用词移除

停用词移除(Stop word removal)是在不同的NLP应用中最常会用到的预处理步骤之一。该步骤的思路就是想要简单地移除语料库中的在所有文档中都会出现的单词。通常情况下,冠词和代词都会被列为停用词。这些单词在一些NPL任务(如说关于信息的检索和分类的任务)中是毫无意义的,这意味着这些单词通常不会产生很大的歧义。恰恰相反的是,在某些NPL应用中,停用词被移除之后所产生的影响实际上是非常小的。在大多数时候,给定语言的停用词列表都是一份通过人工制定的、跨语料库的、针对最常见单词的停用词列表。虽然大多数语言的停用词列表都可以在相关网站上被找到,但也有一些停用词列表是基于给定语料库来自动生成的。有一种非常简单的方式就是基于相关单词在文档中出现的频率(即该单词在文档中出现的次数)来构建一个停用词列表,出现在这些语料库中的单词都会被当作停用词。经过这样的充分研究,我们就会得到针对某些特定语料库的最佳停用词列表。NLTK库中就内置了涵盖22种语言的停用词列表。

下面就来具体实现一下停用词移除的整个过程,这是一段用NLTK来处理停用词的代码。当然,你也可以像第1章“自然语言处理简介”中那样创建一个字典,然后通过查找的方法来解决这个问题。

>>>from nltk.corpus import stopwords
>>>stoplist = stopwords.words('english') # config the language name
# NLTK supports 22 languages for removing the stop words
>>>text = "This is just a test"
>>>cleanwordlist = [word for word in text.split() if word not in stoplist] 
# apart from just and test others are stopwords
['test']

在上述代码片段中,我们所做的是和第1章“自然语言处理简介”中一样的停用词移除操作,但这里部署的是一个更为简洁的版本。之前,我们是基于查表法来做的。即使在当前情况下,NLTK内部所采用的仍然是一个非常类似的方法。这里建议使用NLTK的停用词列表,因为这是一个更为标准化的列表,相比其他所有的实现都更为健全。而且,我们可以通过向该库的停用词构造器传递一个语言名称参数,来实现针对其他语言的类似方法。

在移除停用词的操作中,背后的数学运算是什么?
在停用词被移除之后,我们就可以执行哪些NLP操作了?