一口气讲完 LSA — PlSA —LDA在自然语言处理中的使用

自然语言处理之LSA

LSA(Latent Semantic Analysis), 潜在语义分析。试图利用文档中隐藏的潜在的概念来进行文档分析与检索,能够达到比直接的关键词匹配获得更好的效果。

LSA的核心思想

假设有 nn 篇文档,这些文档中的单词总数为 mm (可以先进行分词、去词根、去停止词操作),我们可以用一个 m?nm?n的矩阵 XX 来表示这些文档,这个矩阵的每个元素 XijXij 表示第 ii 个单词在第 jj 篇文档中出现的次数(也可用tf-idf值)。下文例子中得到的矩阵见下图。

LSA试图将原始矩阵降维到一个潜在的概念空间(维度不超过 nn ),然后每个单词或文档都可以用该空间下的一组权值向量(也可认为是坐标)来表示,这些权值反应了与对应的潜在概念的关联程度的强弱。
这个降维是通过对该矩阵进行奇异值分解(SVD, singular value decomposition)做到的,计算其用三个矩阵的乘积表示的等价形式,如下:
\[
X=U \Sigma V^{T}
\]
其中 UU 为 m * n 维,ΣΣ 为对角阵 n * n 维,VV 为 n * n 维。
ΣΣ 矩阵中对角线上的每一个值就是SVD过程中得到的奇异值,其大小反映了其对应的潜在概念的重要程度。
然后我们可以自行设定降维后的潜在概念的维度 \(k(k<n)k(k<n)\) , 可以得到:
\[
X_{k}=U_{k} \Sigma_{k} V_{k}^{T}
\]
其中 \(U_k\) 是将 \(U\) 仅保留前 \(k\) 列的结果,\(Σk\) 是仅保留前 \(k\) 行及前 \(k\) 列的结果,\(V_k\) 是将 \(V\) 仅保留前 \(k\) 列的结果。
\(X_k\) 则是将 \(X\) 降维到 \(k\) 维的近似结果,这个 \(k\) 越接近 \(n\), \(X_k\) 与 \(X\) 也越接近,但我们的目标并不是越接近越好,LSA认为 \(k\) 值不宜过大(保留了冗余的潜在概念)也不宜过小。

自然语言处理之PLSA

LSA使用线性代数方法,对document-word矩阵进行SVD分解。PLSA则使用了一个概率图模型,引入了一个隐变量topic(可以认为是文档的主题),然后进行统计推断。

为何提出PLSA

在语义分析问题中,存在同义词和一词多义这两个严峻的问题,LSA可以很好的解决同义词问题,却无法妥善处理一词多义问题。
PLSA则可以同时解决同义词和一词多义两个问题。

概率图模型

我们知道文档(一个句子、一个段落或一篇文章)都有它自己的主题,从大的方面讲有经济、政治、文化、体育、音乐、法律、动漫、游戏、法律等等主题,PLSA模型就引入了一个隐变量topic来表示这个主题。
PLSA的概率图模型如下图所示:

其中 DD 表示文档(document),\(Z\) 表示主题(topic), \(W\) 表示单词(word),其中箭头表示了变量间的依赖关系,比如 \(D\) 指向 \(Z\),表示一篇文档决定了该文档的主题,\(Z\) 指向 \(W\) 表示由该主题生成一个单词,方框右下角的字母表示该方框执行的次数,\(N\) 表示共生成了 \(N\) 篇文档,\(M\) 表示一篇文档按照document-topic分布生成了 \(M\) 次主题,每一次按照生成的主题的topic-word分布生成单词。每个文档的单词数可以不同。
PLSA引入了隐藏变量 \(Z\),认为 \({D,W,Z}{D,W,Z}\) 表示完整的数据集(the complete data set), 而原始的真实数据集 \({D,W}{D,W}\) 是不完整的数据集(incomplete data)。
假设 \(Z\) 的取值共有 \(K\) 个。PLSA模型假设的文档生成过程如下

  1. 以 \(p(d_i)\) 的概率选择一个文档 \(d_i\)
  2. 以 \(p(z_k|d_i)\) 的概率选择一个主题 \(z_k\)
  3. 以 \(p(w_j|z_k)\) 的概率生成一个单词 \(w_j\)
    根据图模型,可以得到观测数据的联合分布:

