我通过python api成功地在spark中培训了一个lda模型:
from pyspark.mllib.clustering import LDA
model=LDA.train(corpus,k=10)
这完全可以,但是我现在需要lda模型的文档主题矩阵,但是据我所知,我能得到的只是单词topic,使用
model.topicsMatrix()
。是否有某种方法可以从LDA模型中获得文档主题矩阵,如果没有,Spark中是否有其他方法(而不是从头开始实现LDA)来运行一个LDA模型,该模型将给出我需要的结果?
编辑:
在挖掘了一点之后,我在JavaAPI中找到了DistributedLDAModel的文档,它有一个
topicDistributions()
,我认为这正是我需要的(但是我确信100%,如果Pyspark的LDAModel实际上是引擎盖下的一个分布式模型)。在任何情况下,我都可以像这样间接地调用此方法,而不会出现任何明显的失败:
In [127]: model.call('topicDistributions')
Out[127]: MapPartitionsRDD[3156] at mapPartitions at PythonMLLibAPI.scala:1480
但如果我真的看到结果,我得到的只是一个字符串,告诉我结果实际上是一个scala元组(我想):
In [128]: model.call('topicDistributions').take(5)
Out[128]:
[{u'__class__': u'scala.Tuple2'},
{u'__class__': u'scala.Tuple2'},
{u'__class__': u'scala.Tuple2'},
{u'__class__': u'scala.Tuple2'},
{u'__class__': u'scala.Tuple2'}]
也许这通常是正确的方法,但是有没有办法得到实际的结果呢?
最佳答案
经过广泛的研究,这绝对不可能通过当前版本的spark(1.5.1)上的python API实现。但在scala中,这是相当简单的(考虑到RDDdocuments
的训练内容):
import org.apache.spark.mllib.clustering.{LDA, DistributedLDAModel}
// first generate RDD of documents...
val numTopics = 10
val lda = new LDA().setK(numTopics).setMaxIterations(10)
val ldaModel = lda.run(documents)
# then convert to distributed LDA model
val distLDAModel = ldaModel.asInstanceOf[DistributedLDAModel]
那么获取文档主题分发就简单到:
distLDAModel.topicDistributions
关于python - 从Pyspark LDA模型中提取文档主题矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33072449/