Spark MLlib LDA,如何推断一个新的未见过文档的主题分布?

14

我希望运用Spark MLlib中的LDA主题建模技术。我已经查看了这里的代码和说明,但是我无法找到如何使用模型找出新未见过的文档的主题分布。

1个回答

14

截至Spark 1.5版,DistributedLDAModel并没有实现这个功能。您需要做的是使用toLocal方法将模型转换为LocalLDAModel,然后调用topicDistributions(documents: RDD[(Long, Vector)])方法,其中documents是新的(即非训练)文档,类似于以下内容:

newDocuments: RDD[(Long, Vector)] = ...
val topicDistributions = distLDA.toLocal.topicDistributions(newDocuments)

这个方法不如这篇文章中建议的EM算法准确,但是它可以工作。或者,你可以使用新的在线变分EM训练算法,它已经生成了LocalLDAModel。除了更快之外,这种新算法还更可取,因为它优化文档主题混合权重的狄利克雷先验参数(alpha),而不像旧的EM算法用于拟合DistributedLDAModels时,只优化其他参数。根据Wallach等人的说法,优化alphas对于获得好的主题非常重要。


1
谢谢。这个答案非常有用!如果可能的话,您能否详细说明如何将topicDistributions的输出提取为更具代表性的结果? - HappyCoding
我已经实现了这个功能,并展示了如何打印主题分布在这里 - alex9311
1.6 有什么变化吗? - Evan Zamir
distLDA.toLocal.XXX在Python中是否有效,还是只有Scala有效?只有topicDistributions有效吗,还是其他所有函数也有效? - Geoffrey Anderson
@alex9311 尽管你的代码也许证明了我的错误,但 Apache 文档 v 2.1.0 实际上说 topicDistribution 在 localLDAModel 中是缺失的,这使得你的代码非常有趣!我无法解释这一点。 "Local LDA model. This model stores only the inferred topics." 和 "Distributed LDA model. This model stores the inferred topics, the full training dataset, and the topic distributions." - Geoffrey Anderson
我在使用pyspark实现模型时,发现ldamodel中的toLocal和topicDistributions属性不可用。我正在使用spark 2.1.1版本。你们能否看一下我的问题[question] (https://stackoverflow.com/questions/55808041/spark-2-1-1-how-to-predict-topics-in-unseen-documents-on-already-trained-lda-mo/55820586#55820586)? - Usman Khan

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