我已经通过Python API在spark中成功训练了LDA模型:
from pyspark.mllib.clustering import LDA
model=LDA.train(corpus,k=10)
Run Code Online (Sandbox Code Playgroud)
这完全正常,但我现在需要LDA模型的文档 -主题矩阵,但据我所知,我能得到的是使用的单词 -topic model.topicsMatrix().
有没有办法从LDA模型中获取文档主题矩阵,如果没有,是否有一种替代方法(除了从零开始实现LDA)以运行LDA模型,它将为我提供我需要的结果?
编辑:
经过深入挖掘后,我在Java api中找到了DistributedLDAModel的文档topicDistributions(),我认为这正是我所需要的(但我敢肯定,如果Pyspark中的LDAModel实际上是一个在引擎盖下的DistributedLDAModel ...).
无论如何,我可以像这样间接调用这个方法,没有任何明显的失败:
In [127]: model.call('topicDistributions')
Out[127]: MapPartitionsRDD[3156] at mapPartitions at PythonMLLibAPI.scala:1480
Run Code Online (Sandbox Code Playgroud)
但是如果我真的看结果,我得到的只是字符串告诉我结果实际上是一个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'}]
Run Code Online (Sandbox Code Playgroud)
也许这通常是正确的方法,但有没有办法获得实际结果?
我正在努力创建一个 LDA 模型。
这是我到目前为止所做的 - 创建了一个 unigram 并根据这篇文章将数据帧转换为 RDD 。
这是代码:
countVectors = CountVectorizer(inputCol="unigrams", outputCol="features", vocabSize=3, minDF=2.0)
model = countVectors.fit(res)
result = model.transform(res)
result.show(5, truncate=False)
Run Code Online (Sandbox Code Playgroud)
这是数据集
+------------------------------------------------------------------------+---+-------------------+
|unigrams |id |features |
+------------------------------------------------------------------------+---+-------------------+
|[born, furyth, leaguenemesi, rise, (the, leaguenemesi, rise, seri, book]|0 |(3,[0,1],[1.0,1.0])|
|[hous, raven, (the, nightfal, chronicl, book] |1 |(3,[0,1],[1.0,1.0])|
|[law, 101everyth, need, know, american, law, fourth, edit] |2 |(3,[],[]) |
|[hot, summer, night] |3 |(3,[],[]) |
|[wet, bundlemega, collect, sex, stori, (30, book, box, set)] |4 |(3,[0],[1.0]) …Run Code Online (Sandbox Code Playgroud)