LDA(Latent Dirichlet Allocation)中文翻译为:潜在狄利克雷分布。LDA主题模型是一种文档生成模型,是一种非监督机器学习技术。它认为一篇文档是有多个主题的,而每个主题又对应着不同的词。一篇文档的构造过程,首先是以一定的概率选择某个主题,然后再在这个主题下以一定的概率选出某一个词,这样就生成了这篇文档的第一个词。不断重复这个过程,就生成了整篇文章(当然这里假定词与词之间是没有顺序的,即所有词无序的堆放在一个大袋子中,称之为词袋,这种方式可以使算法相对简化一些)。
LDA的使用是上述文档生成过程的逆过程,即根据一篇得到的文档,去寻找出这篇文档的主题,以及这些主题所对应的词。LDA是NLP领域一个非常重要的非监督算法。
白话解释:比如document1的内容为:[自从乔布斯去世之后,iPhone再难以产生革命性的创新了]
通过上述的方法,document1将对应两个主题topic1,topic2,进而,主题topic1会对应一些词:[苹果创始人][苹果手机],主题topic2会对应一些词:[重大革新][技术突破]。于是LDA模型的好处显而易见,就是可以挖掘文档中的潜在词或者找到两篇没有相同词的文档之间的联系。
1 LDA主题模型
假设我们有MMM篇文档,对应第ddd个文档中有有NdN_dNd个词。即输入为如下图:
我们的目标是找到每一篇文档的主题分布和每一个主题中词的分布。
在LDA模型中,我们需要先假定一个主题数KKK,这样所有的分布就都基于KKK个主题展开。那么具体LDA模型是怎么样的呢?具体如下图:
LDA假设文档主题的先验分布是Dirichlet分布,即对于任一文档ddd, 其主题分布θdθ_dθd为:
θd=Dirichlet(α⃗)\theta_d = Dirichlet(\vec \alpha)θd=Dirichlet(α)
其中,ααα为分布的超参数,是一个KKK维向量。
LDA假设主题中词的先验分布是Dirichlet分布,即对于任一主题kkk, 其词分布βkβ_kβk为:
βk=Dirichlet(η⃗)\beta_k= Dirichlet(\vec \eta)βk=Dirichlet(η)
其中,ηηη为分布的超参数,是一个VVV维向量。VVV代表词汇表里所有词的个数。
对于数据中任意一篇文档ddd中的第nnn个词,我们可以从主题分布θdθ_dθd中得到它的主题编号zdnz_{dn}zdn的分布为:
zdn=multi(θd)z_{dn} = multi(\theta_d)zdn=multi(θd)
而对于该主题编号,得到我们看到的词wdnw_{dn}wdn的概率分布为:
wdn=multi(βzdn)w_{dn} = multi(\beta_{z_{dn}})wdn=multi(βzdn)
理解LDA主题模型的主要任务就是理解上面的这个模型。这个模型里,我们有MMM个文档主题的Dirichlet分布,而对应的数据有MMM个主题编号的多项分布,这样(α→θd→z⃗d\alpha \to \theta_d \to \vec z_{d}α→θd→zd)就组成了Dirichlet-multi共轭,可以使用贝叶斯推断的方法得到基于Dirichlet分布的文档主题后验分布。
如果在第ddd个文档中,第kkk个主题的词的个数为:nd(k)n_d^{(k)}nd(k), 则对应的多项分布的计数可以表示为:
n⃗d=(nd(1),nd(2),...nd(K))\vec n_d = (n_d^{(1)}, n_d^{(2)},...n_d^{(K)})nd=(nd(1),nd(2),...nd(K))
利用Dirichlet-multi共轭,得到θdθ_dθd的后验分布为:
Dirichlet(θd∣α⃗+n⃗d)Dirichlet(\theta_d | \vec \alpha + \vec n_d)Dirichlet(θd∣α+nd)
同样的道理,对于主题与词的分布,我们有KK个主题与词的Dirichlet分布,而对应的数据有KKK个主题编号的多项分布,这样(η→βk→w⃗(k)\eta \to \beta_k \to \vec w_{(k)}η→βk→w(k))就组成了Dirichlet-multi共轭,可以使用贝叶斯推断的方法得到基于Dirichlet分布的主题词的后验分布。
如果在第kkk个主题中,第vvv个词的个数为:nk(v)n_k^{(v)}nk(v), 则对应的多项分布的计数可以表示为
n⃗k=(nk(1),nk(2),...nk(V))\vec n_k = (n_k^{(1)}, n_k^{(2)},...n_k^{(V)})nk=(nk(1),nk(2),...nk(V))
利用Dirichlet-multi共轭,得到βkβ_kβk的后验分布为:
Dirichlet(βk∣η⃗+n⃗k)Dirichlet(\beta_k | \vec \eta+ \vec n_k)Dirichlet(βk∣η+n