\[
\begin{aligned} p\left(d_{i}, w_{j}\right) &=\sum_{k=1}^{K} p\left(d_{i}, w_{j}, z_{k}\right) \\ &=\sum_{k=1}^{K} p\left(d_{i}\right) p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right) \\ &=p\left(d_{i}\right) \sum_{k=1}^{K} p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right) \end{aligned}
\]

第一个等式是对三者的联合概率分布对其中的隐藏变量 \(Z\) 的所有取值累加,第二个等式根据图模型的依赖关系将联合概率展开为条件概率,第三个等式只是简单的乘法结合律。这样就计算出了第 \(i\) 篇文档与第 \(j\) 个单词的联合概率分布。

我们可以得到完整数据的对数似然为:
\[
\begin{aligned} L &=\sum_{i=1}^{N} \sum_{j=1}^{M} n\left(d_{i}, w_{j}\right) \log \left(p\left(d_{i}, w_{j}\right)\right) \\ &=\sum_{i=1}^{N} \sum_{j=1}^{M} n\left(d_{i}, w_{j}\right) \log \left(p\left(d_{i}\right) \sum_{k=1}^{K} p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right)\right) \\ &=\sum_{i=1}^{N} n\left(d_{i}\right) \log \left(p\left(d_{i}\right)\right)+\sum_{i=1}^{N} \sum_{j=1}^{M} n\left(d_{i}, w_{j}\right) \log \sum_{k=1}^{K} p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right) \end{aligned}
\]
\(p(z_k|d_i)\) 和 \(p(w_j|z_k)\) 是PLSA模型需要求解的参数,

使用EM求解PLSA

