LDA主题模型

首先我们去做这个主题模型的时候,比如说我们现在手头上拿到了好多篇文档,我们把这些文档叫做语料,把它们做一个编号记作1……m,而每一篇文档都是由各自的词语所组成的,比如说我们可以用某一种分词手段比如说HMM做分词算法把它分成若干个词,假定说这个词已经有了。现在假定说m等于1000,然后呢我们分成20个主题,也就是说这1000篇文档在谈论20个主题,比如说有武侠的、爱情的、科技的等等,谈每个主题的概率都不一样。比如第一篇文档可能在30%的情况下在谈某一个主题,在20%的情况下在谈某个主题等等等,把各自谈论的每一种主题的概率列出来变成一个向量。对于第一篇文档就可以把它变成长度是20的向量,分别表示对这20个主题的相关度有多大,每一篇文档都这么做。这20个表示的是1号到20号的这样的主题,这个向量叫做这个文档的主题分布,而这20个数加起来正好等于1,每一篇文档都有这么一个主题分布。而这么一个做法哈我们看到,本来第一篇文档是由若干个词的,这个词的个数叫N1,它最后呢变成了长度是20的这么一个向量,第二篇的长度是N2,它变成了长度是20的这么一个向量,每一篇的词长度都如此。

就是说本来每一篇文档的词个数是N1到N1000个,而这个N1到N1000一般来说是比这个20要大的,这样一来它的维度就不再是Ni,就变成了20了。因此我们可以说这个主题模型这个做法相当于就是一个降维。再举个例子,比如说天龙八部它占爱情和武侠的概率可能比较高,而机器学习的主题的概率为0,因此每一篇文档都有一个或者两个是它主要的一个类别。

现在再来聊一聊先验分布和共轭分布这两个名词。

LDA我们还有强调的就是它虽然是通过文本场景提出的,比如说文本分类或聚类,其实如果我们把图像看作是一篇文档,也能够对这个图像进行聚类嘛,而如果拿到生物信息也能够对这个生物信息进行聚类嘛,只要是带隐变量的地方或多或少的都可以用到。比如说要对图像中的某一个东西进行判别就有可能用LDA先对图像进行一个压缩。

然后呢我们来看一下LDA它本身所涉及到的一些事情哈。我们之前跟大家聊过朴素贝叶斯,其实朴素贝叶斯是可以胜任很多文本分类的,但是它没有办法解决一词多义和多词一译的问题。比如说花后面跟上一个朵和跟上一个费它的意义完全不一样。其实朴素贝叶斯更像是一个词法分析或者语义分析,所以说我们要想来做这样一个语义分析可能就需要加上一点隐变量了,什么意思呢,就是说我们增加一个主题,一个词,比如说这是document,这是word,不要它们直接做对应,加上一个topic,那这样的话一个文档有多少个主题,多个主题有多个词,词跟主题之间存在一对多跟多对一的关系,对吧,多个词属于一个主题,一个主题有多个词,就能解决这样一个映射关系对吧。

我们现在这么来看待哈,就是你比方说我们刚才对这么一篇文档,在去做主题模型的时候,本来一篇文档是有Ni个词的,现在都聚成20个主题,每一篇文档都聚成了这么一个向量了,我们现在来想这么一件事情,那第一篇到每一篇文档的第一个元素,那这样的话第一个值它到底是这么得到的呢?或许可以把第一个词看作是一个随机变量,就是说虽然要求的是这些长度是20的向量,但是呢我们把每一个向量看作是随机的,比如第一个字看作是一个随机的,第二个字也看作是一个随机的,每一个主题都看作是一个随机的,那这样的话就需要长度是20的某一个分布来控制这n个分布。或许这里边这个20哈,我们取\alpha ,\beta ,\gamma等等20个数,用某一个分布取得这20个数,那这样的话就给每一个向量中的值记作p1到p20,而那个\alpha ,\beta ,\gamma这20个数不妨把它记作\alpha _1\alpha _{20},那这样的话我们就得到了\prod_{i=1}^{20}p_{i}^{\alpha _i},我们就去做20个随机变量的这么一个分布。P1到p20是20个随机变量,它们组成了一个随机向量,我们对这样一个20维的随机向量做这么一个分布,我们认为这每一个分布,这n个文档所对应的各自的分布,都服从累乘积的这样一个分布,这个分布它其实是这20个多项发布它的隐含着的一个分布,这个分布就叫做Dirichlet分布,它是Beta分布在20维的推广。

