1. 程式人生 > >文字挖掘預處理之向量化與Hash Trick

文字挖掘預處理之向量化與Hash Trick

文字挖掘的分詞原理中,我們講到了文字挖掘的預處理的關鍵一步:“分詞”,而在做了分詞後,如果我們是做文字分類聚類,則後面關鍵的特徵預處理步驟有向量化或向量化的特例Hash Trick,本文我們就對向量化和特例Hash Trick預處理方法做一個總結。

1. 詞袋模型

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

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

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

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

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

2. 詞袋模型之向量化

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

from sklearn.feature_extraction.text import CountVectorizer  
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"] 
print vectorizer.fit_transform(corpus)
 我們看看對於上面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
  (2, 0)	1
  (2, 12)	1
  (2, 7)	1
  (3, 10)	1
  (3, 8)	1
  (3, 11)	1
  (3, 18)	1
  (3, 17)	1
  (3, 13)	1
  (3, 5)	1
  (3, 6)	1
  (3, 15)	1

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

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

print vectorizer.fit_transform(corpus).toarray()
print vectorizer.get_feature_names()

 輸出如下:

[[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]]
[u'and', u'apple', u'car', u'china', u'come', u'in', u'is', u'love', u'papers', u'polupar', u'science', u'some', u'tea', u'the', u'this', u'to', u'travel', u'work', u'write']

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

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

    將文字做了詞頻統計後,我們一般會通過TF-IDF進行詞特徵值修訂,這部分我們後面再講。

    向量化的方法很好用,也很直接,但是在有些場景下很難使用,比如分詞後的詞彙表非常大,達到100萬+,此時如果我們直接使用向量化的方法,將對應的樣本對應特徵矩陣載入記憶體,有可能將記憶體撐爆,在這種情況下我們怎麼辦呢?第一反應是我們要進行特徵的降維,說的沒錯!而Hash Trick就是非常常用的文字特徵降維方法。

3.  Hash Trick

    在大規模的文字處理中,由於特徵的維度對應分詞詞彙表的大小,所以維度可能非常恐怖,此時需要進行降維,不能直接用我們上一節的向量化方法。而最常用的文字降維方法是Hash Trick。說到Hash,一點也不神祕,學過資料結構的同學都知道。這裡的Hash意義也類似。

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

ϕ¯(j)=iJ;h(i)=jϕ(i)ϕ¯(j)=∑i∈J;h(i)=jϕ(i)

其中JJ是原始特徵的維度。

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

ξ:N±1ξ:N→±1

    此時我們有

ϕ¯(j)=iJ;h(i)=jξ(i)ϕ(i)ϕ¯(j)=∑i∈J;h(i)=jξ(i)ϕ(i)

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

    當然,大家會有疑惑,這種方法來處理特徵,雜湊後的特徵是否能夠很好的代表雜湊前的特徵呢?從實際應用中說,由於文字特徵的高稀疏性,這麼做是可行的。如果大家對理論上為何這種方法有效,建議參考論文:Feature hashing for large scale multitask learning.這裡就不多說了。


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

from sklearn.feature_extraction.text import HashingVectorizer 
vectorizer2=HashingVectorizer(n_features = 6,norm = None)
print vectorizer2.fit_transform(corpus)

輸出如下:

  (0, 1)	2.0
  (0, 2)	-1.0
  (0, 4)	1.0
  (0, 5)	-1.0
  (1, 0)	1.0
  (1, 1)	1.0
  (1, 2)	-1.0
  (1, 5)	-1.0
  (2, 0)	2.0
  (2, 5)	-2.0
  (3, 0)	0.0
  (3, 1)	4.0
  (3, 2)	-1.0
  (3, 3)	1.0
  (3, 5)	-1.0

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

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

4. 向量化與Hash Trick小結

    這裡我們對向量化與它的特例Hash Trick做一個總結。在特徵預處理的時候,我們什麼時候用一般意義的向量化,什麼時候用Hash Trick呢?標準也很簡單。

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

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

    向量化與Hash Trick就介紹到這裡,下一篇我們討論TF-IDF。

轉載地址

相關推薦

文字挖掘處理量化Hash Trick

在文字挖掘的分詞原理中,我們講到了文字挖掘的預處理的關鍵一步:“分詞”,而在做了分詞後,如果我們是做文字分類聚類,則後面關鍵的特徵預處理步驟有向量化或向量化的特例Hash Trick,本文我們就對向量化和特例Hash Trick預處理方法做一個總結。 1. 詞袋模型

文字挖掘處理TF-IDF

    在文字挖掘預處理之向量化與Hash Trick中我們講到在文字挖掘的預處理中,向量化之後一般都伴隨著TF-IDF的處理,那麼什麼是TF-IDF,為什麼一般我們要加這一步預處理呢?這裡就對TF-IDF的原理做一個總結。 1. 文字向量化特徵的不足     在將文字分詞並向量化後,我們可以得到詞彙表中每個

【python】 文字挖掘處理TF-IDF

轉自: 文字挖掘預處理之TF-IDF - 劉建平Pinard - 部落格園 https://www.cnblogs.com/pinard/p/6693230.html   在文字挖掘預處理之向量化與Hash Trick中我們講到在文字挖掘的預處理中,向量化之後一般都伴

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

前言原文連結:http://www.cnblogs.com/pinard/p/6756534.h

文字挖掘處理的流程總結(轉)

最近半年一直忙於專案,部落格也很少更新咯。有幾個專案做了不少JS相關的工作,基本都可以利用現成的開源方案,諸如angularJs、requireJs、bootstrap、knockoutJs、TypeScript、Jquery等等;之後也有專案是無UI的,純後端

