如何并行化使用topicmodels R包

5
我有一系列文件(约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功能,以便它运行更快(而不是同时运行多个LDAs)?


1
抱歉,这里不清楚是什么问题? - tchakravarty
我该如何在R中的主题模型包中并行化LDA函数(类似于我发布的链接中所示的内容)。那里的讨论仅涵盖了Windows实现,这与其他操作系统有很大不同。我还想知道是否有其他替代方案,特别是在R中。 - Optimus
好的,我无法确定所提到的AWS服务器是否是“你”的服务器。那里列出的大部分代码应该适用于您--请在您的计算环境中报告不起作用的具体部分。 - tchakravarty
我会查一下的,Steve。谢谢。 - Optimus
如果您仍需要执行此操作,可以考虑使用Spark的实现。但请注意,预测功能尚未实现。 - Chris
显示剩余7条评论
2个回答

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来发送不同的 controlk 或其他你需要的值。
这段代码可在Windows和Linux上运行,并且能使用任意数量的核心。

OP已经有了独立并行运行LDA的代码,据我所知,他正在寻找算法本身的并行实现。 - tchakravarty
fg nu 是正确的,但感谢提供另一种脚本。 - Optimus
谢谢,我在 OP 编辑原问题之前就写了这个脚本。我不知道他已经有了并行脚本。 - dwcoder
我认为将这个问题的所有可能选项放在一个地方肯定是有帮助的。当你搜索这个问题时,没有太多的结果出现。 - Optimus

0
我认为你无法对 LDA 模型本身并行化处理,因为它正在优化最大似然函数,因此需要知道先前的似然函数以继续优化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接