赞
踩
这篇文章的起源是当年看LDA的推导,开始的时候觉得整个数学推导太复杂了,特别是从概率建模推导出Gibbs Sampling演化公式的过程,感觉不太对我的口味了,我更喜欢从自演化的角度来理解,所以就自己尝试折腾一个“Topic Model”。结果在折腾完之后,和LDA的结果进行对比,神奇地发现基本是一致的。
可惜后来发现其实别人也从LDA的推导结果中观察出了这个演化规则了。要是我看得更认真一点的话,直接就能看到这个结论了。不过反过来想,既然我不愿意顺着别人的思路来推导这个模型,自然也不会认真地观察最终的结论,所以最终还是要靠这个方法才能得到LDA的直观理解。
大致介绍一下LDA。LDA是文本分析里面一个很有名的topic
model,它基于一个简单的词袋模型,通过概率建模,得到文档和词汇的主题分布。这个模型很为人称道的一个特点,是它的数学推导是比较优雅的,由给定的先验Dirichlet分布,得到文档生成的似然函数,然后得到Gibbs
Sampling收敛时的分布,就是topic的对应分布。LDA在前些日子还是挺流行的,网络上好的介绍文章很多,比如这个blog,新浪的同学写的LDA漫游指南,还有腾讯的LDA数学八卦,都有很详细的推导过程。
以下就是我折腾这个“Topic Model”的过程。
最简单的想法,当然就是基于聚类的思想,本质上LDA也是一种聚类,比如GMM也是通过概率模型得到似然函数来实现聚类的。同时LDA已经给我们提供了非常好的训练方法了,那就是Gibbs Sampling,可以简单地把它理解为一种迭代算法,或者本质一点就是将系统演化到热力学平衡态的方式,Markov模型的稳态对应的就是热力学平衡态。那么这就是一个典型的Ising model,我们现在要做的事情非常简单,就是给出一些更直观的演化规则,也就是每个词每一次应该如何决定跳转到哪个topic。
在思考规则之前,先简化一下问题,方便验证新的规则是否能得到合理的topic分布。同时还应该找个标准的LDA实现,跟标准结果进行对比。
这里先处理极端版本,给定3篇文档,9个词,每个文档拥有3个词,每个词只属于一篇文档,用简单的词项向量来表示文档如下
非常显然,对于这种情况,如果设定topic数目为3,最合理的topic分布是每篇文章完全1个topic,每个词也完全对应一个topic。(如果topic数目设为4呢?理想的情况当然是还是只有3个topic是有意义的,比如前面讨论cluster算法的鲁棒性,这里暂不考虑这个问题)
这里的标准LDA实现用了gensim,代码和结果如下
测试代码
corpus = [[(1, 10.0), (2, 10.0), (3, 10.0)],
[(4, 10.0), (5, 10.0), (6, 10.0)],
[(7, 10.0), (8, 10.0), (9, 10.0)]
]
model = gensim.models.LdaModel(corpus, num_topics=3, update_every=0, passes=20)
print 'topic 0:', model.print_topic(0)
print 'topic 1:', model.print_topic(1)
print 'topic 2:', model.print_topic(2)
for i in range(1, 10):
print 'word', i, model.get_term_topics(i)
输出结果(事实上&#x
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。