以下內容來自劉建平Pinard-博客園的學習筆記,總結如下:

1 文本挖掘預處理:向量化與Hash Trick

文本挖掘的預處理的關鍵一步:「分詞」,而在做了分詞後,如果我們是做文本分類聚類,則後面關鍵的特徵預處理步驟有向量化或向量化的特例Hash Trick。

1.1 詞袋模型

在講向量化與Hash Trick之前,我們先說說詞袋模型(Bag of Words,簡稱BoW)。詞袋模型假設我們不考慮文本中詞與詞之間的上下文關係,僅僅只考慮所有詞的權重。而權重與詞在文本中出現的頻率有關。

詞袋模型首先會進行分詞,在分詞之後,通過統計每個詞在文本中出現的次數,我們就可以得到該文本基於詞的特徵,如果將各個文本樣本的這些詞與對應的詞頻放在一起,就是我們常說的向量化。向量化完畢後一般也會使用TF-IDF進行特徵的權重修正,再將特徵進行標準化。 再進行一些其他的特徵工程後,就可以將數據帶入機器學習演算法進行分類聚類了。

總結下詞袋模型的三部曲:分詞(tokenizing),統計修訂詞特徵值(counting)與標準化(normalizing)。

與詞袋模型非常類似的一個模型是詞集模型(Set of Words,簡稱SoW),和詞袋模型唯一的不同是它僅僅考慮詞是否在文本中出現,而不考慮詞頻。也就是一個詞在文本中出現1次和多次特徵處理是一樣的。在大多數時候,我們使用詞袋模型,後面的討論也是以詞袋模型為主。

詞袋模型有很大的侷限性,因為它僅僅考慮了詞頻,沒有考慮上下文的關係,因此會丟失一部分文本的語義。但是大多數時候,如果我們的目的是分類聚類,則詞袋模型表現的很好。

1.2 詞袋向量之向量化

在詞袋模型的統計詞頻這一步,我們會得到該文本中所有詞的詞頻,有了詞頻,我們就可以用詞向量表示這個文本。這裡我們舉一個例子,例子直接用scikit-learn的CountVectorizer類來完成,這個類可以幫我們完成文本的詞頻統計與向量化,代碼如下:

對於上面4個文本的處理輸出如下:

(0, 16) 1 (0, 3) 1 (0, 15) 2

(0, 4) 1 (1, 5) 1 (1, 9) 1

(1, 2) 1 (1, 6) 1 (1, 14) 1

(1, 3) 1 (2, 1) 1 .................

可以看出4個文本的詞頻已經統計出,在輸出中,左邊的括弧中的第一個數字是文本的序號,第2個數字是詞的序號,注意詞的序號是基於所有的文檔的。第三個數字就是我們的詞頻。

我們可以進一步看看每個文本的詞向量特徵和各個特徵代表的詞,代碼如下:

輸出如下:

[[0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 2 1 0 0] [0 0 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0] [1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0] [0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1]][uand, uapple, ucar, uchina, ucome, uin, uis, ulove, upapers, upolupar, uscience, usome, utea, uthe, uthis, uto, utravel, uwork, uwrite]

可以看到我們一共有19個詞,所以4個文本都是19維的特徵向量。而每一維的向量依次對應了下面的19個詞。另外由於詞"I"在英文中是停用詞,不參加詞頻的統計。

由於大部分的文本都只會使用辭彙表中的很少一部分的詞,因此我們的詞向量中會有大量的0。也就是說詞向量是稀疏的。在實際應用中一般使用稀疏矩陣來存儲

將文本做了詞頻統計後,我們一般會通過TF-IDF進行詞特徵值修訂。

向量化的方法很好用,也很直接,但是在有些場景下很難使用,比如分詞後的辭彙表非常大,達到100萬+,此時如果我們直接使用向量化的方法,將對應的樣本對應特徵矩陣載入內存,有可能將內存撐爆,在這種情況下我們怎麼辦呢?

第一反應是我們要進行特徵降維,Hash Trick就是非常常用的文本特徵降維方法。

1.3 Hash Trick

在大規模的文本處理中,由於特徵的維度對應分詞辭彙表的大小,所以維度可能非常恐怖,此時需要進行降維,不能直接用我們上一節的向量化方法。

而最常用的文本降維方法是Hash Trick。

在Hash Trick裏,我們會定義一個特徵Hash後對應的哈希表的大小,這個哈希表的維度會遠遠小於我們的辭彙表的特徵維度,因此可以看成是降維。具體的方法是,對應任意一個特徵名,我們會用Hash函數找到對應哈希表的位置,然後將該特徵名對應的詞頻統計值累加到該哈希表位置。如果用數學語言表示,假如哈希函數h使第i個特徵哈希到位置j,即h(i)=j,則第i個原始特徵的詞頻數值?(i)將累加到哈希後的第j個特徵的詞頻數值 ar{phi} 上,即:

但是上面的方法有一個問題,有可能兩個原始特徵的哈希後位置在一起導致詞頻累加特徵值突然變大,為瞭解決這個問題,出現了hash Trick的變種signed hash trick,此時除了哈希函數

h,我們多了一個一個哈希函數:

此時我們有

這樣做的好處是,哈希後的特徵仍然是一個無偏的估計,不會導致某些哈希位置的值過大。

當然,大家會有疑惑,這種方法來處理特徵,哈希後的特徵是否能夠很好的代表哈希前的特徵呢?從實際應用中說,由於文本特徵的高稀疏性,這麼做是可行的。

在scikit-learn的HashingVectorizer類中,實現了基於signed hash trick的演算法,這裡我們就用HashingVectorizer來實踐一下Hash Trick,為了簡單,我們使用上面的19維辭彙表,並哈希降維到6維。當然在實際應用中,19維的數據根本不需要Hash Trick,這裡只是做一個演示,代碼如下:

輸出如下:

(0, 1) 2.0 (0, 2) -1.0 (0, 4) 1.0 (0, 5) -1.0 (1, 0) 1.0

可以看到結果裡面有負數,這是因為我們的哈希函數ξ可以哈希到1或者-1導致的。

和PCA類似,Hash Trick降維後的特徵我們已經不知道它代表的特徵名字和意義。此時我們不能像上一節向量化時候可以知道每一列的意義,所以Hash Trick的解釋性不強。

1.4 向量化與Hash Trick小結

這裡我們對向量化與它的特例Hash Trick做一個總結。

在特徵預處理的時候,我們什麼時候用一般意義的向量化,什麼時候用Hash Trick呢?

一般來說,只要辭彙表的特徵不至於太大,大到內存不夠用,肯定是使用一般意義的向量化比較好。因為向量化的方法解釋性很強,我們知道每一維特徵對應哪一個詞,進而我們還可以使用TF-IDF對各個詞特徵的權重修改,進一步完善特徵的表示。

而Hash Trick用大規模機器學習上,此時我們的辭彙量極大,使用向量化方法內存不夠用,而使用Hash Trick降維速度很快,降維後的特徵仍然可以幫我們完成後續的分類和聚類工作。當然由於分散式計算框架的存在,其實一般我們不會出現內存不夠的情況。因此,實際工作中我使用的都是特徵向量化。

2 文本挖掘預處理:TF-IDF

在文本挖掘的預處理中,向量化之後一般都伴隨著TF-IDF的處理,那麼什麼是TF-IDF,為什麼一般我們要加這一步預處理呢?

這裡就對TF-IDF的原理做一個總結。

2.1 文本向量化特徵的不足

在將文本分詞並向量化後,我們可以得到辭彙表中每個詞在各個文本中形成的詞向量,比如我們將下面4個短文本做了詞頻統計:

corpus=["I come to China to travel", "This is a car polupar in China", "I love tea and Apple ", "The work is to write some papers in science"]

不考慮停用詞,處理後得到的詞向量如下:

[[0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 2 1 0 0] [0 0 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0] [1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0] [0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1]]

如果我們直接將統計詞頻後的19維特徵做為文本分類的輸入,會發現有一些問題。比如第一個文本,我們發現"come","China"和「Travel」各出現1次,而「to「出現了兩次。似乎看起來這個文本與」to「這個特徵更關係緊密。但是實際上」to「是一個非常普遍的詞,幾乎所有的文本都會用到,因此雖然它的詞頻為2,但是重要性卻比詞頻為1的"China"和「Travel」要低的多。

如果我們的向量化特徵僅僅用詞頻表示就無法反應這一點。因此我們需要進一步的預處理來反應文本的這個特徵,而這個預處理就是TF-IDF。

2.2 TF-IDF概述

TF-IDF是Term Frequency - Inverse Document Frequency的縮寫,即「詞頻-逆文本頻率」。它由兩部分組成,TF和IDF。

前面的TF也就是我們前面說到的詞頻,我們之前做的向量化也就是做了文本中各個詞的出現頻率統計,並作為文本特徵,這個很好理解。關鍵是後面的這個IDF,即「逆文本頻率」如何理解。在上一節中,我們講到幾乎所有文本都會出現的"to"其詞頻雖然高,但是重要性卻應該比詞頻低的"China"和「Travel」要低。我們的IDF就是來幫助我們來反應這個詞的重要性的,進而修正僅僅用詞頻表示的詞特徵值。

概括來講, IDF反應了一個詞在所有文本中出現的頻率,如果一個詞在很多的文本中出現,那麼它的IDF值應該低,比如上文中的「to」。而反過來如果一個詞在比較少的文本中出現,那麼它的IDF值應該高。比如一些專業的名詞如「Machine Learning」。這樣的詞IDF值應該高。一個極端的情況,如果一個詞在所有的文本中都出現,那麼它的IDF值應該為0。

上面是從定性上說明IDF的作用,如何對一個詞的IDF進行定量分析呢?

這裡直接給出一個詞x的IDF的基本公式如下:

IDF(X)=logfrac{N} {N(x)}

其中,N代表語料庫中文本的總數,而N(x)代表語料庫中包含詞x的文本總數。

上面的IDF公式已經可以使用了,但是在一些特殊的情況會有一些小問題,比如某一個生僻詞在語料庫中沒有,這樣我們的分母為0, IDF沒有意義了。所以常用的IDF我們需要做一些平滑,使語料庫中沒有出現的詞也可以得到一個合適的IDF值。平滑的方法有很多種,最常見的IDF平滑後的公式之一為:

IDF(x) = logfrac{N+1}{N(x)+1} +1

有了IDF的定義,我們就可以計算某一個詞的TF-IDF值了:

TF-IDF(x)=TF(x)*IDF(x)

其中 TF(x) 指詞 x 在當前文本中的詞頻。

2.3 用scikit-learn進行TF-IDF預處理

在scikit-learn中,有兩種方法進行TF-IDF的預處理。

第一種方法是在用CountVectorizer類向量化之後再調用TfidfTransformer類進行預處理。

第二種方法是直接用TfidfVectorizer完成向量化與TF-IDF預處理。

首先我們來看第一種方法,CountVectorizer+TfidfTransformer的組合,代碼如下:

輸出的各個文本各個詞的TF-IDF值如下:

(0, 4) 0.442462137895 (0, 15) 0.697684463384 (0, 3) 0.348842231692 (0, 16) 0.442462137895 (1, 3) 0.357455043342 (1, 14) 0.453386397373

用TfidfVectorizer一步到位,代碼如下:

輸出的各個文本各個詞的TF-IDF值和第一種的輸出完全相同。

由於第二種方法比較的簡潔,因此在實際應用中推薦使用,一步到位完成向量化,TF-IDF與標準化。

2.4 TF-IDF小結

