统计文本单词个数_《统计学习方法》之LSA、PLSA

在我之前的一篇有说到,我们可以用SVD做协同过滤的推荐算法

轩羽:《统计学习方法》之SVD​zhuanlan.zhihu.com
60cb522bf6e1dc519e537830df7a773e.png

而,SVD除了可以应用到推荐算法,还可以应用到nlp(自然语言处理)中。其中LSA(latent semantic analysis)就应用到SVD。

首先,明确我们现在要处理的问题:用户提出提问式(通常由若干个反映文本主题的词汇组成),然后系统在数据库中进行提问式和预存的文本关键词的自动匹配工作,两者相符的文本被检出。

那么现在我们就有几个要做的事情:
(1)之前的文本如何储存在数据库?
(2)怎么衡量文本之间的相似度?

1.词袋模型(单词向量空间)

词袋模型(BOW, Bag-of-Words) 模型是NLP领域中的一个基本假设,一个文档(document)被表示为一组单词(word/term)的无序组合

那么对应到我们的文本当中,我们就可以利用词袋模型,将整个文本按照矩阵的形式储存,其中每一行代表一个单词,每一列代表一个文档,而其中的元素则代表第i个单词在j个文档中出现的次数

94eec74212edd672fb4013d1746f85e1.png

其中矩阵中的元素除了可以是单词在文档中出现的频数,也可以使单词在文档中的权值大小。权值通常为单词频率-逆文本频率(term frequency-inverse document frequency,TF-IDF),其中

在这里

表示单词wi在文本dj中出现的频数,而其分母则代表文本dj中出现的总单词数;df代表文本集合D中的全部文本数,其分母dfi则代表单词wi出现的文本数。
直观上,就是一个单词在一个文本中出现的频数越高,这个单词在这个文本的重要度就越高;而这个单词在整个文本集合中出现的文本数越少,那么这个单词就越能表示文本的特点,重要度就越高。而TF-IDF就是两者的综合重要度。

现在,我们已经将一个文本用单词向量表示,并将整个文本集合用矩阵的形式表示,那么这里我们可以利用余弦相似度等衡量方式,来衡量不同文档之间的相似度。

,其中di,dj分别代表不同的文档样本

当然,这里还有其他的相似度衡量方式

可是,在这里,我们采用单词向量空间,也就是词袋模型,我们会发现几个问题:

  • 稀疏性: 对于大词典,尤其是包括了生僻字的词典,文档稀疏性不可避免;
  • 多义词: BOW模型只统计单词出现的次数,而忽略了一个词可能存在多种含义,一词多义;
  • 同义词(Synonym): 多个单词可以表示同一个意思,一义多词;

从同义词和多义词问题可以看到:单词也许不是文档的最基本组成元素,在单词与文档之间还有一层隐含的关系,我们称之为主题(Topic),我们更关注隐藏在词之后的意义和概念。在写文章时首先确定的是文章的主题,再根据主题选择合适的单词来表达观点。

所以,在这里我们需要将单词向量空间转变成话题向量空间,这里也就是从词袋模型转变成LSA模型

2.LSA模型(话题向量空间)

现在一个很重要的问题就是,如何将原来的单词-文本矩阵

其中m代表单词个数,n代表文本个数 ,转换为话题-文本矩阵
,其中k代表话题个数

首先,我们想到的一个办法就是找到一个矩阵

,这个矩阵T的每一列代表一个话题,而每一行代表一个单词,那么每一元素则代表第i个单词在第j个话题中的权重,这样,我们就可以用T将单词向量空间转换成话题向量空间,即

那么现在的问题就是,怎么去寻找到这样的矩阵T?其中一个方法就是用SVD

这里,我们利用截断SVD,获取对应的话题个数,则可以得到:

,那么这里k就代表我们想要找到话题个数,当然,至于确定对应的k以及相关的SVD原理,可以参考最开始的文章链接。

那么。对应到上述的例子,我们就可以得到:

4712022fcc227ea8f387a46c2ef9e625.png

这样,在获得用户的伪文本之后,我们可以利用正交矩阵U进行转换到对应的话题空间,然后再利用相似度等,衡量该文本与其他文档之间相似度,然后进行相应的推荐。

