LDA in action
Latent Direchlet Allocation
关于公式推导可以看LDA数学八卦和Parameter estimation for text analysis,代码中的公式标号来自于后文。
toy code
https://github.com/gajanlee/toys/tree/master/toy_lda
如何实现
1. 数据转换
LDA 是词袋模型,所以不在乎词的顺序,每个文档转换为list形式。[1, 1, 2, 2, 3, 4 …]代表有两个word_id为1的词,2个word_id为2的词… 所有的document一起输入进去,所以为了方便起见,需要一个Docs_is和Term_js代表文档编号和词编号,合起来表示一个文档中的词,Term_js中的每个值代表word_id。
2. train
每个词需要一个topic,所以用一个一维list存放所有词的topic(初始化为随机)。使用collapsed Gibbas sample公式forumula 79,对于输入文档的各项统计后,得到当前词的各个topic概率。随机一个数,看看落在哪个topic内,作为新的采样。对每个词进行一次。
采样后,使用前验+后验公式formula 82,归一化后,获取topic_term_distribution和document_topic_distribution。
3. perplexity
在运行中检查算法运行效果的公式,loglikelihood,同一个文章内每个词概率相乘。
4. inference
Evaluation Methods for Topic Models在Section 4.1提出了一种更能逼近真实分布的"iterated pseudo-counts"方法。
并行LDA
document和term不能够并行,所以我们可以使用对角线并行法。详见《LDA》漫游指南。
代码参考
https://github.com/lda-project/lda