停用词的过滤
在自然语言处理中,我们通常把停用词、出现频率很低的词汇过滤掉。这个过程其实类似于特征筛选的过程。当然停用词过滤,是文本分析中一个预处理方法。它的功能是过滤分词结果中的噪声。比如:的、是、啊等。在英文里,我们经常会遇到比如“the”,“an”,“their”等这些都可以作为停用词来处理,但是也考虑自己的应用场景。当然如果出现一种出现频率特别低的词汇对分析作用不大,所以一般般也会去掉。把停用词、出现频率低的词过滤之后,即可以得到一个我们的词典库。以下我们用python实现停用词过滤的实现:
from collections import Counter
import jieba
# jieba.load_userdict('userdict.txt')
# 创建停用词list
def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'r').readlines()]
return stopwords
# 对句子进行分词
def seg_sentence(sentence):
sentence_seged = jieba.cut(sentence.strip())
stopwords = stopwordslist('filename') # 这里加载停用词的路径
outstr = ''
for word in sentence_seged:
if word not in stopwords:
if word != '\t':
outstr += word
outstr += " "
return outstr
inputs = open('filename', 'r') #加载要处理的文件的路径
outputs = open('filename', 'w') #加载处理后的文件路径
for line in inputs:
line_seg = seg_sentence(line) # 这里的返回值是字符串
outputs.write(line_seg)
outputs.close()
inputs.close()
# WordCount
with open('filename', 'r') as fr: #读入已经去除停用词的文件
data = jieba.cut(fr.read())
data = dict(Counter(data))
with open('filename', 'w') as fw: #读入存储wordcount的文件路径
for k,v in data.items():
fw.write('%s,%d\n' % (k, v))
这里是处理之前的文件:
处理前文件
经过去停用词后所得到的文件:
处理后文件
最后所得到的wordcount文件,格式是(词,出现的频数):
停顿词次数
词汇的正则化
词干提取(Stemming)和词形还原(Lemmatization)
词形还原Lemmatization),是把一个任何形式的语言词汇还原为一般形式(能表达完整语义),而词干提取(Stemming)是抽取词的词干或词根形式(不一定能够表达完整语义)。词形还原和词干提取是词形规范化的两类重要方式,都能够达到有效归并词形的目的,二者既有联系也有区别。
首先让我们看一下联系:
1、目标一致。词干提取和词形还原的目标均为将词的屈折形态或派生形态简化或归并为词干(stem)或原形的基础形式,都是一种对词的不同形态的统一归并的过程。
2、结果部分交叉。词干提取和词形还原不是互斥关系,其结果是有部分交叉的。一部分词利用这两类方法都能达到相同的词形转换效果。如“dogs”的词干为“dog”,其原形也为“dog”。
3、主流实现方法类似。目前实现词干提取和词形还原的主流实现方法均是利用语言中存在的规则或利用词典映射提取词干或获得词的原形。
4、应用领域相似。主要应用于信息检索和文本、自然语言处理等方面,二者均是这些应用的基本步骤。
接下来我们看看区别:
a、在原理上,词干提取主要是采用“缩减”的方法,将词转换为词干,如将“cats”处理为“cat”,将“effective”处理为“effect”。而词形还原主要采用“转变”的方法,将词转变为其原形,如将“drove”处理为“drive”,将“driving”处理为“drive”。
b、在复杂性上,词干提取方法相对简单,词形还原则需要返回词的原形,需要对词形进行分析,不仅要进行词缀的转化,还要进行词性识别,区分相同词形但原形不同的词的差别。词性标注的准确率也直接影响词形还原的准确率,因此,词形还原更为复杂。
c、在实现方法上,虽然词干提取和词形还原实现的主流方法类似,但二者在具体实现上各有侧重。词干提取的实现方法主要利用规则变化进行词缀的去除和缩减,从而达到词的简化效果。词形还原则相对较复杂,有复杂的形态变化,单纯依据规则无法很好地完成。其更依赖于词典,进行词形变化和原形的映射,生成词典中的有效词。
d、在结果上,词干提取和词形还原也有部分区别。词干提取的结果可能并不是完整的、具有意义的词,而只是词的一部分,如“revival”词干提取的结果为“reviv”,“ailiner”词干提取的结果为“airlin”。而经词形还原处理后获得的结果是具有一定意义的、完整的词,一般为词典中的有效词。
e、在应用领域上,同样各有侧重。虽然二者均被应用于信息检索和文本处理中,但侧重不同。词干提取更多被应用于信息检索领域,如Solr、Lucene等,用于扩展检索,粒度较粗。词形还原更主要被应用于文本挖掘、自然语言处理,用于更细粒度、更为准确的文本分析和表达。
接下来我们用python分别实现stemming、lemmatization。不过在实现之前我们应该首先装nltk库。
首先用win+R快捷键打开cmd终端,并在cmd终端中输入如下命令,为了节约时间我们可以用豆瓣的下载源。
首先用win+R快捷键打开cmd终端,并在cmd终端中输入如下命令,为了节约时间我们可以用豆瓣的下载源。
pip install nltk --upgrade pip -i /simple
如图所示:
安装NLTK库
接下来在CMD中输入python,进入python解析器,具体操作如下:
python
import nltk
nltk.download()
进入python环境
输入命令
成功执行后,将弹出如下窗口
NLTK库需要安装的子库
在这里可以浏览和安装NLTK库中所有的可用软件包,选中all,然后单击download即可一键安装,当然,也可以挑选自己需要的包,在All Packages里更是可以高度自定义,在这里我们挑选book包进行安装。当然很有可能因为网速原因会下载不下来,我们只需要将离线包(提取码:2gex)下载到本地,并且在C:\Users\Administrator\AppData\Roaming路径下创建一个nltk_data文件夹,将离线的文件解压后放入该目录即可使用。具体过程如下图所示:
nltk离线包
nltk库安装路径
这里需要注意的是我们的安装包的位置和名字一定是上面提到的,不可改变。这些做完了,我们就nltk安装基本完成了,最后在检查一遍nltk是否安装成功。通过在CMD终端输入python进入解释器后,输入以下命令:
from nltk.book import *
如果操作无误,将显示如下信息:
nltk库安装成功示意图
事已至此我们的nltk已经安装完成,可以直接使用。然后,接下来我们用python3.7的nltk库来实现Stemming和Lemmatization。
1、首先用python3.7实现Stemming,具体代码如下:
from nltk.stem.porter import PorterStemmer
from nltk.stem.lancaster import LancasterStemmer
from nltk.stem.snowball import SnowballStemmer
input_text=['writing','calves','be','brand','horse','randomize',
'possibly','provision','hospital','kept','scratchy','code']
porter =PorterStemmer()
lancaster = LancasterStemmer()
snowball= SnowballStemmer('english')
stemmer_names= ['PORTER','LANCASTER','SNOWBALL']
formatted_text = '{:>16}'*(len(stemmer_names)+1)
print('\n',formatted_text.format('INPUT WORD',*stemmer_names),'\n','='*68)
for word in input_text:
output = [word,porter.stem(word),lancaster.stem(word),snowball.stem(word)]
print(formatted_text.format(*output))
输出结果如下:
Stemming输出结果图
2、接下来我们实现Lemmatization,具体代码如下:
from nltk import word_tokenize, pos_tag
from nltk.corpus import wordnet
from nltk.stem import WordNetLemmatizer
def get_wordnet_pos(tag):
if tag.startswith('J'):
return wordnet.ADJ
elif tag.startswith('V'):
return wordnet.VERB
elif tag.startswith('N'):
return wordnet.NOUN
elif tag.startswith('R'):
return wordnet.ADV
else:
return None
sentence = 'football is a family of team sports that involve, to varying degrees, kicking a ball to score a goal.'
tokens = word_tokenize(sentence)
tagged_sent = pos_tag(tokens)
wnl = WordNetLemmatizer()
lemmas_sent = []
for tag in tagged_sent:
wordnet_pos = get_wordnet_pos(tag[1]) or wordnet.NOUN
lemmas_sent.append(wnl.lemmatize(tag[0], pos=wordnet_pos))
print(lemmas_sent)
实现结果如下:
Lemmatization实现结果如下
总结
我们在本文介绍了文本处理流程中的停用词的过滤、正则化操作,从停用词的概念入手到最后的python实现其停用词的过滤。紧接着我们有介绍了两种词汇的正则化操作,即词形还原和还原词汇,也是介绍了其概念以及相关的区别和联系。并且用python分别将其实现。在其中由于在实现正则化操作需要用到python中nltk库,因此,本文又给大家讲解了nltk库的安装以及可能遇到的问题。接下来我们将会介绍文本处理流程中的文本表示。希望我们一起学习,共同努力。
参考文献
[1] 词干提取(Stemming)和词形还原(Lemmatization)
[2] 人工智能:python 实现 第十章,NLP 第一天 入门介绍及使用Stemming还原词汇
[3] NLP入门(三)词形还原(Lemmatization)
[4] PYTHON3.6对中文文本分词、去停用词以及词频统计
[5] 【Python】NLTK库安装及常见问题指南
如果觉得《python怎么过滤停用词_第6天:文本处理流程——停用词的过滤 正则化操作》对你有帮助,请点赞、收藏,并留下你的观点哦!