繁体   English   中英

Sklearn TFIDF矢量化程序作为并行作业运行

[英]Sklearn TFIDF vectorizer to run as parallel jobs

如何运行sklearn TFIDF vectorizer(和COUNT vectorizer)作为并行作业运行? 与其他sklearn模型中的n_jobs = -1参数类似的东西。

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

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

只需单独计算部分term-doc矩阵,并在完成所有作业后将它们连接起来。 此时,您还可以在连接矩阵上运行TfidfTransformer

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

以前的答案很好但是我想在一个例子中进行扩展,并且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)

之前的解决方案是从这里开始的改编。

我希望它有所帮助。 在我的情况下,它减少了很多时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM