并行化DictVectorizer创建

时间:2014-12-27 19:19:02

标签: python dictionary scikit-learn

我想知道是否可以合并多个DictVectorizers。这是一个例子:

  1. 我有4个文本文件。
  2. 每个文档都发送到一个单独的线程,该线程生成一个功能字典。
  3. 当线程返回时,字典会一起放入列表中。
  4. 字典列表将发送给DictVectorizer。
  5. 最后一步占据了运行时间。我不希望线程返回字典,而是希望它们返回自己的DictVectorizers,并在最后合并DictVectorizers。我意识到这将需要更改生成的DictVectorizer中的索引(因为某些功能可能不存在/存在于不同的文档中)。

    TL; DR - 有没有办法从字典列表中并行创建DictVectorizer?

1 个答案:

答案 0 :(得分: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),这样就不会发生碰撞。