可以看之前所写的关于EM 算法的blog,对于其中的函数 \(Q\), 现在给出PLSA中 \(Q\) 函数的形式
\[
\begin{aligned} Q\left(\theta, \theta^{o l d}\right) &=\sum_{i=1}^{N} \sum_{j=1}^{M} n\left(d_{i}, w_{j}\right) \sum_{k=1}^{K} p\left(z_{k} | d_{i}, w_{j}\right) \log p\left(d_{i}, w_{j}, z_{k} ; \theta\right) \\ &=\sum_{i=1}^{N} \sum_{j=1}^{M} n\left(d_{i}, w_{j}\right) \sum_{k=1}^{K} p\left(z_{k} | d_{i}, w_{j}\right) \log \left[p\left(d_{i}\right) p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right)\right] \end{aligned}
\]
注意到这是因为如前文所说,在本问题中,认为\({D,W,Z}\) 是完整的数据集。
由于 \(p(d_i)∝n(d_i) ,\) 表示第 \(i\) 篇文档的单词总数,这一项估计并不重要,因此上式去掉该项,得到:
\[
Q\left(\theta, \theta^{o l d}\right)=\sum_{i=1}^{N} \sum_{j=1}^{M} n\left(d_{i}, w_{j}\right) \sum_{k=1}^{K} p\left(z_{k} | d_{i}, w_{j}\right) \log \left[p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right)\right]
\]
可以看到对数中是参数的乘积,不再包含求和的部分。
我们注意到,参数存在下面的两个约束:
\[
\begin{array}{l}{\sum_{j=1}^{M} p\left(w_{j} | z_{k}\right)=1} \\ {\sum_{k=1}^{K} p\left(z_{k} | d_{i}\right)=1}\end{array}
\]
因此可以使用拉格朗日乘子法(Lagrange multiplier)求取使得 \(Q\) 函数最大时对应的参数。
写出拉格朗日函数:
\[
Lagrange=Q+\sum_{k=1}^{K} \tau_{k}\left(1-\sum_{j=1}^{M} p\left(w_{j} | z_{k}\right)\right)+\sum_{i=1}^{N} \rho_{i}\left(1-\sum_{k=1}^{K} p\left(z_{k} | d_{i}\right)\right)
\]
对拉格朗日函数中的 \(p(w_j|z_k)\) 求偏导,令其等于零,得到:
\[
\sum_{i=1}^{N} n\left(d_{i}, w_{j}\right) p\left(z_{k} | d_{i}, w_{j}\right)-\tau_{k} p\left(w_{j} | z_{k}\right)=0,1 \leq j \leq M, 1 \leq k \leq K
\]
对该式 \(1≤k≤K\) 所有取值下等式两边累加,可以消去 \(p(z_{k}|d_i)\), 从而得到 \(ρ_i\) 的表达式,回带到上式得到下式:
\[
p\left(z_{k} | d_{i}\right)=\frac{\sum_{j=1}^{M} n\left(d_{i}, w_{j}\right) p\left(z_{k} | d_{i}, w_{j}\right)}{n\left(d_{i}\right)}
\]
这样就得到了EM算法的M-Step重新估计参数的公式。
那么在E-Step如何计算 \(z\) 的后验概率呢?根据下式计算,第一个等式是贝叶斯法则,第二个等式是根据图模型将联合概率展开,第三个等式是分子分母同时除以一个因子。
\[
\begin{aligned} p\left(z_{k} | d_{i}, w_{j}\right) &=\frac{p\left(d_{i}, w_{j}, z_{k}\right)}{p\left(d_{i}, w_{j}\right)} \\ &=\frac{p\left(d_{i}\right) p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right)}{\sum_{l=1}^{K} p\left(d_{i}\right) p\left(z_{l} | d_{i}\right) p\left(w_{j} | z_{l}\right)} \\ &=\frac{p\left(z_{k} | d_{i}\right) p\left(w_{j} | z_{k}\right)}{\sum_{l=1}^{K} p\left(z_{l} | d_{i}\right) p\left(w_{j} | z_{l}\right)} \end{aligned}
\]

自然语言处理之LDA

我们知道,PLSA也定义了一个概率图模型,假设了数据的生成过程,但是不是一个完全的生成过程:没有给出先验。因此PLSA给出的是一个最大似然估计(ML)或者最大后验估计(MAP)。
LDA拓展了PLSA,定义了先验,因此LDA给出的是一个完整的贝叶斯估计。

这里先给出本文公式中以及python代码中使用到的符号及其含义。关于编号,公式中从1开始编号,代码中从0开始编号,只是为了方便。

LDA 的生成过程:

对于所有的主题 \(\mathrm{k} \in[1, \mathrm{K}]\), do

? 样本混合元素:\(\overrightarrow{\varphi_{k}} \sim \operatorname{Dir}(\vec{\beta})\)

队友所有的文本 \(\mathrm{i} \in[1, \mathrm{N}]\):

样本混合的比例:\(\overrightarrow{\theta_{i}} \sim \operatorname{Dir}(\vec{\alpha})\)

样本混合的长度:\(N_{i} \sim \operatorname{Poiss}(\xi)\)

对于所有的元素:\(j \in\left[1, \mathrm{N}_{i}\right]\) 在文本 \(i\) 中:

样本主题的标签:\(z_{i, j} \sim \operatorname{Mult}\left(\overrightarrow{\theta_{i}}\right)\)

样本单词的类别:\(w_{i, j} \sim M u l t\left(\overrightarrow{\varphi_{z_{i, j}}}\right)\)

