使用gensim理解LDA实现

29

我正在努力理解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教程,但并没有真正帮助太多。

谢谢。


1
只是让你知道,这些数字是主题中每个单词的相对重要性。它们不加起来等于1的原因是默认情况下print_topics显示10个单词。如果你显示100个左右,总和就会开始接近1。 - sachinruk
请参见http://rstudio-pubs-static.s3.amazonaws.com/79360_850b2a69980c4488b1db95987a24867a.html。 - Chris
5个回答

21
你要寻找的答案在 gensim教程中。 lda.printTopics(k) 打印了对于随机选择的k个主题最有贡献的词语。人们可以假设这部分是给定主题上单词的分布,也就是这些单词出现在左侧主题中的概率。
通常情况下,人们会在大型文集上运行LDA。在微不足道的样本上运行LDA将无法获得最佳结果。

谢谢回复。你有没有想法是如何将语料库分成五个不同的主题的?此外,是否可能仅挑选出顶部单词而不是获取每个主题的单词分布?我同意这是一个非常小的样本,但是在尝试更大的样本之前,我想先了解它。 - visakh
由于三份文件确实是一个很小的数量,这里“巨大”是相对的,对于一些数百个文档的语料库,我们能够获得显着的结果,但当语料库的基数超过数万时,我们会遇到困难。 - alko
1
@user295338 你可能需要阅读一些关于LDA及其应用的论文,blei的原始文章是一个不错的开始。 - alko
4
如果您缺乏数学(概率等)背景,我刚在Quora上找到了一个关于LDA的好解释,http://www.quora.com/What-is-a-good-explanation-of-Latent-Dirichlet-Allocation - alko
感谢您的输入和链接...希望我能够让它开始运行...再次感谢... :-) - visakh
显示剩余2条评论

19

我认为这个教程会帮助你非常清晰地理解一切-https://www.youtube.com/watch?v=DDq3OVp9dNA

我最初也遇到了很多理解上的问题。我会试着简要概括一些要点。

在Latent Dirichlet Allocation中:

  • 单词的顺序在文档中并不重要-词袋模型。
  • 文档是一个关于主题的分布
  • 每个主题,反过来,是属于词汇表中单词的分布
  • LDA是一种概率生成模型。它用于使用后验分布推断隐藏变量。

想象一下创建文档的过程就像这样:

  1. 选择主题的分布
  2. 绘制主题-并从主题中选择单词。对每个主题重复此过程

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

主要关注于事物亚马逊许多,因为它们具有更高的比例,而不是微软苹果,它们的值显著较低。

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


11
自以上答案发布以来,现在有一些非常好的可视化工具,可以使用gensim来获得LDA的直觉。请查看pyLDAvis包。这里有一个很棒的笔记本概述。这里是一个非常有帮助的视频描述,面向最终用户(9分钟教程)。希望这有所帮助!

2
为了理解gensim LDA实现的用法,我最近在Python中编写了博客文章,从头开始实现了对70,000个simple-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部分):从简单维基百科转储创建文章语料库 第二部分 主题建模(第2部分):使用潜在狄利克雷分配从文章中发现主题 我得到的一些主题的词云(10个单词)。 enter image description here

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接