本篇blog是利用Python進行文章特征提取的續篇,主要介紹構建帶TF-IDF權重的文章特征向量。
In [1]:
# 帶TF-IDF權重的擴展詞庫 # 在第一篇文檔里 主要是利用詞庫模型簡單判斷單詞是否在文檔中出現。然而與單詞的順序、頻率無關。然后詞的頻率對文檔更有意義。因此本文將詞頻加入特征向量
In [2]:
# 1.計算單詞在文檔中的頻率 from sklearn.feature_extraction.text import CountVectorizer
In [5]:
documents=['The dog ate a sandwich, the wizard transfigured a sandwich, and I ate a sandwich'] vector=CountVectorizer(stop_words='english') print(vector.fit_transform(documents).todense()) print(vector.vocabulary_)
In [ ]:
# 2.逆向文檔率(IDF) # 但是在對比長度不同的文檔時候,問題就變得復雜了。sklearn提供了TfdfTransformer類來解決問題, #主要是對詞頻特征向量歸一化實現不同文檔向量的可比性。該類使用L2范式對特征向量進行歸一化: #另外,還有對數詞頻調整方法(logarithmically scaled term frequencies),把詞頻調整到一個更小的范圍,或者詞頻放大法(augmented term frequencies),適用於消除較長文檔的差異。 #歸一化,對數調整詞頻和詞頻放大三支方法都消除文檔不同大小對詞頻的影響。 # 對於消除頻率高但是很普通的詞對文檔影響,引進了 逆文檔頻率(inverse document frequency,IDF),用來度量文檔集中單詞的頻率。 # TfdfTransformer類默認返回TF-IDF值,其參數use_idf默認為True #sklearn提供了TfidfVectorizer類將CountVectorizer和TfdfTransformer類封裝在一起。代碼如下:
In [6]:
from sklearn.feature_extraction.text import TfidfVectorizer documents=['The dog ate a sandwich and I ate a sandwich','The wizard transfigured a sandwich'] vector=TfidfVectorizer(stop_words='english') print(vector.fit_transform(documents).todense()) print(vector.vocabulary_)
In [7]:
# 3. 通過哈希表來實現特征向量 # 在計算文檔詞頻和IDF值時,都是先通過建立詞典,然后創建特征向量。但是如果文檔集特別大,就會引起內存耗盡的問題。 # 因此,可以采取利用哈希表來解決上述問題。sklearn提供了HashingVectorizer來實現,代碼如下:
In [9]:
from sklearn.feature_extraction.text import HashingVectorizer documents=['The dog ate a sandwich and I ate a sandwich','The wizard transfigured a sandwich'] vector=HashingVectorizer(n_features=5) print(vector.transform(documents).todense())
In [ ]:
#哈希技巧是無固定狀態的(stateless),它把任意的數據塊映射到固定數目的位置,並且保證相同的輸入一定產生相同的輸出,不同的輸入盡可能產生不同的輸出。它可以用並行,線上,流式傳輸創建特征向量,因為它初始化是不需要文集輸入。n_features是一個可選參數,默認值是 2的20次方。 #用帶符號哈希函數可以把詞塊發生哈希碰撞的概率相互抵消掉,信息損失比信息損失的同時出現信息 #冗余要好。哈希技巧的一個不足是模型的結果更難察看,由於哈希函數不能顯示哪個詞塊映射到特征 #向量的哪個位置了。 # 特別感謝《Mastering Machine Learning With scikit-learn》一書。