使用 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
更多的是关于things
、amazon
和many
,因为它们的比例更高,而不是microsoft
或apple
,它们的价值要低得多。
我建议阅读此博客以获得更好的理解(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