基于向量空间的文本的缺点

https://blog.csdn.net/she201007780123/article/details/90815756

    在上面的这篇文章中本人介绍了基于向量空间的文本分类算法,但是现在很多文本分类任务都会使用到LDA模型,那么向量空间模型有什么缺陷呢,首先向量空间没有能力去解决一词多意,就是一个词有很多不同的解释,或者一意多词的问题,比如说同义词,比如吃饭这个词,可以说成吃饭,午餐,用餐,用膳等多个说法,但是机器不会辨认同义词,如果在机器里面将同义词全部标出来,这个工作量未免也太大了,这个到目前为止还没有这么一个同义词的词典。

    另外一篇文章里面上下文明显可以看出是同一个意思的,上文里面说是“宝马”,下文里面就说是“该汽车”,这个宝马和该汽车是同一件事情,但是看起来是相差很远的不同的意思,同一个意思的词会分成不同的维度,这样就会低估了两个文档的相似度,这两个文档说的是同一个事情,但是使用了不同的同义词,看起来他们是如此的不同,这样的话相似度计算就会降的很低,这个是一个问题,低估相似度的问题。

    还有一个问题就是一个单词在不同的场景下有不同的意思,比如说in这个单词在不同的场景会解释成为不同的意思,这个在多语言翻译里面很常见,这个计算就会相反,会高估了相似度,就是说大家是同一个单词,这样理解起来文档就很相同了,其实在不同的文档里面表达的意思是不一样的,高估了相似度。

这两种情况是经常出现的,会造成维度爆炸,维度灾难,因为同义词变多了。

首先需要使用同义词解决相似度低估的问题,同时解决维度灾难的问题,一句话就是要识别出文档里面的同义词,同义词使用同一个词表达,意思相近的词使用同一个词表达之后,可以降低维度,下面就是LSA算法解决这个问题。

矩阵分解在推荐系统中的使用

                                              基于SVD和pLSA算法的文本主题分类-- 追根究底

    推荐系统的场景是这样的,我们现在有一个矩阵,行这个方向上是item,就是商品,在列这个方向上是user,用户给商品评过多少分呢,这个矩阵就是一个评分矩阵,现在的问题是评分矩阵太大了,想压缩一下他的信息量,另外一个典型的问题是,用户不可能给所有的商品都评分,所以是一个稀疏的矩阵,中间空缺了很多的元素,需要猜空缺的地方是什么,我们有一个矩阵分解的方法叫SVD,分解成为两个矩阵相乘,k是一个隐分类,分的时候都不知道隐分类是什么,分完之后知道,根据规律第一列都是恐怖电影,大白鲨这些,知道第一列是恐怖分类,有一列是阿凡达、星球大战这些电影,是一个科幻类的电影,隐分类是分完之后才解释的,很多时候不需要解释这个隐分类是什么东西,只需要分解之后的效果就可以了,这个分解可以带来什么效果呢,K是一个比n小很多的数字,这样就能减少很多的存储量,可以起到一个数据压缩的作用,并且降低维度, 通过这个矩阵,用户在k上面的的评分,知道应该推荐给用户什么类型的电影,这个本身也起到了降维的作用,这个是在推荐系统的场景里面讨论的事情。

                                               基于SVD和pLSA算法的文本主题分类-- 追根究底