关于α调参,如果想让主题鲜明就把α调小一点。

现在来介绍一下LDA整体的结构是什么样子:

          

首先摆在我们面前的有m篇文档,共涉及到了k个主题,然后我们来做主题的聚类,每篇文档的长度分别是N1……Nm个词,然后每一篇文档都取backofwords模型,就是认为一篇文档是由若干个词独立出现来去得到的这个文档,第一篇文档可能里边由N1个词,这些词之间没有顺序,我们认为它们之间是独立的,第一篇文档有N1个词,它就应该有一个长度是k的主题分布,由于长度是k,所以应该是一个多项分布,这个多项分布本身应该有一个参数p,那这样的话应该有p1……pk这k个值对不对,那p1到pk我们认为pi是一个随机变量,它们是怎么来的呢?我们认为这k个值服从参数是α的一个Dirichlet分布,因为它是多项分布的共轭分布,方便我们做推导,这是关于文档的主题,主题就涉及到Dirichlet分布。

然后我们这里边有k个主题对吧,我们拿出1号主题来,因为这里边所有的文章都给我们了,这样的话,所有文章的所有词也给我们了,我们就可以利用这些词做一个词典可以吧,假定说词典的词的个数是V,那么这样的话就是所有的词的总体哈,总体是V,那如此一来,怎么样描述一个主题呢?一个主题总是需要若干个词来描述,比如说有V个词,所以说对于1号主题而言它应该是一个长度是V的这么一个词分布,对吧,1号主题是这么一个词分布,2号主题是另外一个长度是V的词分布,一直到k号主题都是长度是V的词分布。好了,这个词分布虽然维度很高,是V,它还是一个多项分布呀。对吧,你比方说爱情,武侠,作为一个主题,它可能有它的词分布,武侠这个词分布里边可能会出现断狱,降龙十八掌,少林寺对吧,这些词的概率比较高,武侠这个主题出现计算机的概率就非常低。既然如此,这个词分布我们也认为哈,这是p1,这是p2,一直到pv,既然有这么v个概率值,我们认为这v个概率,它服从一个这个参数为β的一个Dirichlet分布,因为Dirichlet分布是多项分布的共轭分布,然后呢这个Dirichlet分布我们就认为它的参数是β,它与α一般是不一样的值。好了,有了这样一个认识呢我们再来往下看这个图是怎么回事哈,首先我们来想第m篇文档的第n个词是这么得到的呢?首先我们有一个由α控制的Dirichlet分布,它其实是所谓的\prod_{i=1}^{20}p_{i}^{\alpha _i},当然前面有一个1/\varphiα,然后呢这样的一个分布是关于P的,因此既然α1到αk给定了,我们总是可以从这个分布当中做采样,对吧,采出一个样本来,它采的样本是什么,它采的样本p1……pk这k个值,没错吧,因此我们采出一个长度是k的向量来,我们认为是这篇文档它的主题采出来了。然后既然这个主题采出来了,根据这个p1到pk,再采出某一个主题出来,因为1号2号k号嘛,那么假定说我们采出某一号来,Zmn表示的是第m篇文档的第n个词的主题的编号。这个β它表示的是p_1^{\beta _{1}-1}p_2^{\beta _{2}-1}......p_v^{\beta _{v}-1}这么一个Dirichlet分布,当然还有一个1/\varphip这么一个系数哈。从这么一个分布当中总是可以采出一个样本出来,这个样本就是p1……pv对不对,所以有了一个p1……pv这么一个长度是v的词分布。

