2014-12-27 30 views
1

我想知道是否可以合併多個DictVectorizer。這裏有一個例子:並行化DictVectorizer創建

  1. 我有4個文本文檔。
  2. 每個文檔被髮送到一個單獨的線程,生成一個功能字典。
  3. 線程返回時,字典一起放入列表中。
  4. 字典列表被髮送到DictVectorizer。

最後一步主導運行時間。我不希望線程返回字典,而是希望它們返回它們自己的DictVectorizer,並在最後合併DictVectorizer。我意識到這將需要改變生成的DictVectorizer中的索引(因爲某些功能可能不存在/存在於不同的文檔中)。

TL; DR - 有沒有什麼方法可以從字典列表中並行創建DictVectorizer?

回答

1

我不認爲有一種有效的方法來結合幾個DictVectorizer的輸出。你可以通過第一遍合適的方式來構建字典,然後將字典合併爲一個包含所有特徵的大字典,最後通過傳遞給每個DictVectorizer的整個集合進行轉換,最後堆疊結果矩陣。這是不必要的複雜,並不能保證你提高速度。

並行化是FeatureHasher的理想用例。它也可以接受字典(feature_name,value)。例如:

from sklearn.feature_extraction FeatureHasher 
import scipy 

vect = FeatureHasher(n_features=4, non_negative=True) 

# thread 1 
l1 = [{'foo': 1, 'bar': 2}] 
X1 = vect.fit_transform(l1) 
# thread 2 
l2 = [{'foo': 3, 'baz': 1}] 
X2 = vect.fit_transform(l2) 

在年底合併結果:

>>> scipy.sparse.vstack([X1, X2]).toarray() 
array([[ 1., 2., 0., 0.], 
     [ 3., 0., 1., 0.]]) 

只要確保你使用的功能,足夠大的數字(如2 ** 18),因此不存在衝突。

+0

非常感謝!這非常有效。請注意,我不需要「toarray()」調用。我能夠將scipy.sparse.vstack直接傳遞給我的LinearSVC來執行擬合。 – Naijaba 2014-12-31 02:47:15

+0

@Naijaba,很高興聽到!你說得對,'toarray()'只是爲了說明。請記住,有些算法不接受稀疏矩陣。 – elyase 2014-12-31 12:10:17