语义分析

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

Probabilistic Latent Semantic Analysis

主题模型简介

plsa,也就是概率隐语义分析,是主题模型的一种。主题模型是什么呢?先从文档说起,每篇文档用bag-of-words模型表示,也就是每篇文档只与所包含的词有关,而不考虑这些词的先后顺序。假设文档集 D N 篇文档,主题模型认为在这 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是一个生成模型,它假设了 d w z 之间的关系通过上图的贝叶斯网络 所表示。灰色的节点 d w 表示我们能够观测到的变量,也就是具体的文档与文档中的词。白色的节点 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) 就是观测到变量 d w 的联合概率分布。写出似然函数

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 是隐含变量,无法观测到,怎么去最大化这个公式呢?假设我们已知在观测 d w z 的概率分布 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值