文本挖掘预处理:向量化与Hash Trick
1. 向量化
1.1 概念
? ? ? ?詞袋模型在分詞之后,通過統計每個詞在文本中出現的次數,就可以得到該文本基于詞的特征,如果將各個文本樣本的這些詞與對應的詞頻放在一起,就是我們常說的向量化。向量化完畢后一般也會使用TF-IDF進行特征的權重修正,再將特征進行標準化。 再進行一些其他的特征工程后,就可以將數據帶入機器學習算法進行分類聚類了。
? ? ? ?在詞袋模型的統計詞頻這一步,會得到該文本中所有詞的詞頻,有了詞頻,我們就可以用詞向量表示這個文本。
1.2 向量化方式
(1)One-hot表示方式/詞袋模型
? ? 優點:
- ?解決了分類器不好處理離散數據的問題
- ?在一定程度上也起到了擴充特征的作用
? ?缺點:
- 不考慮詞與詞之間的順序
- 其假設詞與詞之間相互獨立(大多數情況下,詞與詞之間是相互有關聯的)
- 得到的特征是離散稀疏的
(2)N-gram
優點:
- 考慮了詞的順序,信息量更充分
缺點:
- 詞表迅速膨脹,數據出現大量的稀疏化問題
- 每增加一個詞,模型參數增加40萬倍
- 無法衡量詞項量之間的關系
(3)word2vec?
3. ?Hash Trick
? ? 將文本做了詞頻統計后,我們一般會通過TF-IDF進行詞特征值修訂。向量化的方法很好用,也很直接,但是在有些場景下很難使用,比如分詞后的詞匯表非常大,達到100萬+,此時如果我們直接使用向量化的方法,將對應的樣本對應特征矩陣載入內存,有可能將內存撐爆,在這種情況下怎么辦呢?第一反應是要進行特征的降維,說的沒錯!而Hash Trick就是常用的文本特征降維方法。
? ? ? ? 在大規模的文本處理中,由于特征的維度對應分詞詞匯表的大小,所以維度可能非常恐怖,此時需要進行降維,不能直接用上一節的向量化方法。而最常用的文本降維方法是Hash Trick。說到Hash,一點也不神秘,學過數據結構的同學都知道。這里的Hash意義也類似。
? ? ? ?那么,這種方法來處理特征,哈希后的特征是否能夠很好的代表哈希前的特征呢?從實際應用中說,由于文本特征的高稀疏性,這么做是可行的。理論研究參考論文:Feature hashing for large scale multitask learning.。
在scikit-learn的HashingVectorizer類中,實現了基于signed hash trick的算法,其為hash trick的變種。這里就用HashingVectorizer來實踐一下Hash Trick,為了簡單,使用上面的19維詞匯表,并哈希降維到6維。當然在實際應用中,19維的數據根本不需要Hash Trick,這里只是做一個演示,代碼如下:
向量化:
# 向量化 from sklearn.feature_extraction.text import CountVectorizer# 實例化分詞對象 vec = CountVectorizer(min_df=1) # 將文本進行詞袋處理 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"]X = vec.fit_transform(corpus) print('CountVectorizer:\n',X)CountVectorizer:
? (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?
特例:Hsah trick?
# 特例:Hsah trick from sklearn.feature_extraction.text import HashingVectorizervectorizer2=HashingVectorizer(n_features=6,norm=None) X2 = vectorizer2.fit_transform(corpus)print('HashingVectorizer:\n', X2)HashingVectorizer:
? ?(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?
和PCA類似,Hash Trick降維后的特征,已經不知道它代表的特征名字和意義。此時不能像向量化時候可以知道每一列的意義,所以Hash Trick的解釋性不強。
4.?向量化與Hash Trick小結
在特征預處理的時候,什么時候用一般意義的向量化,什么時候用Hash Trick呢?標準也很簡單。
一般來說,只要詞匯表的特征不至于太大,大到內存不夠用,肯定是使用一般意義的向量化比較好。因為向量化的方法解釋性很強,我們知道每一維特征對應哪一個詞,進而我們還可以使用TF-IDF對各個詞特征的權重修改,進一步完善特征的表示。
而Hash Trick用大規模機器學習上,此時我們的詞匯量極大,使用向量化方法內存不夠用,而使用Hash Trick降維速度很快,降維后的特征仍然可以幫我們完成后續的分類和聚類工作。當然由于分布式計算框架的存在,其實一般我們不會出現內存不夠的情況。因此,實際工作中我使用的都是特征向量化。
總結
以上是生活随笔為你收集整理的文本挖掘预处理:向量化与Hash Trick的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: word2vec原理(五):skip-g
- 下一篇: Keras学习代码—github官网ex