如何使用sklearn LDA启用多核处理?

时间:2019-02-01 16:43:57

标签: python-3.x multithreading scikit-learn multicore lda

我有一个使用sklearn LDA的主题模型。我的语料库有〜75K 文档,从语料库生成的矩阵形状为X.shape = (74645, 91542)

当我将此矩阵传递给sklearn LDA时,在本地和服务器上需要3个小时,而在 11个小时

所以我的问题是:

是否可以在sklearn LDA中使用多核处理?还是有办法大大减少我的处理时间?

任何帮助将不胜感激。

请看一下代码:

生成lda_output的行需要几个小时才能运行

vectorizer = CountVectorizer(stop_words='english', ngram_range= (1,2), vocabulary = word_list)
X = vectorizer.fit_transform(documents)

lda_model = LatentDirichletAllocation(n_components=50,            # Number of topics
                                      learning_decay=0.7,
                                      max_iter=10,               # Max learning iterations
                                      learning_method='online',
                                      random_state=100,          # Random state
                                      batch_size=128,            # n docs in each learning iter
                                      evaluate_every = -1,       # compute perplexity every n iters, default: Don't
                                      n_jobs = -1,               # Use all available CPUs
                                     )

#--Because before this line system was running out of memory

%env JOBLIB_TEMP_FOLDER=/tmp

start_time = datetime.datetime.now()

lda_output = lda_model.fit_transform(X)

end_time = datetime.datetime.now()

run_time_lda = end_time - start_time

#output:
#datetime.timedelta(0, 38157, 730304) ~ 11hrs

1 个答案:

答案 0 :(得分:0)

您可能想重新考虑您的词汇表word_list,该词汇表似乎比文档数还多。如果可以解决您的问题,请尝试从文档本身构建词汇表。

还要指定min_df来删除频率非常低的单词。可能是残词化/词干可用于减少词汇量,这也有助于LDA学习更好的主题。

我建议不要对lda建模使用bigrams / trigram,因为它可能导致无法解释的模型。