TF-IDF是非常常用的文本挖掘預處理基本步驟,但是如果預處理中使用了Hash Trick,則一般就無法使用TF-IDF了,因為Hash Trick後我們已經無法得到哈希後的各特徵的IDF的值

使用了IF-IDF並標準化以後,我們就可以使用各個文本的詞特徵向量作為文本的特徵,進行分類或者聚類分析。

當然TF-IDF不光可以用於文本挖掘,在信息檢索等很多領域都有使用。因此值得好好的理解這個方法的思想。

3 中文文本挖掘:預處理流程

3.1 中文文本挖掘預處理特點

首先我們看看中文文本挖掘預處理和英文文本挖掘預處理相比的一些特殊點。

首先,中文文本是沒有像英文的單詞空格那樣隔開的,因此不能直接像英文一樣可以直接用最簡單的空格和標點符號完成分詞。所以一般我們需要用分詞演算法來完成分詞

第二,中文的編碼不是utf8,而是unicode。這樣會導致在分詞的時候,和英文相比,我們要處理編碼的問題

這兩點構成了中文分詞相比英文分詞的一些不同點,後面我們也會重點講述這部分的處理。

3.2 中文文本挖掘預處理一:數據收集

在文本挖掘之前,我們需要得到文本數據,文本數據的獲取方法一般有兩種:

使用別人做好的語料庫和自己用爬蟲去在網上去爬自己的語料數據。

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

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

3.3 中文文本挖掘預處理二:除去數據中非文本部分

這一步主要是針對我們用爬蟲收集的語料數據,由於爬下來的內容中有很多html的一些標籤,需要去掉。

少量的非文本內容的可以直接用Python的正則表達式(re)刪除, 複雜的則可以用beautifulsoup來去除。

去除掉這些非文本的內容後,我們就可以進行真正的文本預處理了。

3.4 中文文本挖掘預處理三:處理中文編碼問題

由於Python2不支持unicode的處理,因此我們使用Python2做中文文本預處理時需要遵循的原則是,存儲數據都用utf8,讀出來進行中文相關處理時,使用GBK之類的中文編碼,在下面一節的分詞時,我們再用例子說明這個問題。

3.5 中文文本挖掘預處理四:中文分詞

常用的中文分詞軟體有很多,個人比較推薦結巴分詞。安裝也很簡單,比如基於Python的,用"pip install jieba"就可以完成。下面我們就用例子來看看如何中文分詞。

首先我們準備了兩段文本,這兩段文本在兩個文件中。兩段文本的內容分別是nlp_test0.txt和nlp_test2.txt:

我們先講文本從第一個文件中讀取,並使用中文GBK編碼,再調用結巴分詞,最後把分詞結果用uft8格式存在另一個文本nlp_test1.txt中。代碼如下:

輸出的文本內容如下:

沙 瑞金 讚歎 易 學習 的 胸懷 , 是 金山 的 百姓 有福 , 可是 這件 事對 李達康 的 觸動 很大 。 易 學習 又 回憶起 他們 三人 分開 的 前一晚 , 大家 一起 喝酒 話別 , 易 學習 被 降職 到 道口 縣當 縣長 , 王 大路 下海經商 , 李達康 連連 賠禮道歉 , 覺得 對不起 大家 , 他 最 對不起 的 是 王 大路 , 就 和 易 學習 一起 給 王 大路 湊 了 5 萬塊 錢 , 王 大路 自己 東挪西撮 了 5 萬塊 , 開始 下海經商 。 沒想到 後來 王 大路 竟然 做 得 風生水 起 。 沙 瑞金 覺得 他們 三人 , 在 困難 時期 還 能 以沫 相助 , 很 不 容易 。

可以發現對於一些人名和地名,jieba處理的不好,不過我們可以幫jieba加入辭彙如下:

jieba.suggest_freq(沙瑞金, True)jieba.suggest_freq(易學習, True)jieba.suggest_freq(王大路, True)jieba.suggest_freq(京州, True)

現在我們再來進行讀文件,編碼,分詞,編碼和寫文件,代碼如下:

