python怎么过滤停用词_第6天:文本处理流程——停用词的过滤、正则化操作
停用詞的過濾
在自然語言處理中,我們通常把停用詞、出現頻率很低的詞匯過濾掉。這個過程其實類似于特征篩選的過程。當然停用詞過濾,是文本分析中一個預處理方法。它的功能是過濾分詞結果中的噪聲。比如:的、是、啊等。在英文里,我們經常會遇到比如“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 https://pypi.douban.com/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天:文本处理流程——停用词的过滤、正则化操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#创建xml文件
- 下一篇: Python 连接redis密码中特殊字