由该生成过程以及dirichlet-multinomial共轭可得:
\[
\begin{array}{l}{p(\vec{z} | \vec{\alpha})=\prod_{i=1}^{N} \frac{\Delta\left(\overrightarrow{n_{i}}+\vec{\alpha}\right)}{\Delta(\vec{\alpha})}} \\\\ {p(\vec{w} | \vec{z}, \vec{\beta})=\prod_{z=1}^{K} \frac{\Delta\left(\overrightarrow{n_{z}}+\vec{\beta}\right)}{\Delta(\vec{\beta})}}\end{array} \\]

\[
\begin{aligned} p(\vec{w}, \vec{z} | \vec{\alpha}, \vec{\beta}) &=p(\vec{w} | \vec{z}, \vec{\beta}) p(\vec{z} | \vec{\alpha}) \\ &=\prod_{z=1}^{K} \frac{\Delta\left(\vec{n}_{z}+\vec{\beta}\right)}{\Delta(\vec{\beta})} \prod_{i=1}^{N} \frac{\Delta\left(\overrightarrow{n_{i}}+\vec{\alpha}\right)}{\Delta(\vec{\alpha})} \end{aligned}
\]

根据上面的概率图模型,可以得出第i篇文档的complete-data似然性为:
\[
p\left(\vec{w}_{i}, \vec{z}_{i}, \overrightarrow{\theta_{i}}, \Phi | \vec{\alpha}, \vec{\beta}\right)=\prod_{j=1}^{N_{i}} p\left(w_{i, j} | \overrightarrow{\varphi_{z_{i j}}}\right) p\left(z_{i, j} | \overrightarrow{\theta_{i}}\right) \cdot p\left(\overrightarrow{\theta_{i}} | \vec{\alpha}\right) \cdot p(\Phi | \vec{\beta})
\]
第i篇文档第j个单词在词表中编号为w的概率为:
\[
p\left(w_{i, j}=w | \overrightarrow{\theta_{i}}, \Phi\right)=\sum_{k=1}^{K} p\left(w_{i, j}=w | \overrightarrow{\varphi_{k}}\right) p\left(z_{i, j}=k | \overrightarrow{\theta_{i}}\right)
\]
整个数据集的似然性为:
\[
p(\mathcal{D} | \Theta, \Phi)=\prod_{i=1}^{N} p\left(\overrightarrow{w_{i}} | \overrightarrow{\theta_{i}}, \Phi\right)=\prod_{i=1}^{N} \prod_{j=1}^{N_{i}} p\left(w_{i, j} | \overrightarrow{\theta_{i}}, \Phi\right)
\]
PLSA中的概率图模型由于没有先验,模型比LDA简单一些,认为文档决定topic,topic决定单词,写出了整个数据集的对数似然性,然后由于要求解的参数以求和的形式出现在了对数函数中,无法通过直接求导使用梯度下降或牛顿法来使得这个对数似然最大,因此使用了EM算法。
LDA同样可以使用EM算法求解参数,但需要在E步计算隐变量的后验概率时使用变分推断进行近似,一种更简单的方法是使用gibbs sampling。

gibbs sampling