将文档表示到话题向量空间的过程就是SVD奇异值分解和降维的过程。降维是LSA分析中最重要的一步,通过降维,去除了文档中的“噪音”,也就是无关信息(比如词的误用或不相关的词偶尔出现在一起),语义结构逐渐呈现。

优点:
1)低维空间表示可以刻画同义词,同义词会对应着相同或相似的主题。
2)降维可去除部分噪声,是特征更鲁棒。
3)充分利用冗余数据。
4)无监督/完全自动化。
5)与语言无关。
缺点:
1)LSA可以处理向量空间模型无法解决的一义多词(synonymy)问题,但 不能解决一词多义(polysemy)问题。因为LSA将每一个词映射为潜在语义空间中的一个点,也就是说一个词的多个意思在空间中对于的是同一个点,并没有被区分。
2)SVD的优化目标基于L-2 norm 或者 Frobenius Norm 的,这相当于隐含了对数据的高斯分布假设。 而 term 出现的次数是非负的,这明显不符合 Gaussian 假设,而更接近 Multi-nomial (多项)分布
3)特征向量的方向没有对应的物理解释。
4) SVD的计算复杂度很高,而且当有新的文档来到时,若要更新模型需重新训练。
5)没有刻画term出现次数的概率模型。
6)对于count vectors 而言,欧式距离表达是不合适的(重建时会产生负数)。
7)维数的选择是ad-hoc的。
8)LSA具有词袋模型的缺点,即在一篇文章,或者一个句子中忽略词语的先后顺序。
9) LSA的概率模型假设文档和词的分布是服从联合正态分布的,但从观测数据来看是服从泊松分布的。因此LSA算法的一个改进PLSA使用了多项分布,其效果要好于LSA

很明显,我们可以看到,即使利用LSA模型,我们可以很大程度上解决一义多词的问题,但是LSA仍然有许多缺点,而且对于整个矩阵而言必定是非负矩阵,那么其必然不符合高斯分布,所以这里LSA也有着其不合理的地方。

对此,在99年有Hofmann提出了基于概率模型的概率潜在语义分析(PLSA,probabilistic latent semantic analysis)

参考博客:

通俗理解潜在语义分析LSA​www.jianshu.com
b50acbbfe0083bc4c4f1921907442be1.png

3.PLSA模型

我们可以联系一下实际情况。平常如果写一个作文,我们会大致确定我们这篇作文的话题,从而根据这些话题,选择词语写出这篇作文。

(1)生成模型

那么在PLSA模型,我们认为每个文档的一个句子、一个段落或一篇文章都有它自己的主题,这些主题可以是经济、政治、文化、体育、音乐、法律、动漫、游戏、法律等等主题,然后,在这些 主题下,我们才会选择一些单词构成我们的整个文档。

那么现在,我们生成一篇文档,就是以一定的概率

,生成在d文档中当下的词wi,然后再以一定概率
,生成单词wj,如此下去,不断连续生成单词,从而得到整个文档。

而在这里 ,我们引入了话题隐变量z,那么在该文档中,我们先以一定的概率

选取主题zi,再以一定的概率
选取词wj
,从而不断地生成我们的文档

e73681ed951d3f3dac98843baaab2cbc.png

当然,上述只是假设文档是以一定的概率生成,那么我们所要做的就是在整个文档集合中,求出其中的概率模型,在这里为PLSA的生成模型

那么对应 到概率图模型中,就如下:

a70801d3c94b2ce82199f20a05d0ec42.png

(1)D代表文档,Z代表主题(隐含类别),W代表单词;P(d i )表示文档d i 的出现概率, P(z k |d i )表示文档d i 中主题z k 的出现概率, P(w j |z k )表示给定主题z k 出现单词w j 的概率。
(2)每个主题在所有词项上服从多项分布,每个文档在所有主题上服从多项分布。
(3)整个文档的生成过程是这样的: 以P(d i )的概率选中文档d i ; 以P(z k |d i )的概率选中主题z k ;以P(w j |z k )的概率产生一个单词w j观察数据为(d i ,w j )对,主题z k 是隐含变量。

那么,通过隐变量Z,使得原来我们要学习的参数p(w,d),变成了我们要学习的参数为p(z|d),p(w|z)。假设现在有m个文档,d维单词,k的主题,那么我们要学习的参数个数从原来的MN,变为(M+N)*K,而通常我们所定义的主题个数K都远小于M和N,从而减少了我们模型所要学习的参数

