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

sba*_*jis 10 python scikit-learn

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

Ali*_*Oli 11

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

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

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

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

  • 净值。我知道了。我使用了`scipy.sparse.vstack`。 (2认同)

Raf*_*ero 5

先前的答案很好,但是我想在一个示例中进行扩展,并且不推荐使用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))
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法来转换数据:

print("Transforming tf-idf features...")
tfidf = tfidf_vectorizer.transform(data_pd['text'])
print("done in %0.3fs." % (time() - t0))
Run Code Online (Sandbox Code Playgroud)

这是可以并行化的一点,我建议类似以下内容:

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)
Run Code Online (Sandbox Code Playgroud)

先前的解决方案是从此处改编的。

希望对您有所帮助。就我而言,它大大减少了时间。

  • 截至 2020 年 4 月,我在 sklearn 文档或讨论中找不到任何关于“HashingVectorizer”被弃用的提及。如果您看到相反的情况,请发布链接。 (3认同)