自然語言處理情感分析觀點挖掘

觀點、情感以及與之相關的許多概念,如評價、評估、態度、感情、情緒和心情,與我們主觀的感覺和感受密切相關。這些是人類心理活動的核心要素,也是影響人們日常行為的關鍵因素。情感分析也稱為觀點挖掘,是一個旨在利用可計算的方法從自然語言文字中提取觀點和情感資訊的研究課題。 一.情感分

資料處理抽取文字資訊(2)

摘要:大資料技術與我們日常生活越來越緊密,要做大資料,首要解決資料問題。原始資料存在大量不完整、不一致、有異常的資料,嚴重影響到資料建模的執行效率,甚至可能導致模型結果的偏差,因此要資料預處。資料預處理主要是將原始資料經過文字抽取、資料清理、資料整合、資料處理、資料變換、資料降維等處理後,不

Deep Learning 3_深度學習UFLDL教程:處理主成分分析白化_總結(斯坦福大學深度學習教程)

1PCA     ①PCA的作用:一是降維;二是可用於資料視覺化; 注意:降維的原因是因為原始資料太大,希望提高訓練速度但又不希望產生很大的誤差。     ② PCA的使用場合:一是希望提高訓練速度;二是記憶體太小;三是希望資料視覺化。     ③用PCA前的預處理:(1)規整化特徵的均值大致為0;(

資料處理定量特徵二值化定性特徵啞變數編碼

1. 定量特徵二值化      在資料探勘領域,定量特徵二值化的目的是為了對定量的特徵進行“好與壞”的劃分,以剔除冗餘資訊。舉個例子,銀行對5名客戶的徵信進行打分,分別為50,60,70,80,90。現

數字影象處理MATLAB—量化迴圈—分配陣列

優化MATLAB程式碼方法 數字影象處理中: MATLAB是一種專門為陣列運算而設計的程式語言。 這裡討論兩種優化MATLAB程式碼方法。 1. 向量化迴圈: MATLAB會自動處理索引h。當座標中涉及0時,會有混亂之源,因為本書和手冊中反覆強調M

【機器學習】數據處理將類別數據轉換為數值

行數據 pri and slab form ces nbsp 遍歷 encode 在進行python數據分析的時候,首先要進行數據預處理。 有時候不得不處理一些非數值類別的數據,嗯, 今天要說的就是面對這些數據該如何處理。 目前了解到的大概有三種方法: 1,通過LabelE

6、C_宏定義處理、函數函數庫

a10 使用 不可 find 字符串比較 pos cde 文件包含 mnt C語言預處理理論 由源碼到可執行程序的過程 源碼.c->(編譯)->elf可執行程序 源碼.c->(編譯)->目標文件.o->(鏈接)->elf可執行程

數據處理離散化

存在 Go 行處理 variable RR OS 個數 連接 ssi 按照我們對於變量的分類:分為數值變量和分類變量,數值變量可以分為連續型和離散型,分類變量又有有序的和無序的。下面我將介紹一些對於這些變量進行離散化處理。 無序分類變量的離散化方法: 比如在泰坦尼克

數據處理標準化

select 有意 rand 附近 繼續 行數 sts 分享圖片 border 數據的標準化(Standardization)和歸一化(Normalization)有什麽區別? 關於數據的標準化和歸一化區別的說法有點亂。總的來說有這麽幾種分法 1:不做區分,都意味著標準化。

131.003 數據處理Dummy Variable & One-Hot Encoding

table pandas 文化 影響 部分 href reg int 兩個 @(131 - Machine Learning | 機器學習) Dummy Variable 虛擬變量的含義 虛擬變量又稱虛設變量、名義變量或啞變量,用以反映質的屬性的一個人工變量,是量化了的質變

圖像處理圖像翻轉、圖像色彩調整

tran 色相 target get pytho pan aip highlight clas 圖像翻轉 tf.image.flip_up_down:上下翻轉 tf.image.flip_left_right:左右翻轉 tf.image.transpose_image:對

記一次800多萬XML文字檔案處理經歷

一.背景 由於某些需求,現需對系統在最近幾個月生成的xml檔案進行預處理,提取<text>標籤內的資料進行分析。這些需要預處理的資料大概有280GB左右880多萬,存放在gysl目錄下,gysl的下一層按天命名,分為若干個目錄,接下來一層目錄下又有多個目錄,我們所需的xml目錄就在這一層。我們現

資料處理資料抽樣

資料抽樣 在資料建模階段,一般需要將樣本分為3部分:訓練集、驗證集、測試集。訓練集用來估計模型,驗證集用來確定網路結構或者控制模型複雜度的引數,測試集檢驗最終選擇模型的效能如何。一般劃分為70%、15%、15%。當資料量較小時,留少部分作為測試集,把其餘N個樣本採用K折交叉驗證法。即將樣

資料處理缺失值處理

資料預處理.1 缺失值處理 刪除法 刪除小部分樣本,在樣本量大時(刪除部分所佔比例小於5%時)可以使用 插補法 —均值插補:分為定距型(插入均值)和非定距型(眾數或者中值) —迴歸插補:線性和非線性迴歸 —極大似然估計M

3-6 用 Pandas 進行資料處理:資料清洗視覺化(版本:py3)

主要內容: 格式轉換 缺失資料 異常資料 資料標準化操作 格式轉換 如Python記錄時間的方式,不能夠直接實現減運算,就需要進行轉換 pandas.to_datetime 缺失資料 忽略缺失資料 直接標記 利用平均值、最常出現值進行填充 異常資料 處