文字資料預處理:sklearn 中 CountVectorizer、TfidfTransformer 和 TfidfVectorizer

Candy_GL發表於2018-09-13

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/m0_37324740/article/details/79411651

文字資料預處理的第一步通常是進行分詞,分詞後會進行向量化的操作。在介紹向量化之前,我們先來了解下詞袋模型。

 

1.詞袋模型(Bag of words,簡稱 BoW )

 

  詞袋模型假設我們不考慮文字中詞與詞之間的上下文關係,僅僅只考慮所有詞的權重。而權重與詞在文字中出現的頻率有關。

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

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

  詞袋模型有很大的侷限性,因為它僅僅考慮了詞頻,沒有考慮上下文的關係,因此會丟失一部分文字的語義。

  在詞袋模型統計詞頻的時候,可以使用 sklearn 中的 CountVectorizer 來完成。下面具體說明。

 

2.詞頻向量化

 

  CountVectorizer 類會將文字中的詞語轉換為詞頻矩陣,例如矩陣中包含一個元素a[i][j],它表示j詞在i類文字下的詞頻。它通過 fit_transform 函式計算各個詞語出現的次數,通過get_feature_names()可獲取詞袋中所有文字的關鍵字,通過 toarray()可看到詞頻矩陣的結果。

官方檔案中提到其引數很多預設值就很好,無需再改動,詳細引數設定參見:點選開啟連結。例子如下:


 
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  

 
  1.  
  2.  
  3.  

輸出:


 
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  

 
  1.  
  2.  

 
  1.  
  2.  
  3.  
  4.  

 

  在輸出中,左邊的括號中的第一個數字是文字的序號i,第2個數字是詞的序號j,注意詞的序號是基於所有的文件的。第三個數字就是我們的詞頻。

可以看到一共有9個詞,所以4個文字對應的都是9維的特徵向量。

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

3.TF-IDF處理

  然而有些詞在文字中儘管詞頻高,但是並不重要,這個時候就可以用TF-IDF技術。

 

    TF-IDF(Term Frequency–Inverse Document Frequency)是一種用於資訊檢索與文字挖掘的常用加權技術。TF-IDF是一種統計方法,用以評估一個字詞對於一個檔案集或一個語料庫中的其中一份檔案的重要程度。字詞的重要性隨著它在檔案中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。TF-IDF加權的各種形式常被搜尋引擎應用,作為檔案與使用者查詢之間相關程度的度量或評級。

TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現的頻率TF高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。TF-IDF實際上是:TF * IDF。

(1)詞頻(Term Frequency,TF)指的是某一個給定的詞語在該檔案中出現的頻率。即詞w在文件d中出現的次數count(w, d)和文件d中總詞數size(d)的比值。


 

這個數字是對詞數 (term count) 的歸一化,以防止它偏向長的檔案。(同一個詞語在長檔案裡可能會比短檔案有更高的詞數,而不管該詞語重要與否。)

(2)逆向檔案頻率(Inverse Document Frequency,IDF)是一個詞語普遍重要性的度量。某一特定詞語的IDF,可以由總檔案數目除以包含該詞語之檔案的數目,再將得到的商取對數得到。即文件總數n與詞w所出現檔案數docs(w, D)比值的對數。 


 

TF-IDF根據 tf 和 idf 為每一個文件d和由關鍵詞w[1]…w[k]組成的查詢串q計算一個權值,用於表示查詢串q與文件d的匹配度:


 

某一特定檔案內的高詞語頻率,以及該詞語在整個檔案集合中的低檔案頻率,可以產生出高權重的TF-IDF。因此,TF-IDF傾向於過濾掉常見的詞語,保留重要的詞語。

 

4.用sklearn進行TF-IDF預處理

   第一種方法是在用 CountVectorizer 類向量化之後再呼叫 TfidfTransformer 類進行預處理。第二種方法是直接用 TfidfVectorizer 完成向量化與 TF-IDF 預處理。

4.1 CountVectorizer 結合 TfidfTransformer

依舊用上面的文字,實現如下:


 
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  

 

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


 
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  

4.2 用 TfidfVectorizer

實現程式碼如下:


 
  1.  
  2.  
  3.  
  4.  

輸出:


 
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  

 

  

統計個數和計算頻率兩種方法雖然非常實用,但是也由其侷限性導致詞彙量可能變得非常大。詞彙量過大又將導致需要非常大的向量來編碼文件,從而對記憶體產生很大的要求,同時拖慢演算法的速度。滷煮會在後續的部落格中介紹優化方法。

相關文章