我有一系列文档(~50,000),我已经转换为语料库并使用R中的topicmodels包构建LDA对象。不幸的是,为了测试超过150个主题,需要几个小时
到目前为止,我发现我可以使用以下方法同时测试几种不同的簇大小:
library(topicmodels)
library(plyr)
library(foreach)
library(doMC)
registerDoMC(5) # use 5 cores
dtm # my documenttermmatrix
seq <- seq(200,500, by=50)
models <- llply(seq, function(d){LDA(dtm, d)}, .parallel=T)
是否有办法并行化LDA功能以使其运行得更快(而不是一次运行多个LDA)?
答案 0 :(得分:3)
我不熟悉LDA功能,但是假设您将语料库分成16个部分,并将每个部分放在名为corpus16list
的列表中。
要并行运行,您通常会执行以下操作:
library( doParallel )
cl <- makeCluster( 16 ) # for 16 processors
registerDoParallel( cl )
# now start the chains
nchains <- 16
my_k <- 6 ## or a vector with 16 elements
results_list <- foreach(i=1:nchains ,
.packages = c( 'topicmodels') %dopar% {
result <- LDA(corpus16list[[i]], k=my_k , control = my_control)}, .progress = "text"))
return(result) }
结果是results_list
,这是一个包含16个链中16个输出的列表。您可以根据需要加入它们,或者在foreach中使用.combine
函数(这超出了本问题的范围)。
您可以使用i
发送control
,k
或您需要的任何值的不同值。
此代码应该适用于Windows和Linux,以及您需要多少内核。
答案 1 :(得分:0)
我认为您不能并行化LDA模型本身,因为它正在优化最大可能性,因此它需要知道先前的可能性才能进行优化。