Python Sklearn TFIDF矢量器作为并行作业运行

Python Sklearn TFIDF矢量器作为并行作业运行,python,scikit-learn,Python,Scikit Learn,如何运行sklearn TFIDF矢量器(和计数矢量器)以作为并行作业运行?类似于其他sklearn模型中的n_jobs=-1参数 这不可能直接实现,因为无法并行化/分发对这些矢量器所需词汇表的访问 要执行并行文档矢量化,请改用。scikit文档提供了使用此矢量器成批训练(和评估)分类器的方法。类似的工作流也适用于并行化,因为输入项映射到相同的向量索引,而并行工作者之间没有任何通信 只需单独计算部分术语doc矩阵,并在完成所有作业后将其连接起来。此时,还可以在串联矩阵上运行 不存储输入术语词汇表

如何运行sklearn TFIDF矢量器(和计数矢量器)以作为并行作业运行?类似于其他sklearn模型中的n_jobs=-1参数

这不可能直接实现,因为无法并行化/分发对这些矢量器所需词汇表的访问

要执行并行文档矢量化,请改用。scikit文档提供了使用此矢量器成批训练(和评估)分类器的方法。类似的工作流也适用于并行化,因为输入项映射到相同的向量索引,而并行工作者之间没有任何通信

只需单独计算部分术语doc矩阵,并在完成所有作业后将其连接起来。此时,还可以在串联矩阵上运行

不存储输入术语词汇表的最大缺点是很难找出哪些术语映射到最终矩阵中的哪列(即逆变换)。唯一有效的映射是对一个术语使用散列函数来查看它被分配给哪个列/索引。对于逆变换,您需要对所有唯一术语(即您的词汇表)执行此操作。

很好,但我想在示例中进行扩展,HashingVectorizer将被弃用。 我提供了一个独立的示例,您可以在其中看到经过的时间。 基本上,在安装矢量器(很难并行化)后,您可以进行变换(该位更容易并行化)

您可以使用以下内容来适应模型:

print("Extracting tf-idf features")
tfidf_vectorizer = TfidfVectorizer(stop_words='english')
t0 = time()
tfidf = tfidf_vectorizer.fit(data_pd['text'])
print("done in %0.3fs." % (time() - t0))
您可以通过以下方式转换数据:

print("Transforming tf-idf features...")
tfidf = tfidf_vectorizer.transform(data_pd['text'])
print("done in %0.3fs." % (time() - t0))
这是您可以并行化的位,我建议如下:

import multiprocessing
import pandas as pd
import numpy as np
from multiprocessing import Pool
import scipy.sparse as sp

num_cores = multiprocessing.cpu_count()
num_partitions = num_cores-2 # I like to leave some cores for other
#processes
print(num_partitions)

def parallelize_dataframe(df, func):
    a = np.array_split(df, num_partitions)
    del df
    pool = Pool(num_cores)
    #df = pd.concat(pool.map(func, [a,b,c,d,e]))
    df = sp.vstack(pool.map(func, a), format='csr')
    pool.close()
    pool.join()
    return df

def test_func(data):
    #print("Process working on: ",data)
    tfidf_matrix = tfidf_vectorizer.transform(data["text"])
    #return pd.DataFrame(tfidf_matrix.toarray())
    return tfidf_matrix

#df = pd.DataFrame({'col': [0,1,2,3,4,5,6,7,8,9]})
#df =  data_pd
tfidf_parallel = parallelize_dataframe(data_pd, test_func)
前面的解决方案是对的一种改编


我希望有帮助。在我的例子中,它大大减少了时间。

我喜欢这个答案,我正在尝试实现它,但是如何连接并行化的
哈希向量器的结果呢。我得到了它。我用了
scipy.sparse.vstack
。你能解释更多关于找回相应词汇的内容吗?@Lei这不是“找回”相应词汇的问题。
hashingvectorier
不会在内存中保留任何标记。它依赖于哈希函数在每次对令牌计数时获取整数令牌ID。如果值得的话,您可以通过其他方式找到词汇表,并使用哈希函数创建从令牌ID到令牌字符串的映射。截至2020年4月,我在sklearn文档或讨论中找不到任何关于
HashingVectorizer
被弃用的提及。如果你看到相反的情况,请发布一个链接。