其实LDA是一个标准的生成模型,我们根据这个先验的α跟β得到我们想要的主题分布以及若干个词分布,从这某一个主题里边选择一个合适的词分布,从这个词分布里边选出一个词,就这么一个过程。为什么它是生成模型呢?因为我们最后得到的词就是生成的结果,也就是通过y得到x的时候,这个x指的是每一篇文档中的每一个词,而这个y就是我们对主题,我们需要的是求出它的主题是什么,所有是一个生成模型。

那么现在最关心的就是如何来求这个词它背后所隐藏的这个主题呢。

首先我们现在是一个若干个文档所构成的一个语料库,一个文档的集合。

       

现在这个词它可能有好多种取法,这个词它可能有1……V这么多的取法,它被取到某一个词t的概率是什么呢?也就是我们考虑这个事情。首先是这个主题被选中的概率,主题被选中以后这个词又被选中的概率,对吧,也就是说我们想去看到这个词出现的时候,第mn的词它是等于n的时候,它可能是第k号主题被选中了,那么所我们从这些主题模型里边去选一个第k号主题概率又多大呢。这就是一个全概率公式嘛。

而我们在做的时候用的是非常著名是Gibbs采样,我们可以这么来看,就是我们去来做任何的一个文档,里边可能有一个词,其实想做什么事情呢,这个词Wmn到底是由哪一个Zmn,哪一个主题所产生的,如果说我们在某一个时刻能够计算出来这个文档当中所有的词,每一个词它背后的主题都算出来的话,这个文档的主题模型不就确定出来了嘛。就是我们知道每一个词它背后到底是由哪一个主题所产生的。那么说我们来确定这个事情的时候可以考虑这个事情,就是最开始的时候来随机的进行分配,现在不是假定说有m篇文档,假定说一共有Nm个词的时候,我们从1号词到最后一个词让它做任意的随机的一个初始化,我们认为每一个词它背后的主题应该是什么。那我们现在就来想它应该与什么有关,我们这么来想哈,就是比如说有一篇文档它是天龙八部,那么说出现某一个词的时候我们会发现这个词它背后的主题极有可能是武侠这个主题,就是说如果一篇文档它的主题最后是什么,那么说这个词属于这个主题的概率应该是最高的,因为整个文档是写这个主题的,你这个词应该围绕着这个主题来写嘛。第二个,既然这个词已经摆在这里了,它位于了这些同样的文档当中,这个文档既然有了,现在假定位于同样文档当中的词叫相邻的,就是说我们要想计算某一个词它背后的主题是什么的时候就把这个词本身给它去掉,也就是一个文档它可能背后有若干个词,我们要想重新对这个词进行估算的时候就把当前这个词去掉看其它词的主题是什么,当然我们知道了文档,知道了关注到的词,我们计算一下Zi这个主题它如果等于k号小主题到时候它的概率有多大,就是第i个词它等于第k个主题的概率,就是每一个词它属于每一个主题的概率把它算出来,然后再按照这个概率再来采样出来一个主题,把这个主题赋给第i个词。就相当于把任何一个词它背后的主题都算一遍,算出来k个,而这k个呢不是选择最大的那个赋给它的,而是以概率化的权值去来选择一个第几号主题把它赋过去。

    

也就是说一个词跟一个主题它的联合概率可以写成这个嘛,然后就来数一个事情,事实上这篇文档是有了的,如果我们已经初始化了所有的词它的主题是什么,那么这样的话,如果一共有Nm个词的话,我们其实就初始化了一个长度是Nm的这么个数,这个数表示的就是这个词它背后的主题是什么,这是我们随机初始化的,然后我们初始化完了这样一个事情之后,我们就可以数出来一些当前主题和词之间的对应关系,就是数一下这个词它属于每一个主题的次数是多少,也能够数出来整篇文档当中出现了多少个武侠的主题,出现了多少个爱情的主题,出现了多少个机器学习的主题。

总的来说就是先求每一篇文档的主题分布再求主题分布的词分布。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值