天天看點

《NLTK基礎教程——用NLTK和Python庫建構機器學習應用》——1.3 向NLTK邁進

本節書摘來異步社群《nltk基礎教程——用nltk和python庫建構機器學習應用》一書中的第1章,第1.3節,作者:nitin hardeniya,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

盡管在這裡,我們并不打算深入探讨自然語言處理理論,但也會盡快讓你實際接觸一下nltk。是以,我打算先介紹一些nltk的基本用例,這是一個很好的機會,你可以先為今後做類似事情做一些準備。下面,我們會從一個python程式員習慣的處理方式切入,示範如何用nltk将該方式轉換成一個更為高效、可靠、簡潔的解決方案。

我們先來看一個純文字分析的例子。這個例子是我們要從python官方首頁上摘取部分内容。

目前,我們還沒有得到任何關于該url所讨論話題的線索,是以接下來,我們要先做一次探索性資料分析(eda)。通常對于一段文本域而言,eda可能包含了多重含義,但這裡隻會涉及其中的一個簡單用例,即該文檔的主體術語類型。主題是什麼?它們的出現頻率如何?整個分析過程還會或多或少地涉及一些預處理層面的步驟。我們會試着先用純python的方式來實作它,然後用nltk再将其實作一次。

我們先要清理掉其中的html标簽。一種可行的做法是隻選取其中的标記,包括數字和字元。如果之前有在工作中使用過正規表達式,你應該可以輕松地将這些html字元串轉換成一個标記清單:

如你所見,上面列出了我們在處理文本内容時用不到的html标簽和其他多餘字元。當然,這個任務還有個更為簡潔的版本:

這樣看上去已經簡潔多了吧?但其實它還可以更簡潔一點。在這裡,我們所做的努力是盡可能地去除幹擾,但那些被清理的html标記還是會如雨後春筍般地冒出來,而且我們可能也想以單詞長度為标準,删除某一特定長度的單詞——如說移除像7、8這樣的元素,因為在目前情況下,這些都隻是幹擾詞。現在,我們要做的不是用nltk來重複相同的任務,完成這些預處理步驟。因為所有的清理工作都可以通過調用clean_html()函數[3]來完成:

很酷吧?而且,這無疑讓我們的代碼更簡潔易行了。

下面再來看看如何獲得這些術語的頻率分布。當然,我們還是要從純python的方式做起,之後再告訴你nltk的方式。

由于目标是python的官方首頁,python和(>>>)解釋器符号自然就成了最常用的術語,這也符合該網站給人的感覺。

當然,這個任務還有一個更好用、也更有效的方法,即調用nltk中的freqdist()函數。在此,我們可以來看看調用後前相同代碼的比對:

注意 小技巧:  

下載下傳示例代碼 

你在<code>http://www.packtpub.com</code>中登入你的賬戶,從中可以下載下傳你所購買的、由packt出版的所有書籍的示例代碼。如果你在别處購得此書,也可以在<code>http://www. packtpub.com/support</code>上注冊相關檔案,我們會用e-mail将其直接發送給你。

現在,讓我們來做一些更時髦的事。我們來繪制這樣的一張圖,如圖1-2所示。

《NLTK基礎教程——用NLTK和Python庫建構機器學習應用》——1.3 向NLTK邁進

在圖1-2中,我們可以看到累積頻率的即時增長,在某些點上曲線會進入一條長長的尾巴。其中依然存在着一些幹擾,有些類似于the、of、for以及=這樣的詞都是屬于無用詞,這些詞有一個專用術語:停用詞。如the、a、an這樣的詞也都屬于停用詞。由于冠詞、代詞在大多數文檔中都是普遍存在的,因而對資訊的識别沒有幫助。在大多數nlp及資訊檢索任務中,人們通常都會先删除掉這些停用詞。下面,讓我們再次回到之前運作的那個例子中,繪制結果如圖1-3所示。

注意 提示: 

如果想知道關于詞雲的更多資訊,請通路<code>http://www. wordle.net/advanced</code>。

《NLTK基礎教程——用NLTK和Python庫建構機器學習應用》——1.3 向NLTK邁進

現在,代碼看起來簡潔多了吧!在完成這麼多事後,你可以去wordle網站上将其頻率分布以csv形式顯示出來,可以得到如圖1-4所示詞雲圖。

《NLTK基礎教程——用NLTK和Python庫建構機器學習應用》——1.3 向NLTK邁進

繼續閱讀