1. 程式人生 > >從文字預處理到TF-IDF權重計算(一)

從文字預處理到TF-IDF權重計算(一)

前言

最近在看些自然語言處理的知識,這裡分享下語言處理的過程。
一般而言,自然語言預處理包含分詞、去停用詞、權重計算等。

0x01 nltk庫安裝

這裡以nltk庫為例。nltk的全稱是natural language toolkit,是一套基於python的自然語言處理工具集。

  • 安裝nltk庫
    pip install nltk
  • 下載必要資料集
    進入python終端。
import nltk
nltk.download()

執行後下載所需要的資料集,這裡需要下載停用詞資料集stopwords
1.png

0x02 分詞

針對英文分詞的方式有很多種,相對而言英文分詞比較簡單,中文由於詞語之間沒有明顯特徵,所以很複雜。
英文分詞可以使用re正則模組或者呼叫nltk.regexp_tokenize函式。
示例如下:

    word='this is a test simple!'
    pattern = r"""(?x)                   # set flag to allow verbose regexps 
                      (?:[A-Z]\.)+           # abbreviations, e.g. U.S.A. 
                      |\d+(?:\.\d+)?%?       # numbers, incl. currency and percentages 
                      |\w+(?:[-']\w+)*       # words w/ optional internal hyphens/apostrophe 
                      |\.\.\.                # ellipsis 
                         # special characters with meanings 
                    """
    text = nltk.regexp_tokenize(words, pattern)

0x03 去停用詞

去除一些常用的停用詞,這裡是通過一些data集進行匹配去除。
選用停用詞集stopwords

from nltk.corpus import stopwords
stopworddic = set(stopwords.words('english'))
text = [i for i in text if i not in stopworddic]

0x05 單詞詞幹化(*非必須)

from nltk.stem.lancaster import LancasterStemmer
st = LancasterStemmer()
st.stem('stemmed')     #=>'stem'
st.stem('stemming')    #=>'stem'

0x06 詞幹抽取

  將文字列表中的詞語抽取其詞幹,以統一特徵表徵形式,特徵降維以減少計算量。NLTK中提供了三種最常用的詞幹提取器介面,即 Porter stemmer, Lancaster Stemmer 和 Snowball Stemmer。抽取詞的詞幹或詞根形式(不一定能夠表達完整語義)

>>> from nltk.stem.porter import PorterStemmer  
>>> porter_stemmer = PorterStemmer()  

>>> from nltk.stem.lancaster import LancasterStemmer  
>>> lancaster_stemmer = LancasterStemmer()  

>>> from nltk.stem import SnowballStemmer  
>>> snowball_stemmer = SnowballStemmer(“english”)  

>>> porter_stemmer.stem(‘maximum’)  
u’maximum’  
>>> lancaster_stemmer.stem(‘maximum’)  
‘maxim’  
>>> snowball_stemmer.stem(‘maximum’)  
u’maximum’  

>>> porter_stemmer.stem(‘presumably’)  
u’presum’  
>>> snowball_stemmer.stem(‘presumably’)  
u’presum’  
>>> lancaster_stemmer.stem(‘presumably’)  
‘presum’  

>>> porter_stemmer.stem(‘multiply’)  
u’multipli’ 
>>> snowball_stemmer.stem(‘multiply’)  
u’multipli’  
>>> lancaster_stemmer.stem(‘multiply’)  
‘multiply’ 

>>> porter_stemmer.stem(‘provision’)  
u’provis’  
>>> snowball_stemmer.stem(‘provision’)  
u’provis’  
>>> lancaster_stemmer.stem(‘provision’)  
u’provid’  

>>> porter_stemmer.stem(‘owed’)  
u’owe’  
>>> snowball_stemmer.stem(‘owed’)  
u’owe’  
>>> lancaster_stemmer.stem(‘owed’)  
‘ow’   

各有優劣,看具體文字情況。對於分類、聚類這樣對於特徵詞語的具體形態沒有要求的情況下,進行詞幹抽取雖然抽取後的詞幹可能無實際意義但是卻會大大減少計算時間,提高效率。

0x07 詞形還原

  詞形還原Lemmatization是把一個任何形式的語言詞彙還原為一般形式(能表達完整語義)。相對而言,詞幹提取是簡單的輕量級的詞形歸併方式,最後獲得的結果為詞幹,並不一定具有實際意義。詞形還原處理相對複雜,獲得結果為詞的原形,能夠承載一定意義,與詞幹提取相比,更具有研究和應用價值。

from nltk.stem import WordNetLemmatizer  
wordnet_lemmatizer = WordNetLemmatizer()  
word = wordnet_lemmatizer.lemmatize('birds')  

bird
nltk的lemmatization演算法很雞肋,基本可以理解為只有複數還原為單數形式,當然feet這樣的非常態複數形式也可以實現,但是你要想形容詞變名詞,就不太怎麼好使了。