这部分的公式推导如下:
\[
p\left(z_{l}=z | \overrightarrow{z_{l}-l}, \vec{w}\right)=\frac{p(\vec{w}, \vec{z})}{p\left(\vec{w}, \vec{z}_{\neg l}\right)} \\\\ =\frac{p(\vec{w} | \vec{z}) p(\vec{z})}{p\left(\vec{w}_{l} | \vec{z}_{l}\right) p\left(w_{l}\right) p\left(\vec{z}_{l}\right)} \propto \frac{p(\vec{w} | \vec{z}) p(\vec{z})}{p\left(\vec{w}_{\eta} | \overrightarrow{z_{\eta}}\right) p\left(\overrightarrow{z_{\eta}}\right)} \\\\ =\frac{\Delta\left(\overrightarrow{n_{i}}+\vec{\alpha}\right)}{\Delta\left(n_{i, l}+\vec{\alpha}\right)} \cdot \frac{\Delta\left(\overrightarrow{n_{z}}+\vec{\beta}\right)}{\Delta\left(\overrightarrow{n_{z}, \eta}+\vec{\beta}\right)} \\\\ =\frac{\Gamma\left(n_{i z}+\alpha_{z}\right) \Gamma\left(\sum_{z=1}^{K}\left(n_{i z, \eta}+\alpha_{z}\right)\right)}{\Gamma\left(n_{i z, \eta}+\alpha_{z}\right) \Gamma\left(\sum_{z=1}^{K}\left(n_{i z}+\alpha_{z}\right)\right)} \cdot \frac{\Gamma\left(n_{z w}+\beta_{w}\right) \Gamma\left(\sum_{w=1}^{M}\left(n_{z w, l}+\beta_{w}\right)\right)}{\Gamma\left(n_{z w, \eta}+\beta_{w}\right) \Gamma\left(\sum_{w=1}^{M}\left(n_{z w}+\beta_{w )}\right)\right.}\\\\=\frac{n_{i z, 7 l}+\alpha_{z}}{\sum_{z=1}^{K}\left(n_{i z, 7 l}+\alpha_{z}\right)} \cdot \frac{n_{z w, l}+\beta_{w}}{\sum_{w=1}^{M}\left(n_{z w, 7}+\beta_{w}\right)}\propto \frac{n_{z w, 7 l}+\beta_{w}}{\sum_{w=1}^{M}\left(n_{z w, 7}+\beta_{w}\right)} \cdot\left(n_{i z, 7 l}+\alpha_{z}\right)\\\\=\frac{n z w[z, w]}{n z[z]} \cdot(n d z[i, z])
\]
下面解释一下这个推导过程,前两个等号是利用了贝叶斯公式,第三步的正比于符号这一行是去掉了一项常数 \(p(w_l)\),第四步利用了前面计算好的 \(p(\vec{w}, \vec{z})\) 联合概率公式,第五、六步是将函数展开并化简,第七步的正比于符号是去掉了一项不依赖于z的项(即z取何值该项都相同),最后一行给出了对应代码中的表达。
这样我们就得到了吉布斯采样公式,每一轮gibbs sampling的迭代中依次遍历每个二维下标 ll, 即遍历每篇文档的每一个单词,重新采样这个下标对应的topic编号。

原文地址:https://www.cnblogs.com/wevolf/p/11266528.html

时间: 2024-08-29 15:50:40

一口气讲完 LSA — PlSA —LDA在自然语言处理中的使用的相关文章

在知乎上看到 Web Socket这篇文章讲得确实挺好,从头看到尾都非常形象生动,一口气看完,没有半点模糊,非常不错

https://www.zhihu.com/question/20215561/answer/40316953 在知乎上看到这篇文章讲得确实挺好,从头看到尾都非常形象生动,一口气看完,没有半点模糊,非常不错,所以推荐给大家,非常值得一读. 作者:Ovear链接:https://www.zhihu.com/question/20215561/answer/40316953来源:知乎著作权归作者所有,转载请联系作者获得授权. 一.WebSocket是HTML5出的东西(协议),也就是说HTTP协议没

(转)一个故事讲完https

(转)一个故事讲完https 2 1  序言 今天来聊一聊https 安全传输的原理. 在开始之前,我们来虚构两个人物, 一个是位于中国的张大胖(怎么又是你?!), 还有一个是位于米国的Bill (怎么还是你?!). 这俩哥们隔着千山万水,通过网络联系上了, 两个人臭味相投,聊得火热. 此时正值米国大选, 张大胖亲切地"致电"Bill, 对米国总统大选的情况表示强烈地关注. Bill则回电说谢谢关心米国人的事情我们米国人自己做主,不用你们歪果仁瞎操心...... 张大胖继续"

Java并发编程核心知识体系精讲 完整版

