使用 gensim 了解 LDA 实现

Posted

技术标签:

【中文标题】使用 gensim 了解 LDA 实现【英文标题】:Understanding LDA implementation using gensim 【发布时间】:2013-12-19 10:33:14 【问题描述】:

我试图了解 Python 中的 gensim 包如何实现潜在狄利克雷分配。我正在执行以下操作:

定义数据集

documents = ["Apple is releasing a new product", 
             "Amazon sells many things",
             "Microsoft announces Nokia acquisition"]             

删除停用词后,我创建字典和语料库:

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]

然后我定义 LDA 模型。

lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=5, update_every=1, chunksize=10000, passes=1)

然后我打印主题:

>>> lda.print_topics(5)
['0.181*things + 0.181*amazon + 0.181*many + 0.181*sells + 0.031*nokia + 0.031*microsoft + 0.031*apple + 0.031*announces + 0.031*acquisition + 0.031*product', '0.077*nokia + 0.077*announces + 0.077*acquisition + 0.077*apple + 0.077*many + 0.077*amazon + 0.077*sells + 0.077*microsoft + 0.077*things + 0.077*new', '0.181*microsoft + 0.181*announces + 0.181*acquisition + 0.181*nokia + 0.031*many + 0.031*sells + 0.031*amazon + 0.031*apple + 0.031*new + 0.031*is', '0.077*acquisition + 0.077*announces + 0.077*sells + 0.077*amazon + 0.077*many + 0.077*nokia + 0.077*microsoft + 0.077*releasing + 0.077*apple + 0.077*new', '0.158*releasing + 0.158*is + 0.158*product + 0.158*new + 0.157*apple + 0.027*sells + 0.027*nokia + 0.027*announces + 0.027*acquisition + 0.027*microsoft']
2013-12-03 13:26:21,878 : INFO : topic #0: 0.181*things + 0.181*amazon + 0.181*many + 0.181*sells + 0.031*nokia + 0.031*microsoft + 0.031*apple + 0.031*announces + 0.031*acquisition + 0.031*product
2013-12-03 13:26:21,880 : INFO : topic #1: 0.077*nokia + 0.077*announces + 0.077*acquisition + 0.077*apple + 0.077*many + 0.077*amazon + 0.077*sells + 0.077*microsoft + 0.077*things + 0.077*new
2013-12-03 13:26:21,880 : INFO : topic #2: 0.181*microsoft + 0.181*announces + 0.181*acquisition + 0.181*nokia + 0.031*many + 0.031*sells + 0.031*amazon + 0.031*apple + 0.031*new + 0.031*is
2013-12-03 13:26:21,881 : INFO : topic #3: 0.077*acquisition + 0.077*announces + 0.077*sells + 0.077*amazon + 0.077*many + 0.077*nokia + 0.077*microsoft + 0.077*releasing + 0.077*apple + 0.077*new
2013-12-03 13:26:21,881 : INFO : topic #4: 0.158*releasing + 0.158*is + 0.158*product + 0.158*new + 0.157*apple + 0.027*sells + 0.027*nokia + 0.027*announces + 0.027*acquisition + 0.027*microsoft
>>> 

我无法从这个结果中理解很多。它是否提供了每个单词出现的概率?另外,主题#1、主题#2等的含义是什么?我期待的东西或多或少类似于最重要的关键字。

我已经检查了gensim tutorial,但并没有太大帮助。

谢谢。

【问题讨论】:

只是让您知道这些数字是主题中每个单词的相对重要性。它们加起来不等于 1 的原因是因为默认情况下 print_topics 显示 10。如果显示 100 左右,总和将开始接近 1。 见rstudio-pubs-static.s3.amazonaws.com/… 【参考方案1】:

您正在寻找的答案在gensim tutorial 中。 lda.printTopics(k)k 随机选择的主题打印贡献最大的单词。可以假设这是(部分)每个给定主题上的单词分布,这意味着这些单词出现在左侧主题中的概率。

通常,人们会在大型语料库上运行 LDA。在非常小的样本上运行 LDA 不会得到最好的结果。

【讨论】:

..感谢您的回复...关于如何将语料库分成五个不同主题的任何想法?另外,是否可以单独挑选最热门的单词而不是获取每个主题的单词分布......?我同意这是一个非常小的样本,但想先了解它,然后再尝试更大的样本...... 3个文档确实是个小数目,这里相对来说比较大,我们设法在几百个文档的语料库中取得了显着的结果,当语料库基数超过数万时很难。 @user295338 你可能需要阅读一些关于 LDA 及其应用的论文,blei's original article 是一个好的开始。 @user295338 是的,但解释起来很复杂,尤其是在这种媒体上。如果您在数学上成熟,我建议您阅读一些论文,如果不是,则需要大量阅读才能理解。幸运的是,LDA 有很多资源。如果你有强大的统计和概率背景,你会没事的,否则这将是一条漫长的道路,但这是值得的!至于获取主题概率最高的单词,您可以对输出进行排序并从那里开始。 @user295338 如果你缺乏数学(概率和东西)背景,我刚刚在 Quora 上找到了一个很好的 LDA 解释,quora.com/…【参考方案2】:

我认为本教程将帮助您非常清楚地理解所有内容 - https://www.youtube.com/watch?v=DDq3OVp9dNA

一开始我也遇到了很多理解它的问题。我将尝试简要概述几点。

在潜在狄利克雷分配中,

单词的顺序在文档中并不重要 - Bag of Words 模型。 文档是对主题的分布 每个主题依次是属于该词汇表的单词的分布 LDA 是一种概率生成模型。它用于使用后验分布推断隐藏变量。

想象一下创建文档的过程是这样的 -

    选择主题分布 画一个主题 - 并从主题中选择一个词。对每个主题重复此操作

LDA 是沿着这条线回溯的——假设你有一袋代表文档的词,它代表的主题可能是什么?

所以,就你而言,第一个主题 (0)

INFO : topic #0: 0.181*things + 0.181*amazon + 0.181*many + 0.181*sells + 0.031*nokia + 0.031*microsoft + 0.031*apple + 0.031*announces + 0.031*acquisition + 0.031*product

更多的是关于thingsamazonmany,因为它们的比例更高,而不是microsoftapple,它们的价值要低得多。

我建议阅读此博客以获得更好的理解(Edwin Chen 是个天才!) - http://blog.echen.me/2011/08/22/introduction-to-latent-dirichlet-allocation/

【讨论】:

【参考方案3】:

自从发布了上述答案以来,现在有一些非常好的可视化工具可以使用gensim 获得 LDA 的直觉。

看看 pyLDAvis 包。这是一个很棒的notebook overview。这是一个非常有用的video description,面向最终用户(9 分钟教程)。

希望这会有所帮助!

【讨论】:

【参考方案4】:

为了了解 gensim LDA 实现的用法,我最近在 Python 中的 70,000 篇简单 wiki 转储文章中撰写了从头开始实现主题建模的博文。

在这里,详细解释了 gensim 的 LDA 如何用于主题建模。 可以找到的用法

ElementTree library for extraction of article text from XML dumped file.
Regex filters to clean the articles.
NLTK stop words removal & Lemmatization
LDA from gensim library

希望对理解 gensim 包的 LDA 实现有所帮助。

第 1 部分

Topic Modelling (Part 1): Creating Article Corpus from Simple Wikipedia dump

第 2 部分

Topic Modelling (Part 2): Discovering Topics from Articles with Latent Dirichlet Allocation

作为结果,我得到的几个主题的词云(10 个词)。

【讨论】:

【参考方案5】:

它返回该词与该主题相关联的可能性百分比。默认情况下,LDA 会显示前十个单词:)

【讨论】:

以上是关于使用 gensim 了解 LDA 实现的主要内容,如果未能解决你的问题,请参考以下文章

使用 Gensim 获得 LDA 模型的最佳主题数量的最佳方法是啥?

如何从 gensim 打印 LDA 主题模型? Python

初试主题模型LDA-基于python的gensim包

python 使用GenSim的LDA和sklearn的示例

Gensim-LDA实践

Python Gensim:如何使用 LDA 模型计算文档相似度?