【火爐煉AI】機器學習035-NLP詞幹提取
(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, NLTK 3.3)
在英語中,經常會有很多單詞的變形,記得以前英語老師講課時,講到動詞的變形,有過去時,將來時,現在進行時等不同場合,動詞需要變成相應的形態,而講到名詞時,又提到單數和複數的概念,可數名詞要在單詞末尾加s等。那麼NLP如何處理這些變形之後的詞了?有一種方法是提取這些詞的詞幹,所謂萬變不離其宗,我們只要抓住這個“宗”就可以應對其他了。
本文就是講解如何用NLP提取單詞的詞幹,抓住這些單詞的“宗”。
1. NLP提取詞幹
詞幹提取的目標是將不同詞形的單詞都變成其原形,詞幹提取使用啟發式處理的方法來擷取單詞的尾部,以提取單詞的原形。
NLP主要有說那種詞幹提取方法:基於Porter的詞幹提取演算法,基於Lancaster的詞幹提取演算法,基於Snowball的詞幹提取演算法。下面分別用這幾種方法來提取不同單詞的詞幹。
words = ['table', 'probably', 'wolves', 'playing', 'is', 'dog', 'the', 'beaches', 'grounded', 'dreamt', 'envision'] # 要提取的單詞 # 三種不同的詞幹提取器 stemmers = ['PORTER', 'LANCASTER', 'SNOWBALL'] stemmer_porter = PorterStemmer() stemmer_lancaster = LancasterStemmer() stemmer_snowball = SnowballStemmer('english') formatted_row = '{:>16}' * (len(stemmers) + 1) print(formatted_row.format('WORD',*stemmers)) # 打印表頭 for word in words: # 每個單詞逐一提取 stem=[stemmer_porter.stem(word), stemmer_lancaster.stem(word), stemmer_snowball.stem(word)] print(formatted_row.format(word,*stem)) # 對提取後的stem進行拆包 複製程式碼
--------------------------輸---------出------
WORDPORTERLANCASTERSNOWBALL tabletabltabltabl probablyprobablprobprobabl wolveswolvwolvwolv playingplayplayplay isisisis dogdogdogdog thethethethe beachesbeachbeachbeach groundedgroundgroundground dreamtdreamtdreamtdreamt envisionenvisenvidenvis 複製程式碼
----------------------完----------------------------
########################小**********結###############################
可以看出說那種詞幹提取演算法都能夠提取詞幹,但是提取的結果卻不一樣,這主要是因為三種演算法的提取嚴格程度不一樣,簡單的比較下,Lancaster提取最嚴格,而Porter最寬鬆。所以Lancaster得到的詞幹往往比較模糊,難以理解,但是它的提取速度很快。一般情況下,通常會選擇Snowball詞幹提取器。
#################################################################
注:本部分程式碼已經全部上傳到(ofollow,noindex"> 我的github )上,歡迎下載。
參考資料:
1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