1. 程式人生 > >乾貨 | 自然語言處理(5)之英文文字挖掘預處理流程

乾貨 | 自然語言處理(5)之英文文字挖掘預處理流程

前言

原文連結:http://www.cnblogs.com/pinard/p/6756534.html

在中文文字挖掘預處理流程總結中,我們總結了中文文字挖掘的預處理流程,這裡我們再對英文文字挖掘(English text mining, ETM)的預處理流程做一個總結。

ETM特點

英文文字的預處理方法和中文的有部分區別。首先,英文文字挖掘預處理一般可以不做分詞(特殊需求除外),而中文預處理分詞是必不可少的一步。第二點,大部分英文文字都是uft-8的編碼,這樣在大多數時候處理的時候不用考慮編碼轉換的問題,而中文文字處理必須要處理unicode的編碼問題。這兩部分我們在中文文字挖掘預處理裡已經講了。

而英文文字的預處理也有自己特殊的地方,第三點就是拼寫問題

,很多時候,我們的預處理要包括拼寫檢查,比如“Helo World”這樣的錯誤,我們不能在分析的時候講錯糾錯。所以需要在預處理前加以糾正。第四點就是詞幹提取(stemming)和詞形還原(lemmatization)。這個東西主要是英文有單數,複數和各種時態,導致一個詞會有不同的形式。比如“countries”和"country","wolf"和"wolves",我們期望是有一個詞。

後面的預處理中,我們會重點講述第三點和第四點的處理。

ETM預處理(一)之資料獲取

這部分英文和中文類似。獲取方法一般有兩種:使用別人做好的語料庫和自己用爬蟲去在網上去爬自己的語料資料。

對於第一種方法,常用的文字語料庫在網上有很多,如果大家只是學習,則可以直接下載下來使用,但如果是某些特殊主題的語料庫,比如“deep learning”相關的語料庫,則這種方法行不通,需要我們自己用第二種方法去獲取。

對於第二種使用爬蟲的方法,開源工具有很多,通用的爬蟲我一般使用beautifulsoup。但是我們我們需要某些特殊的語料資料,比如上面提到的“deep learning”相關的語料庫,則需要用主題爬蟲(也叫聚焦爬蟲)來完成。這個我一般使用ache。 ache允許我們用關鍵字或者一個分類演算法模型來過濾出我們需要的主題語料,比較強大。

ETM預處理(二)之去除非文字

這一步主要是針對我們用爬蟲收集的語料資料,由於爬下來的內容中有很多html的一些標籤,需要去掉。少量的非文字內容的可以直接用Python的正則表示式(re)刪除, 複雜的則可以用beautifulsoup來去除。另外還有一些特殊的非英文字元(non-alpha),也可以用Python的正則表示式(re)刪除。

ETM預處理(三)之拼寫檢查

由於英文文字中可能有拼寫錯誤,因此一般需要進行拼寫檢查。如果確信我們分析的文字沒有拼寫問題,可以略去此步。

拼寫檢查,我們一般用pyenchant類庫完成。pyenchant的安裝很簡單:"pip install pyenchant"即可。

對於一段文字,我們可以用下面的方式去找出拼寫錯誤:

from enchant.checker import SpellChecker
chkr = SpellChecker("en_US")
chkr.set_text("Many peope likee to watch In the Name of People.")for err in chkr:    print "ERROR:", err.word

輸出是:

ERROR: peope
ERROR: likee

找出錯誤後,我們可以自己來決定是否要改正。當然,我們也可以用pyenchant中的wxSpellCheckerDialog類來用對話方塊的形式來互動決定是忽略,改正還是全部改正文字中的錯誤拼寫。大家感興趣的話可以去研究pyenchant的官方文件。

ETM預處理(四)之

詞幹提取(stemming)和

詞形還原(lemmatization)

