语义分析

来源:互联网 发布:gs2107用哪种编程软件 编辑:程序博客网 时间:2024/05/16 00:41

plsa(Probabilistic Latent Semantic Analysis) 概率隐语义分析

Probabilistic Latent Semantic Analysis

主题模型简介

plsa,也就是概率隐语义分析,是主题模型的一种。主题模型是什么呢?先从文档说起,每篇文档用bag-of-words模型表示,也就是每篇文档只与所包含的词有关,而不考虑这些词的先后顺序。假设文档集DN篇文档,主题模型认为在这N篇文档中一共隐含了Z个主题,每篇文档都可能属于一个或多个主题,这可以用给定文档d时所属主题z的概率分布p(z|d)表示。同理,一个主题下可以包含若干个词w,用概率分布p(w|z)表示。

所以,如果我们有文档集D,又求出对应这个文档集的主题模型,那这有什么意义呢?最明显的意义就是,这相当于给文档聚类了,并且聚类的结果有更合理的解释性。因为我们不但可以知道每一篇文档d属于哪个类别z,我们还可以根据概率p(w|z)知道这个主题的关键词是哪些,从而给这个主题z设置合理的标签。知道文档所属的类别,我们就可以判断两篇文档在语义上是否相似了。虽然可以直接根据文档向量的余弦距离来判断它们是否相似,但是这对近义词就无能为力,比如两篇同样介绍电子产品的文档,一篇大量用“苹果”这个关键词,而另一篇大量用“iPhone”,那么通过余弦距离判断的这两个维度上肯定是不相似的。而“苹果”、“iPhone”两个词都与电子产品关系很大,所以这两篇文档可以都属于同一个主题,也就可以断定他们语义上是相似的。

主题模型的用处还是很多的,在推荐系统,舆情监控等等,都有广泛的用途。 

plsa原理

介绍完主题模型的基本概念,就要回到本文的重点,给定一个文档集D,如何估计主题模型的参数呢?接下来说明如何用plsa来求出这些参数。先放一张图

概率图

首先介绍一下图中参数:d代表每一篇文档,z表示每一个隐含主题,w表示具体的单词。N表示每篇文档的单词数,M表示文档集D内的文档数。

plsa是一个生成模型,它假设了dwz之间的关系通过上图的贝叶斯网络 所表示。灰色的节点dw表示我们能够观测到的变量,也就是具体的文档与文档中的词。白色的节点z就是隐含的主题变量。每篇文档的生成过程是 
1. 以概率p(d)选定文档。 
2. 以概率p(z|d)选定一个主题。 
3. 以概率p(w|z)从主题中选定单词。

我们需要估计的参数就是p(z|d)p(w|z),后文有些地方用θ来表示他们。先不管我们知不知道z是什么,用极大似然估计试试。n(d,w)表示某篇文档d中的词w出现的次数,这个直接统计得到。p(d,w)就是观测到变量dw的联合概率分布。写出似然函数

L(θ)=dwp(d,w)n(d,w)

再写出log似然函数

LL(θ)=dwn(d,w)logp(d,w)=dwn(d,w)[logp(d)+logp(w|d)]

其中 

p(w|d)=zp(w|z)p(z|d)

所以待求解的问题就是

argmaxθLL(θ)=argmaxθdwn(d,w)[logp(d)+logzp(w|z)p(z|d)]

p(d)与需要估计的参数无关,这一项直接舍去不影响结果,得到

argmaxθLL(θ)=argmaxθdwn(d,w)logzp(w|z)p(z|d)

现在问题来了,z是隐含变量,无法观测到,怎么去最大化这个公式呢?假设我们已知在观测dwz的概率分布p(z|d,w),再对上面的公式做一个变换,同时乘上和除以p(z|d,w)

argmaxθLL(θ)=argmaxθdwn(d,w)logzp(z|d,w)p(w|z)p(z|d)p(z|d,w)

那么上式log的右边就变成了关于z的函数的期望Ez,式子变成

argmaxθLL(θ)=argmaxθdwn(d,w)logEz[p(w|z)p(z|d)p(z|d,w)]

根据Jensen不等式有

logEz[p(w|z)p(z|d)p(z|d,w)]Ez[logp(w|z)p(z|d)p(z|d,w)]

那么在已知p(z|d,w)的条件下我们就可以得到LL(θ)的一个下界函数Q(θ),如果这个下界函数可以求最大化,我们就最大化它以估计我们所需的参数。然后根据新的参数求p(z|d,w),再写出新的下界函数,再最大化…反复迭代直至收敛。这就是将EM算法应用到plsa的求解中。

其中

Ez[logp(w|z)p(z|d)p(z|d,w)]=zp(z|d,w)[logp(w|z)P(z|d)logp(z|d,w)]

logp(z|d,w)与我们所需要求的参数无关(因为假设它是已知的值),将它舍去不影响求解。需要求解的问题就变成了

argmaxθQ(θ)=argmaxθdwn(d,w)zp(z|d,w)logp(w|z)P(z|d)

根据贝叶斯定理,可以得到

p(z|d,w)=p(d,z,w)p(d,w)=p(d)p(z|d)p(w|z)p(d)zp(z|d)p(w|z)=p(z|d)p(w|z)zp(z|d)p(w|z)(1)

补充说明一下,求p(z|d,w)是求解p(z(k)|d(i),w(j)),也就是我们需要遍历每一个隐含主题z,每一篇文档d,每一个词w。而此时的p(z(k)|d(i))p(w(j)|z(k))我们是当做已知的,初始化的时候随机给一个值。

到这里已经讲完了用EM算法的E步。归纳一下,在plsa的情境下,E步就是求出所有的p(z(k)|d(i),w(j))

接下来是M步,最大化Q(θ),求出新的参数p(z|d)p(w|z)。应用拉格朗日数乘法求解出新的参数

pnew(w(j)|z(k))=dn(d,w(j))pold(z(k)|d,w(j))dwn(d,w)pold(z(k)|d,w)(2)

pnew(z(k)|d(i))=wn(d(i),w)pold(z(k)|d(i),w)wzn(d,w)pold(z|d(i),w)(3)

总结一下,plsa刚开始理解很难,只要理解了怎么求期望(E步),怎么求最大化(M步),然后根据推导出来的公式编程就很简单了。基本上就分为统计所有的n(d,w),选定主题数|Z|,然后初始化所有的参数p(z(k)|d(i))p(w(j)|z(k)),接下来根据不断的迭代,每一次迭代先用公式(1)求p(z|d,w),然后根据公式(2)和(3)更新参数。直到收敛,收敛条件可以是|Q(θt+1)Q(θt)|<ϵ,也可以是两次迭代参数的差值小于某个阈值。

完整的Python实现代码见我的github

0

0 0
原创粉丝点击