我有一个使用 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
您可能需要重新考虑词汇word_list
,这似乎比您的文档计数还要大。 尝试从文档本身构建词汇表,如果它可以解决您的问题。
还要指定删除极低频率单词的min_df
。可能是词形还原/词干提取可用于减少词汇量,这也有助于 lda 学习更好的主题。
我建议不要使用 bigrams/trigrams 进行 lda 建模,因为这可能会导致无法解释的模型。