輸出的文本內容如下:

沙瑞金 讚歎 易學習 的 胸懷 , 是 金山 的 百姓 有福 , 可是 這件 事對 李達康 的 觸動 很大 。 易學習 又 回憶起 他們 三人 分開 的 前一晚 , 大家 一起 喝酒 話別 , 易學習 被 降職 到 道口 縣當 縣長 , 王大路 下海經商 , 李達康 連連 賠禮道歉 , 覺得 對不起 大家 , 他 最 對不起 的 是 王大路 , 就 和 易學習 一起 給 王大路 湊 了 5 萬塊 錢 , 王大路 自己 東挪西撮 了 5 萬塊 , 開始 下海經商 。 沒想到 後來 王大路 竟然 做 得 風生水 起 。 沙瑞金 覺得 他們 三人 , 在 困難 時期 還 能 以沫 相助 , 很 不 容易 。

基本已經可以滿足要求。同樣的方法我們對第二段文本nlp_test2.txt進行分詞和寫入文件nlp_test3.txt。

輸出的文本內容如下:

沙瑞金 向 毛婭 打聽 他們 家 在 京州 的 別墅 , 毛婭 笑 著 說 , 王大路 事業有成 之後 , 要 給 歐陽 菁 和 她 公司 的 股權 , 她們 沒有 要 , 王大路 就 在 京州 帝豪園 買 了 三套 別墅 , 可是 李達康 和 易學習 都 不要 , 這些 房子 都 在 王大路 的 名下 , 歐陽 菁 好像 去 住 過 , 毛婭 不想 去 , 她 覺得 房子 太大 很 浪費 , 自己 家住 得 就 很 踏實 。

可見分詞效果還不錯。

3.6 中文文本挖掘預處理五:引入停用詞

在上面我們解析的文本中有很多無效的詞,比如「著」,「和」,還有一些標點符號,這些我們不想在文本分析的時候引入,因此需要去掉,這些詞就是停用詞。

常用的中文停用詞表是1208個,下載地址在這

在我們用scikit-learn做特徵處理時,可以通過參數stop_words來引入一個數組作為停用詞表。

現在我們將停用詞表從文件讀出,並切分成一個數組備用:

3.7 中文文本挖掘預處理六:特徵處理

現在我們就可以用scikit-learn來對我們的文本特徵進行處理了,兩種特徵處理的方法,向量化與Hash Trick。而向量化是最常用的方法,因為它可以接著進行TF-IDF的特徵處理。這裡我們就用scikit-learn的TfidfVectorizer類來進行TF-IDF特徵處理。

TfidfVectorizer類可以幫助我們完成向量化,TF-IDF和標準化三步。當然,還可以幫我們處理停用詞。現在我們把上面分詞好的文本載入內存:

這裡的輸出還是我們上面分完詞的文本。現在我們可以進行向量化,TF-IDF和標準化三步處理了。注意,這裡我們引入了我們上面的停用詞表。

部分輸出如下:

(0, 44) 0.154467434933 (0, 59) 0.108549295069 (0, 39) 0.308934869866 (0, 53) 0.108549295069  .... (1, 27) 0.139891059658 (1, 47) 0.139891059658 (1, 30) 0.139891059658 (1, 60) 0.139891059658

看看每次詞和TF-IDF的對應關係:

部分輸出如下:

-------第 0 段文本的詞語tf-idf權重------一起 0.217098590137萬塊 0.217098590137三人 0.217098590137三套 0.0下海經商 0.217098590137.....-------第 1 段文本的詞語tf-idf權重------.....李達康 0.0995336411066歐陽 0.279782119316毛婭 0.419673178975沙瑞金 0.0995336411066沒想到 0.0沒有 0.139891059658浪費 0.139891059658王大路 0.29860092332.....

3.8 中文文本挖掘預處理七:建立分析模型

有了每段文本的TF-IDF的特徵向量,我們就可以利用這些數據建立分類模型,或者聚類模型了,或者進行主題模型的分析。