第1章 开宗明义[不看错过一个亿]本章一连串设问:为什么学并发编程?学并发编程痛点?谁适合学习本课?本课程包含内容和亮点?首先4大个理由告诉你为什么要学,其实源于JD岗位要求就不得不服了.其次5个痛点+12个亮点,是否说服你要死磕Java并发编程呢?... 第2章 跨越第一座山“线程八大核心”[适用于纵观全貌]八大核心-序章.从本章开始将带你攻克并发编程领域的“第一座大山”:多线程八大核心. 第3章 核心1:实现多线程的正确姿势[解读官方文档,够权威]相信很多小伙伴经常在各大技术博客或者论坛甚至

自然语言处理中N-Gram模型的Smoothing算法

在之前的文章<自然语言处理中的N-Gram模型详解>里,我们介绍了NLP中的模型.最后谈到,为了解决使用N-Gram模型时可能引入的稀疏数据问题,人们设计了多种平滑算法,本文将讨论其中最为重要的几种. Add-one (Laplace) Smoothing Add-k Smoothing(Lidstone's law) Backoff Interpolation Absolute Discounting Kneser-Ney Smoothing 欢迎关注白马负金羁的博客 http://blog

自然语言处理中CNN模型几种常见的Max Pooling操作

/* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 CNN是目前自然语言处理中和RNN并驾齐驱的两种最常见的深度学习模型.图1展示了在NLP任务中使用CNN模型的典型网络结构.一般而言,输入的字或者词用Word Embedding的方式表达,这样本来一维的文本信息输入就转换成了二维的输入结构,假设输入X包含m个字符,而每个字符的Word Embedding的长度为d,那么输入就是m*d的二维向量. 图1 自然语言处理中CNN模型典型网络结构 这里可以

(zhuan) 自然语言处理中的Attention Model:是什么及为什么

自然语言处理中的Attention Model:是什么及为什么 2017-07-13 张俊林 待字闺中 要是关注深度学习在自然语言处理方面的研究进展,我相信你一定听说过Attention Model(后文有时会简称AM模型)这个词.AM模型应该说是过去一年来NLP领域中的重要进展之一,在很多场景被证明有效.听起来AM很高大上,其实它的基本思想是相当直观简洁的.本文作者可以对灯发誓:在你读完这篇啰里啰嗦的文章及其后续文章后,一定可以透彻了解AM到底是什么,以及轻易看懂任何有关论文看上去复杂的数学公

一口气看完驴友源码

自学安卓也有一年时间了,很快到了要找工作的时候了,但是自己还只做了一个项目,怎么办?听前辈们说,找别人的源码研究,于是,说干就干,我这次找了网上找的一个驴友的源码,和大家讲解下里面的实现思路,帮助大家更快看完一个源码.为了读者方面,我也把这个源码贴出来,有兴趣的朋友根据步骤一步一步来. 我们把这个软件安装完成后,发现里面的功能分为四个模块:旅游记忆,结伴游,好友/关注者,其他功能.其中,数其他功能里面的子模块数最多,所以我们从最多的讲起. 用户注册:这个功能整体上来说就是在安卓端填写信息提交到服

一段对话讲完建造者模式

截止今天,小秋学习Java刚刚满三个月.此刻的小秋感觉自己Java学的还不错,想去帅地面前炫耀一番,于是,就发生了一下一番对话-.. 得意的小秋 帅地:嗨,小秋,看你今天气色不错啊.最近Java学的怎么样了? 小秋:说实话,比起三个月前我学指针的那段日子,这Java太友好了,感觉就是分分种的事(暗自得意). 帅地:我靠,你这口气还挺大啊.从c的面向过程到Java的面向对象,还习惯不? 小秋:哎,还行,无非就是"一切皆对象",Java中的对象感觉类似于C中的结构体.反正不过三七二十一,我

LSA、LDA

Latent semantic analysis (LSA) is a technique in natural language processing, in particular distributional semantics, of analyzing relationships between a set of documents and the terms they contain by producing a set of concepts related to the docum