a52db4131e9460e8e246160c1a97b630.png

即文档d和单词w的联合概率分布:

在这里,我们是假设了文本和单词是条件独立

(2)生成模型学习算法

那么,现在我们最主要的问题就是如何学习参数p(z|d),p(w|z)?

对于含有隐变量的模型,我们一般选择EM算法。

首先,我们可以做相应的极大似然估计:

7fa29691b5889b06b5af6df73c12f8be.png

其中,M'代表文档个数,N'代表单词个数,

则是
出现的个数,即表示dm文本中wn出现的次数。

很明显,这里存在隐变量z,那么就采用EM算法

先对l进行相应的变换:

987409ec4389e7c013f7b2d9f62580f5.png

由于加法后面的部分中

,我们可以利用文本集合算出后验概率,所以整个后半部分其实是个常量,对于最优化没有影响,故得到:

7a3c038e7cc213bdd7dc29c4cd5e03eb.png

现在,我们要求l'的均值,即得到每个隐变量情况下,l'的概率之和

65c050d4620832553a3ace231453a69b.png

其中,需要满足在对应文档的情况下,各个主体出现的概率之和为1;在对应主体下,各个单词出现的概率之和为1,那么也就得到:

f347d682c51478957d61d11ea7c4958f.png

在这里,引入拉格朗日乘子,变得到:

8db4afbc0e92e6be424e5579944fa4aa.png

将f分别对

求偏导,

1762f9b5cc9cf9dae6aaebfef3a19942.png

13f219313cd35877169a0fdbd6783276.png

令其为0,便可以得到相应的拉格朗日乘子的 值:

5c9a2bff12ac4e3b9410d7a2d6905487.png

将其代入求偏导式为0中,就可以得到

d0e71a1d73fc523bee54fb3668e06f31.png

dca1305f5307923282cb648a1c110ec7.png

其中,利用贝叶斯公式,我们可以求得隐变量的后验概率

34895e9325a6dbb6d1ce7ea77802027e.png

这样,我们便得到了更新公式,那么步骤就是
(1)先随机初始化整个p(z|d),p(w|z)参数
(2)利用上述得到的公式,更新参数,直至收敛(前后两者之间的差值精度达到一定范围以内)

对应的推导过程可以详细参考:

https://blog.csdn.net/sinat_32043495/article/details/78767381​blog.csdn.net

(3)生成模型的应用

现在,我们可以通过我们的文本数据集,先提前设置好对应的主题z的个数,利用EM算法学习到了整个参数p(z|d),p(w|z),那现在问题就是,我们利用PLSA做些什么事情?

一般来说,PLSA是用于做相应的文本聚类。因为现在,我们已经可以得到数据集中每个文本选择每个主题的概率,那么根据这些概率计算出p(w,d)其中

最大的zk,从而得到其所属的主题

当然,这里也可以用PLSA来分类。

首先还是利用现有的数据集得到所有的模型参数 ,然后拿到一篇新文章,可以跑一次只包含一个文章的pLSA。其中

参数保持 不变,迭代更新p(z|d),到达收敛之后,我们便能得到该新文章最大概率的主题p(zk|d)

其次PLSA也可应用到推荐中:
我们把这些概念平行推广到推荐系统中来,一个用户的购买记录看作是一个文档,购买的每一件商品看作是一个词,用户对商品的评分看作是词在文档中的权重。套用PLSA算法就可以得到用户在各个隐含主题上的向量表示p(zk|di),基于这个向量再去计算相似用户,接着套用协同过滤算法给用户推荐商品。

参考博客:

PLSA - 张朝阳 - 博客园​www.cnblogs.com
d0088c2d1aae29ea9889660f6402a061.png
IT牛人博客聚合 - 用pLSA实现博文分类​www.udpwork.com

(4)共现模型

之前所讲述的都是生成模型,那么在这里,PLSA中还有另一个模型,即为共现模型

f28d1e81063a6f61400fb25675f38cb3.png

这个模型与生成模型之间的区别就在于计算p(w,d)上,在共现模型中,先得到选取一个主题的概率,然后得到,在该主题下生成p(w,d)的概率

当然,我们可以利用EM算法,学习其中p(w|z),p(d|z)参数

当然,在一般的使用中,往往利用的是PLSA的生成模型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值