比如我們上面的兩段文本,就可以是兩個訓練樣本了。

此時的分類聚類模型和之前講的非自然語言處理的數據分析沒有什麼兩樣。因此對應的演算法都可以直接使用。而主題模型是自然語言處理比較特殊的一塊,這個我們後面再單獨講。

3.9 中文文本挖掘預處理總結

上面我們對中文文本挖掘預處理的過程做了一個總結。

需要注意的是這個流程主要針對一些常用的文本挖掘,並使用了詞袋模型,對於某一些自然語言處理的需求則流程需要修改。

比如我們涉及到詞上下文關係的一些需求,此時不能使用詞袋模型。

而有時候我們對於特徵處理有自己的特殊需求,因此這個流程僅供自然語言處理入門者參考。

4 英文文本挖掘:預處理流程

4.1 英文文本挖掘預處理特點

英文文本的預處理方法和中文的有部分區別。

首先,英文文本挖掘預處理一般可以不做分詞(特殊需求除外),而中文預處理分詞是必不可少的一步。

第二點,大部分英文文本都是uft-8的編碼,這樣在大多數時候處理的時候不用考慮編碼轉換的問題,而中文文本處理必須要處理unicode的編碼問題。

第三點就是拼寫問題,很多時候,我們的預處理要包括拼寫檢查,比如「Helo World」這樣的錯誤,我們不能在分析的時候講錯糾錯。所以需要在預處理前加以糾正。

第四點就是詞幹提取(stemming)和詞形還原(lemmatization)。這個東西主要是英文有單數,複數和各種時態,導致一個詞會有不同的形式。比如「countries」和"country","wolf"和"wolves",我們期望是有一個詞。

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

4.2 英文文本挖掘預處理一:數據收集

獲取方法一般有兩種:

使用別人做好的語料庫和自己用爬蟲去在網上去爬自己的語料數據。

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

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

4.3 英文文本挖掘預處理二:除去數據中非文本部分

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

4.4 英文文本挖掘預處理三:拼寫檢查更正

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

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

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

輸出是:

ERROR: peopeERROR: likee

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

4.5 英文文本挖掘預處理四:詞幹提取(stemming)和詞形還原(lemmatization)

詞幹提取(stemming)和詞型還原(lemmatization)是英文文本預處理的特色。

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

在實際應用中,一般使用nltk來進行詞幹提取和詞型還原。安裝nltk也很簡單,"pip install nltk"即可。

只不過我們一般需要下載nltk的語料庫,可以用下面的代碼完成,nltk會彈出對話框選擇要下載的內容。選擇下載語料庫就可以了。

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

輸出是"countri",這個詞幹並不是一個詞。    

而如果是做詞型還原,則一般可以使用WordNetLemmatizer類,即wordnet詞形還原方法。

輸出是"country",比較符合需求。

在實際的英文文本挖掘預處理的時候,建議使用基於wordnet的詞形還原就可以了。

4.6 英文文本挖掘預處理五:轉化為小寫

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

4.7 英文文本挖掘預處理六:引入停用詞

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

我們用scikit-learn做特徵處理的時候,可以通過參數stop_words來引入一個數組作為停用詞表。

4.8 英文文本挖掘預處理七:特徵處理

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

TfidfVectorizer類可以幫助我們完成向量化,TF-IDF和標準化三步。當然,還可以幫我們處理停用詞。

4.9 英文文本挖掘預處理八:建立分析模型

有了每段文本的TF-IDF的特徵向量,我們就可以利用這些數據建立分類模型,或者聚類模型了,或者進行主題模型的分析。此時的分類聚類模型和之前講的非自然語言處理的數據分析沒有什麼兩樣。因此對應的演算法都可以直接使用。

而主題模型是自然語言處理比較特殊的一塊,這個我們後面再單獨講。

4.10 英文文本挖掘預處理總結

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


推薦閱讀:
相关文章