詞幹提取(stemming)和詞型還原(lemmatization)是英文文字預處理的特色。兩者其實有共同點,即都是要找到詞的原始形式。只不過詞幹提取(stemming)會更加激進一點,它在尋找詞幹的時候可以會得到不是詞的詞幹。比如"imaging"的詞幹可能得到的是"imag", 並不是一個詞。而詞形還原則保守一些,它一般只對能夠還原成一個正確的詞的詞進行處理。個人比較喜歡使用詞型還原而不是詞幹提取。

在實際應用中,一般使用nltk來進行詞幹提取和詞型還原。安裝nltk也很簡單,"pip install nltk"即可。只不過我們一般需要下載nltk的語料庫,可以用下面的程式碼完成,nltk會彈出對話方塊選擇要下載的內容。選擇下載語料庫就可以了。

import nltk
nltk.download()

在nltk中,做詞幹提取的方法有PorterStemmer,LancasterStemmer和SnowballStemmer。個人推薦使用SnowballStemmer。這個類可以處理很多種語言,當然,除了中文。

from nltk.stem import SnowballStemmer
stemmer = SnowballStemmer("english") # Choose a languagestemmer.stem("countries") # Stem a word

輸出是"countri",這個詞幹並不是一個詞。而如果是做詞型還原,則一般可以使用WordNetLemmatizer類,即wordnet詞形還原方法。

from nltk.stem import WordNetLemmatizer
wnl = WordNetLemmatizer()print(wnl.lemmatize('countries'))  

輸出是"country",比較符合需求。在實際的英文文字挖掘預處理的時候,建議使用基於wordnet的詞形還原就可以了。

在這裡有個詞幹提取和詞型還原的demo,如果是這塊的新手可以去看看,上手很合適。

ETM預處理(五)之小寫歸一化

由於英文單詞有大小寫之分,我們期望統計時像“Home”和“home”是一個詞。因此一般需要將所有的詞都轉化為小寫。這個直接用python的API就可以搞定。

ETM預處理(六)之引入停用詞

在英文文字中有很多無效的詞,比如“a”,“to”,一些短詞,還有一些標點符號,這些我們不想在文字分析的時候引入,因此需要去掉,這些詞就是停用詞。個人常用的英文停用詞表下載地址在這。當然也有其他版本的停用詞表,不過這個版本是我常用的。

在我們用scikit-learn做特徵處理的時候,可以通過引數stop_words來引入一個數組作為停用詞表。這個方法和前文講中文停用詞的方法相同,這裡就不寫出程式碼,大家參考前文即可。

ETM預處理(七)之特徵處理

現在我們就可以用scikit-learn來對我們的文字特徵進行處理了,在文字挖掘預處理之向量化與Hash Trick中,我們講到了兩種特徵處理的方法,向量化與Hash Trick。而向量化是最常用的方法,因為它可以接著進行TF-IDF的特徵處理。在文字挖掘預處理之TF-IDF中,我們也講到了TF-IDF特徵處理的方法。

TfidfVectorizer類可以幫助我們完成向量化,TF-IDF和標準化三步。當然,還可以幫我們處理停用詞。這部分工作和中文的特徵處理也是完全相同的,大家參考前文即可。

ETM預處理(八)之特徵處理

有了每段文字的TF-IDF的特徵向量,我們就可以利用這些資料建立分類模型,或者聚類模型了,或者進行主題模型的分析。此時的分類聚類模型和之前講的非自然語言處理的資料分析沒有什麼兩樣。因此對應的演算法都可以直接使用。而主題模型是自然語言處理比較特殊的一塊,這個我們後面再單獨講。

階段總結

上面我們對英文文字挖掘預處理的過程做了一個總結,希望可以幫助到大家。需要注意的是這個流程主要針對一些常用的文字挖掘,並使用了詞袋模型,對於某一些自然語言處理的需求則流程需要修改。比如有時候需要做詞性標註,而有時候我們也需要英文分詞,比如得到"New York"而不是“New”和“York”,因此這個流程僅供自然語言處理入門者參考,我們可以根據我們的資料分析目的選擇合適的預處理方法。

歡迎分享給他人讓更多的人受益

近期熱文

廣告、商業合作

請新增微信:guodongwe1991

(備註:商務合作)