用python實現入門級NLP


今天看到一篇博文,是講通過python爬一個頁面,並統計頁面詞頻的腳本,感覺蠻有意思的

Python NLP入門教程:http://python.jobbole.com/88874/

本文簡要介紹Python自然語言處理(NLP),使用Python的NLTK庫。NLTK是Python的自然語言處理工具包,在NLP領域中,最常使用的一個Python庫。

什么是NLP?

簡單來說,自然語言處理(NLP)就是開發能夠理解人類語言的應用程序或服務。

這里討論一些自然語言處理(NLP)的實際應用例子,如語音識別、語音翻譯、理解完整的句子、理解匹配詞的同義詞,以及生成語法正確完整句子和段落。

這並不是NLP能做的所有事情。

NLP實現

搜索引擎: 比如谷歌,Yahoo等。谷歌搜索引擎知道你是一個技術人員,所以它顯示與技術相關的結果;

社交網站推送:比如Facebook News Feed。如果News Feed算法知道你的興趣是自然語言處理,就會顯示相關的廣告和帖子。

語音引擎:比如Apple的Siri。

垃圾郵件過濾:如谷歌垃圾郵件過濾器。和普通垃圾郵件過濾不同,它通過了解郵件內容里面的的深層意義,來判斷是不是垃圾郵件。

NLP庫

下面是一些開源的自然語言處理庫(NLP):

  • Natural language toolkit (NLTK);
  • Apache OpenNLP;
  • Stanford NLP suite;
  • Gate NLP library

其中自然語言工具包(NLTK)是最受歡迎的自然語言處理庫(NLP),它是用Python編寫的,而且背后有非常強大的社區支持。

NLTK也很容易上手,實際上,它是最簡單的自然語言處理(NLP)庫。

在這個NLP教程中,我們將使用Python NLTK庫。

安裝 NLTK

如果您使用的是Windows/Linux/Mac,您可以使用pip安裝NLTK:

打開python終端導入NLTK檢查NLTK是否正確安裝:

如果一切順利,這意味着您已經成功地安裝了NLTK庫。首次安裝了NLTK,需要通過運行以下代碼來安裝NLTK擴展包:

這將彈出NLTK 下載窗口來選擇需要安裝哪些包:

34289431

您可以安裝所有的包,因為它們的大小都很小,所以沒有什么問題。

使用Python Tokenize文本

首先,我們將抓取一個web頁面內容,然后分析文本了解頁面的內容。

我們將使用urllib模塊來抓取web頁面:

從打印結果中可以看到,結果包含許多需要清理的HTML標簽。
然后BeautifulSoup模塊來清洗這樣的文字:

現在我們從抓取的網頁中得到了一個干凈的文本。
下一步,將文本轉換為tokens,像這樣:

 

統計詞頻

text已經處理完畢了,現在使用Python NLTK統計token的頻率分布。

可以通過調用NLTK中的FreqDist()方法實現:

如果搜索輸出結果,可以發現最常見的token是PHP。
您可以調用plot函數做出頻率分布圖:

34289431

這上面這些單詞。比如of,a,an等等,這些詞都屬於停用詞。

一般來說,停用詞應該刪除,防止它們影響分析結果。

處理停用詞

NLTK自帶了許多種語言的停用詞列表,如果你獲取英文停用詞:

現在,修改下代碼,在繪圖之前清除一些無效的token:

最終的代碼應該是這樣的:

現在再做一次詞頻統計圖,效果會比之前好些,因為剔除了停用詞:

34289431

使用NLTK Tokenize文本

在之前我們用split方法將文本分割成tokens,現在我們使用NLTK來Tokenize文本。

文本沒有Tokenize之前是無法處理的,所以對文本進行Tokenize非常重要的。token化過程意味着將大的部件分割為小部件。

你可以將段落tokenize成句子,將句子tokenize成單個詞,NLTK分別提供了句子tokenizer和單詞tokenizer。

假如有這樣這段文本:

使用句子tokenizer將文本tokenize成句子:

輸出如下:

這是你可能會想,這也太簡單了,不需要使用NLTK的tokenizer都可以,直接使用正則表達式來拆分句子就行,因為每個句子都有標點和空格。

那么再來看下面的文本:

這樣如果使用標點符號拆分,Hello Mr將會被認為是一個句子,如果使用NLTK:

輸出如下:

這才是正確的拆分。

接下來試試單詞tokenizer:

輸出如下:

Mr.這個詞也沒有被分開。NLTK使用的是punkt模塊的PunktSentenceTokenizer,它是NLTK.tokenize的一部分。而且這個tokenizer經過訓練,可以適用於多種語言。

非英文Tokenize

Tokenize時可以指定語言:

輸出結果如下:

 

同義詞處理

使用nltk.download()安裝界面,其中一個包是WordNet。

WordNet是一個為自然語言處理而建立的數據庫。它包括一些同義詞組和一些簡短的定義。

您可以這樣獲取某個給定單詞的定義和示例:

輸出結果是:

WordNet包含了很多定義:

結果如下:

可以像這樣使用WordNet來獲取同義詞:

輸出:

 

反義詞處理

也可以用同樣的方法得到反義詞:

輸出:

 

詞干提取

語言形態學和信息檢索里,詞干提取是去除詞綴得到詞根的過程,例如working的詞干為work。

搜索引擎在索引頁面時就會使用這種技術,所以很多人為相同的單詞寫出不同的版本。

有很多種算法可以避免這種情況,最常見的是波特詞干算法。NLTK有一個名為PorterStemmer的類,就是這個算法的實現:

輸出結果是:

還有其他的一些詞干提取算法,比如 Lancaster詞干算法

非英文詞干提取

除了英文之外,SnowballStemmer還支持13種語言。

支持的語言:

你可以使用SnowballStemmer類的stem函數來提取像這樣的非英文單詞:

 

單詞變體還原

單詞變體還原類似於詞干,但不同的是,變體還原的結果是一個真實的單詞。不同於詞干,當你試圖提取某些詞時,它會產生類似的詞:

結果:

現在,如果用NLTK的WordNet來對同一個單詞進行變體還原,才是正確的結果:

結果:

結果可能會是一個同義詞或同一個意思的不同單詞。

有時候將一個單詞做變體還原時,總是得到相同的詞。

這是因為語言的默認部分是名詞。要得到動詞,可以這樣指定:

結果:

實際上,這也是一種很好的文本壓縮方式,最終得到文本只有原先的50%到60%。

結果還可以是動詞(v)、名詞(n)、形容詞(a)或副詞(r):

輸出:

詞干和變體的區別

通過下面例子來觀察:

輸出:

詞干提取不會考慮語境,這也是為什么詞干提取比變體還原快且准確度低的原因。

個人認為,變體還原比詞干提取更好。單詞變體還原返回一個真實的單詞,即使它不是同一個單詞,也是同義詞,但至少它是一個真實存在的單詞。

如果你只關心速度,不在意准確度,這時你可以選用詞干提取。

在此NLP教程中討論的所有步驟都只是文本預處理。在以后的文章中,將會使用Python NLTK來實現文本分析。

我已經盡量使文章通俗易懂。希望能對你有所幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM