如何使用 pyspark(2.1.0) LdA 获取与每个文档相关的主题?

Posted

技术标签:

【中文标题】如何使用 pyspark(2.1.0) LdA 获取与每个文档相关的主题?【英文标题】:How to get topic associated with each document using pyspark(2.1.0) LdA? 【发布时间】:2017-06-16 22:36:40 【问题描述】:

我正在使用 pyspark 的 LDAModel 从语料库中获取主题。我的目标是找到与每个文档相关的主题。为此,我尝试根据 Docs 设置 topicDistributionCol。由于我是新手,我不确定这个专栏的目的是什么。

from pyspark.ml.clustering import LDA
lda_model = LDA(k=10, optimizer="em").setTopicDistributionCol("topicDistributionCol")
// documents is valid dataset for this lda model
lda_model = lda_model.fit(documents)
transformed = lda_model.transform(documents)

topics = lda_model.describeTopics(maxTermsPerTopic=num_words_per_topic)
print("The topics described by their top-weighted terms:")
print topics.show(truncate=False)

它列出了所有带有 termIndices 和 termWeights 的主题。

下面的代码会给我 topicDistributionCol。这里的每一行代表每个文档。

print transformed.select("topicDistributionCol").show(truncate=False)

我想得到这样的文档主题矩阵。 pysparks LDA 模型有可能吗?

doc | topic 
1   |  [2,4]
2   |  [3,4,6]

注意:我之前使用 gensims LDA 模型使用以下代码完成了此操作。但我需要使用 pysparks LDA 模型。

texts = [[word for word in document.lower().split() if word not in stoplist] for document in documents]
dictionary = corpora.Dictionary(texts)

corpus = [dictionary.doc2bow(text) for text in texts]
doc_topics = LdaModel(corpus=corpus, id2word=dictionary, num_topics=10, passes=10)
## to fetch topics for one document
vec_bow = dictionary.doc2bow(text[0])
Topics = doc_topics[vec_bow]
Topic_list = [x[0] for x in Topics]
## topic list is [1,5]

【问题讨论】:

【参考方案1】:

我认为这个问题有一个简单的答案。执行以下操作:

transformed.take(10)

输出的最后一列将是“topicDistribution”,即文档-主题分布。

【讨论】:

【参考方案2】:

使用 toPandas 可以提供帮助:

df_p = transformed.select('topicDistributionCol').toPandas()
df_p1 = df_p.topicDistribution.apply(lambda x:np.array(x))
df_p2 = pd.DataFrame(df_p1.tolist()).apply(lambda x:x.argmax(),axis=1)
df_p3 = df_p2.reset_index()
df_p3.columns = ['doc','topic']
df_p3

【讨论】:

以上是关于如何使用 pyspark(2.1.0) LdA 获取与每个文档相关的主题?的主要内容,如果未能解决你的问题,请参考以下文章

LDA 与 topicmodels,我如何查看不同文档属于哪些主题?

如何使用 pyspark 2.1.0 选择另一个数据框中不存在的行?

如何根据Pyspark中数据框中的条件设置新的列表值?

如何在我的 pyspark 代码中访问 S3 中的 Amazon kinesis 流文件?

如何使用 dlib 的 LDA

如何解释 LDA 组件(使用 sklearn)?