2014-04-04 35 views
3

我想製作一個2D二進制數組(n_samples,n_features),其中每個樣本是一個文本字符串,每個要素都是一個單詞(unigram)。如何在python中使用HashingVectorizer時獲取功能名稱?

問題是樣本數量是350000,功能數量是40000,但我的RAM大小隻有4GB。

  1. 使用CountVectorizer後出現內存錯誤。那麼,有沒有其他方式(如小批量)來做到這一點?

  2. 如果我使用HashingVectorizer,那麼如何獲取feature_names?即哪個列對應哪個特徵?,因爲get_feature_names()方法在HashingVectorizer中不可用。

+0

[哈希技巧](https://en.wikipedia.org/wiki/Feature_hashing)的目的是獲得文本*的合理向量表示,而不存儲特徵名稱。 –

回答

3
  1. 迷你批不countvectorizer支持。但是,sklearn的哈希矢量化器可以使用partial_fit()

  2. 引用sklearn文檔「無法計算逆向變換(從要素索引到字符串要素名稱),這在試圖反思哪些要素對模型最重要時可能會成爲問題。」

0

要獲得HashingVectorizer你可以採取的文件隨機抽樣的功能名稱,計算哈希對他們瞭解哪些散列對應於令牌這種方式。這是不完美的,因爲可能存在與給定列對應的其他令牌,並且可能存在衝突,但通常這足以檢查向量化結果(或例如使用散列特徵的線性分類器的係數)。

一個無恥的插件 - https://github.com/TeamHG-Memex/eli5軟件包此實施:

from eli5.sklearn import InvertableHashingVectorizer 

# vec should be a HashingVectorizer instance 
ivec = InvertableHashingVectorizer(vec) 
ivec.fit(docs_sample) # e.g. each 10-th or 100-th document 
names = ivec.get_feature_names() 

參見:eli5文檔Debugging Hashing Vectorizer部分。

相關問題