矩阵分解在文本分类中的应用

    现在在文本分析的场景是怎么样的呢,我们也有一个类似的矩阵,行上面的维度是word,一共有w个,列这个维度上是document,数量m表示有多少个文档,将矩阵分解为两个矩阵,一个矩阵行这个维度还是word,在列上面的维度是topic,这个主题和上面的隐分类有点相似,左边表示的是某一个词属于某一个隐分类的可能性有多高,如果两个词属于同一种隐分类的话,就是属于同义词或者是近义词,这个矩阵分解完之后,就能看哪一些词是近义词或者是同义词,右边的矩阵有点像降维的作用,本来应该是向量空间,每一个列是一个词向量,在向量空间里面讨论文档相似性,或者分类的情况,每一个列代表我们的文档向量,原始的向量列向量很长,因为word很多,可能有10万行这么多,但是变成隐分类之后,这个隐分类可能不太多,比如说1000种,这个矩阵就降维了,原始如果行和列都是10万,里面的元素就有10万*10万=100亿,分解之后如果k=1000,元素个数就是1000*10万+1000*10万=2亿,明显达到了降维的作用,文本是不是相似可以在topic的基础上进行讨论,如果两个文本讨论的topic是一样的,说明讨论的事情很相似,如果讨论的topic不一样的话,就讨论的东西就是不一样的,这个topic不用管是什么,可以理解为在文章里面讨论的一些主题,topic就是一个向量,通过计算向量之间的距离,评估文档的主题接近程度,我们讨论的话题,比如在在文章里面讨论的是汽车,围绕汽车有一些词汇,讨论的是电影,围绕电影有一些词汇,讨论个人生活,围绕个人生活有一些词汇,讨论同一个主题可以认为这个是一个同义词,或者这个主题不是完整的段落或者完整的句子,或者某一个完整的章节,比如说“只是”在文章里面表示了一种否定的情绪,“生气”表示一种愤怒的情绪,否定和愤怒也可以认为是topic,围绕否定和愤怒有一堆词来表达他的思想,这个同样的可以在文章里面表现喜悦,在文章里面有一堆词来围绕他,所以这个topic是抽象的,不一定是一个具体的章节或者是具体的句子,可以理解为文章中抽象的东西,好像说写作文,我要写一篇议论文,有很多观点,不是单独一段来写,是穿插在文章前前后后各个地方,这个也可以组成topic,只需要知道文章由很多主题确定就可以了,那么一篇文章取多少个topic比较合适呢,只能以你的业务效果为基准,这个原始矩阵很庞大,要降维压缩的方法是使用SVD算法,这个本质大的思想就是变成两个矩阵相乘

 

SVD矩阵分解

任何一个矩阵可以拆分成为3个矩阵相乘,基于SVD和pLSA算法的文本主题分类-- 追根究底,U和V是正交矩阵,正交矩阵就是这样的,如果将行或者列看成是单独的向量,比如将所有的行看成是一个单独的向量,不相同的两行他们互相之间是垂直的,计算内积的时候等于0,V也是一个正交矩阵,正交矩阵是一个方正。

∑表示在对角线上的元素是大于等于0的,其他地方的元素全部都是0,这个是这样的一个矩阵,任何一个矩阵A都能以这种形式分解,这个就是SVD分解,UV是正交方正,∑是对角线为非0,其他地方是0,适当的对V进行调整的话,可以使得对角线上的元 素是从大到小排列的,最后可能是一些0,可能有似曾相识的感觉。

        基于SVD和pLSA算法的文本主题分类-- 追根究底

     基于SVD和pLSA算法的文本主题分类-- 追根究底

                        基于SVD和pLSA算法的文本主题分类-- 追根究底

                       基于SVD和pLSA算法的文本主题分类-- 追根究底

                                                             基于SVD和pLSA算法的文本主题分类-- 追根究底

通过上面的推导就将矩阵A分解成为了两个矩阵向成都额形式,A=XY即是A的满秩分解

https://blog.csdn.net/zhongkejingwang/article/details/43053513

     现在就是要用到这个定理,现在的目的是使得A变成两个式子相乘,对角线上的元素像主成分分析一样已经从大大小排列好了,我们现在另值很小的值全部变成0,这个做法就和主成分分析一样,只是取几个最大的特征根,后面的特征根全部抛弃,变成0,这样的话结果不会相差多少,是一个逼近,这样等号就改成了约等于,因为假设只是保留K个特征根。

     将∑分成4个部分,对角线矩阵是k*k的,假设值保留K个特征根,其他部分都是0,现在对n矩阵做一个划分,左边的m*k,成为一个单独的块,身下的是m*(m-k),V的话类似的处理,上面你是k*n,下面是(n-k)*n。

    然后将各个块画上标号,将结果为0得到没有学出来,最后的结果就是①*③*⑦。

    最后得到这么一个结论,将中间的方阵拆分为两个矩阵相乘,元素是原先元素的求更好,然后分别乘以前一个矩阵和后一个矩阵,这样就将中间的方阵吸收了,最后变成M*K矩阵乘以K*N矩阵,这个结果就是所需要的,通过这个分解达到两个目的,第一个找到同义词,假如在同一个topic里面的权重都很高,两个词在列上面的权重差不多的就是一个同义词,如果权重略有差别,就是说这个意思相对比较接近,接近程度有多少就看这个数值,这个是分析出同义词,这个在搜索引擎里面是这么干的,怎么找出同义词,为什么搜索汽车能搜索出包含宝马的文档,其实就是从矩阵里面得出来的,不需要考虑具体的词,只需要考虑隐分类,用隐分类对文本进行处理,分解出来的矩阵都是宝贝,都很有用,所以不得不服气。

 

    左边这个矩阵每一个行相当于是一个词向量,如果两个词在同一个topic里面出现,这个说明他们的意思是相近的,这里近义词和同义词的意思跟学语文或者是英语不一样,相比近义词,应该说成关联词汇比较好,说明一种悲伤的情绪,或者某种功能的药物,“阳伟”和“伟哥”都会出现在新药品里面,他们经常出现在用一个topic里面,但是不能说这两个词是同义词,只能说是有关的,所以的话同义词和近义词的理解也要注意好,和传统的在语文里面所说的哪些同义词或者近义词有区别的,最右边就是压缩之后的向量,这个topic同样可以用来判断这个文档是不是相似,维度比较低,有很大的简便性,计算欧式距离。

也可以通过隐语义的方法将两个将两个矩阵分解,隐语义的分解方法就不细讲了,之后通过别的帖子讲解。

 

pLSA算法讲解

     原始矩阵里面的元素不是计算TF-IDF值,而是全部体现为概率,右边也是概率,全部使用的是概率的语言来求解这个过程,在求解里面没有使用SVD,而是使用EM算法,当做使用求解变量,使用EM算法来求解变量,所以这个方法在LSA的名称前面加上了一个pLSA,p表示的就是概率的意思。

基于SVD和pLSA算法的文本主题分类-- 追根究底

  1. 首先以为P(di)来抽中一个概率,可以将P(di)看成是已经给出的概率。

     2、然后呢在抽中di的基础上再掷骰子,以这个概率P(zk|di)来抽中主题zk,这个P(zk|di)看成是不知道的东西,等一下将这个当成变量去求。

     3、下面就进行掷骰子,P(wj|zk)然后再以P(wj|zk的概率抽中一个单词。

不断重复这个过程就会产生很多很多的单词,形成很多很多的主题,形成很多很多的文档,将写作的过程就考虑成这个样子。

基于SVD和pLSA算法的文本主题分类-- 追根究底

将刚才的过程就写成上面的这个式子。

     这里比较有兴趣的是求联合概率密度,我们想求的是基于SVD和pLSA算法的文本主题分类-- 追根究底这个概率,然后按照贝叶斯公式写成基于SVD和pLSA算法的文本主题分类-- 追根究底这两个相乘,基于SVD和pLSA算法的文本主题分类-- 追根究底又能展开,这里用到了贝叶斯公式,现在要做的就是现在有一个样本。

                                             基于SVD和pLSA算法的文本主题分类-- 追根究底

     现在我们能够看到p(di,wj)的抽样情况,也就是原始矩阵使用概率的表达形式,行式wi,列是dj,将这个矩阵元素看成一个概率,这个就是描述wi,dj的联合概率,可以将这个考虑成为联合分布密度的抽样,抽样出来得到一个矩阵。

基于SVD和pLSA算法的文本主题分类-- 追根究底

     这个就是这个式子的左边,现在要将这个式子的右边的分解式子求出来,右边这里zk相当于是topic,zk是列方向上面的,基于SVD和pLSA算法的文本主题分类-- 追根究底相当于是等号右边第一个矩阵中的元素,基于SVD和pLSA算法的文本主题分类-- 追根究底是等号右边第二个矩阵中的元素,只是将刚才使用矩阵表达的模型改成使用概率论来表达,这里面并没有很大的变化,唯一不同的是前面还乘上了一个基于SVD和pLSA算法的文本主题分类-- 追根究底,这个基于SVD和pLSA算法的文本主题分类-- 追根究底可以考虑成为一个归一化因子的东西,因为我们在这里要求所有元素加起来等于1,对于矩阵分解来说没有起到关键的作用。

     下面呢关键的就是怎么求右边的分解出来的矩阵中的各个元素,相当于求各个基于SVD和pLSA算法的文本主题分类-- 追根究底基于SVD和pLSA算法的文本主题分类-- 追根究底

                                   基于SVD和pLSA算法的文本主题分类-- 追根究底

     可以使用最大似然来表述这个事情,构造一个对数似然函数,基于SVD和pLSA算法的文本主题分类-- 追根究底表示的是这个单词wj在文档di里面出现了多少次,每一次出现看成是独立的事件的话,出现n次数就是将n个概率乘起来,即将n个p(di,wj)相乘,本来n是幂,但是由于是求log,就将n放到了前面,其实就是这个意思,通过前面的讲解,将基于SVD和pLSA算法的文本主题分类-- 追根究底替换成为基于SVD和pLSA算法的文本主题分类-- 追根究底,现在要使得最大似然函数获得最大值,在这里全部使用的是概率的语言,所以我们不提矩阵元素,这里全部都是概率,基于SVD和pLSA算法的文本主题分类-- 追根究底可以从样本里面求得,这个log里面都是未知数,现在就要求他的极值,这个里面i、j、k都是比较大的数目,想想这里一堆未知数也是很头疼的,这里使用EM算法来求解。

    将似然函数写成期望的形式。

    EM算法里面讲解要使得jensen不等式里面的等号成立的话有一个条件,这个条件就是αj要要全部相同。

                            基于SVD和pLSA算法的文本主题分类-- 追根究底

Log移动到里面就是因为使用了jensen不等式,其实基于SVD和pLSA算法的文本主题分类-- 追根究底就相当于EM算法里面的αj,要使得等号成立的条件就是αj要求全部相同,αj是一个条件概率,为什么这个条件概率有两个,一个是di一个是wj,因为我们在这里讨论了di和wj,我们的概率也是针对di和wj,所以条件概率有两个,也有两重,原因就在这里。

                                                              基于SVD和pLSA算法的文本主题分类-- 追根究底

怎么用这个式子进行EM求解呢,上面的公式就是使用贝叶斯演算出来的,没有什么不寻常的,条件概率被完全表达成为这些未知数,怎么做才能求解EM过程呢,假设我知道这些未知数了,基于SVD和pLSA算法的文本主题分类-- 追根究底如果这个知道了的话,上面的公式的值就能算出来,那么上面的期望值就变得简单了,就是外面基于SVD和pLSA算法的文本主题分类-- 追根究底已经能求出来了,里面基于SVD和pLSA算法的文本主题分类-- 追根究底假装不知道,再求里面的最大值,这个里面的最大值怎么求呢,就是变量的对数求和,这个使用拉格朗日算法。

                                                                    基于SVD和pLSA算法的文本主题分类-- 追根究底

这两个考虑为约束。

                                       基于SVD和pLSA算法的文本主题分类-- 追根究底

构造拉格朗日函数,在对拉格朗日函数求偏导数,解方程组的等等。

                                                  基于SVD和pLSA算法的文本主题分类-- 追根究底

就能得到这两个求解的式子,知道这个式子之后有带入基于SVD和pLSA算法的文本主题分类-- 追根究底这个式子里面,又能得到新的概率,又代入基于SVD和pLSA算法的文本主题分类-- 追根究底,不断循环这个过程,如果前后两次的概率已经相差很少了,就收敛了,收敛到最后将所有得到条件概率都求解出来,这个条件概率求解出来相当于求解出来了右边的两个分解矩阵。

这样可以使用基于SVD和pLSA算法的文本主题分类-- 追根究底来判断两个文档是不是相似,组成一个基于主题的概率向量,通过这个来辨认文档的相似性,文档的分类,通过基于SVD和pLSA算法的文本主题分类-- 追根究底可以比较不同的词属于同一个主题的概率,是不是相近来判断是不是同义词还是近义词,就可以做这个事情。

 

这个就是pLSA,源动力就是SVD求解很复杂,要得到更好的方法,结果得到使用概率描述的LSA模型,然后使用EM算法加以求解,没有这么强的维度灾难。

参考:

https://blog.csdn.net/zhongkejingwang/article/details/43053513

SVD在文本分类中的应用

https://blog.csdn.net/chlele0105/article/details/12983833

相关文章:

  • 2021-09-02
  • 2021-06-18
  • 2021-09-24
  • 2021-07-16
  • 2022-12-23
  • 2022-02-08
  • 2021-05-08
  • 2021-08-15
猜你喜欢
  • 2022-01-10
  • 2021-07-07
  • 2021-10-12
  • 2022-12-23
  • 2021-11-18
  • 2021-10-11
  • 2022-01-05
相关资源
相似解决方案