自然语言处理-LDA主题模型

转载自:

https://blog.csdn.net/weixin_41090915/article/details/79058768

https://blog.csdn.net/u010159842/article/details/80332030

 

LDA主题模型

一、LDA主题模型简介
LDA(Latent Dirichlet Allocation)中文翻译为:潜在狄利克雷分布。LDA主题模型是一种文档生成模型,是一种非监督机器学习技术。它认为一篇文档是有多个主题的,而每个主题又对应着不同的词。一篇文档的构造过程,首先是以一定的概率选择某个主题,然后再在这个主题下以一定的概率选出某一个词,这样就生成了这篇文档的第一个词。不断重复这个过程,就生成了整篇文章(当然这里假定词与词之间是没有顺序的,即所有词无序的堆放在一个大袋子中,称之为词袋,这种方式可以使算法相对简化一些)。

LDA的使用是上述文档生成过程的逆过程,即根据一篇得到的文档,去寻找出这篇文档的主题,以及这些主题所对应的词。

白话解释:比如document1的内容为:[自从乔布斯去世之后,iPhone再难以产生革命性的创新了] 
通过上述的方法,document1将对应两个主题topic1,topic2,进而,主题topic1会对应一些词:[苹果创始人][苹果手机],主题topic2会对应一些词:[重大革新][技术突破]。于是LDA模型的好处显而易见,就是可以挖掘文档中的潜在词或者找到两篇没有相同词的文档之间的联系。

 

二、算法流程
(超详细,超通俗易懂,逻辑脉络超清晰)

我们以文档集合D中的文档d为例,文档d中包含单词序列<w1,w2,...wn><w1,w2,...wn>,wiwi表示第ii个单词,设d中有nn个单词; 
文档集合D中出现的全部词组成VocabularyVocabulary; 
首先将文档d作为算法的输入,并输入主题数K,此时d对应到各个主题的概率为θd=(pt1,pt2,...ptk)θd=(pt1,pt2,...ptk),ptipti为d对应第ii个主题的概率; 
此时输入到算法中的只有文档d和主题数K,那么pt1,pt2...ptkpt1,pt2...ptk的数值从何而来?

我们首先人为设置文档d中对应主题t1,t2,...tkt1,t2,...tk的词的个数,比如文档d中5个词对应主题t1t1,7个词对应主题t2t2,…,4个词对应主题tktk,那么此时,我们就人为确定了一个参数向量(5,7,…4),将这个向量记作α⃗ α→,这个我们人为设置的参数向量称为超参数。 
那么如何将超参数α⃗ α→转化为概率分布θd=(pt1,pt2,...ptk)θd=(pt1,pt2,...ptk)呢?

这里我们引入狄利克雷分布函数: 
Dirichlet(p1,p2,p3|α1,α2,α3)=Γ(α1+α2+α3)Γ(α1)Γ(α2)Γ(α3)pα1−11pα2−22pα3−33
Dirichlet(p1,p2,p3|α1,α2,α3)=Γ(α1+α2+α3)Γ(α1)Γ(α2)Γ(α3)p1α1−1p2α2−2p3α3−3
它所表达的含义简单来说就是,已知α1,α2,α3α1,α2,α3的条件下,概率p1,p2,p3p1,p2,p3的概率分布,也就是概率的概率,分布的分布。再直观点说就是:比如在已知α1,α2,α3α1,α2,α3为(5,7,4)(5,7,4)的条件下,样本点p1,p2,p3p1,p2,p3为(0.4,0.5,0.1)(0.4,0.5,0.1)的概率是多少。

那么我们将上述的三维DirichletDirichlet函数扩展为KK维,即在已知α⃗ α→的条件下,得到p⃗ p→的分布(α⃗ ,p⃗ α→,p→分别为K维向量)。KK维DirichletDirichlet公式如下: 
Dirichlet(p⃗ |α⃗ )=Γ(∑Kk=1αk)∏Kk=1Γ(αk)∏k=1Kpαk−1k
Dirichlet(p→|α→)=Γ(∑k=1Kαk)∏k=1KΓ(αk)∏k=1Kpkαk−1
至此,我们通过输入超参数α⃗ α→得到了文档d的关于K个主题的狄利克雷分布: 
θd=Dirichlet(α⃗ )
θd=Dirichlet(α→)

其含义显然,DirichletDirichlet的输入参数为α⃗ α→,得到的输出为可以理解为一个矩阵: 
(pt1,pt2,...ptk)(pt1,pt2,...ptk) 
............ 
............ 
(pt1,pt2,....ptk)(pt1,pt2,....ptk) 
即文档d对应各个主题tktk的概率分布的分布。
同理,我们可以将任一主题tktk产生各个词的概率表示出来。人为设置主题tktk产生的各个词的数量,即设置超参数,用向量η⃗ η→来表示。同上所述,将η⃗ η→作为DirichletDirichlet函数的输入参数,得到主题tktk产生各个词的狄利克雷分布: 
βk=Dirichlet(η⃗ )
βk=Dirichlet(η→)
此时我们已经得到了文档d对应各个主题的概率分布的分布(即狄利克雷分布)θdθd,以及文档tktk产生各个词的概率分布的分布βkβk,那么接下来,我们要从文档d中取出第i个词,求这个词对应各个主题的分布; 
换句大家熟悉的话来说就是:已知第i个词wiwi在文档d中出现n次,且已知它对应各个主题的概率(这里每个词对应各个主题的概率就是文档d对应各个主题的概率,二者同分布),求该词被各个主题产生的次数; 
这就等同于我们熟知的一共有n个球,且已知红球、黄球、绿球的概率分别为p1,p2,p3p1,p2,p3,求这n个求当中红球、黄球、绿球的个数。

那么如何通过文档d对应各个主题的分布θdθd得到文档中的每个词被各个主题产生的次数,进而重新得到文档d中对应各个主题的词的个数呢?

首先我们引入十分熟悉的多项式分布: 
multi(m1,m2,m3|n,p1,p2,p3)=n!m1!m2!m3!pm11pm22pm33
multi(m1,m2,m3|n,p1,p2,p3)=n!m1!m2!m3!p1m1p2m2p3m3

这个公式的意义总所周知:已知一共n个球,且知道每种颜色球的概率,就可以得到有m1m1个红球,m2m2个黄球,m3m3个绿球的概率。
那么同样将其扩展为K维,将θdθd作为参数,就可以得到文档d中第i个词wiwi对应的各个主题的多项式分布zdn=multi(θd)zdn=multi(θd) 
于是,非常值得庆幸,我们通过文档d对应各个主题的概率θdθd,进而得知文档d中各个词对应各个主题的概率,且知道这个词在文档d中的出现次数,于是求得这个词被各个主题的产生次数,遍历文档d中的每一个词,就可以得到新的文档d中对应各个主题的词的个数。 
白话举例:文档d对应主题t1,t2t1,t2的概率分别为pt1,pt2,pt1,pt2,,于是文档d中词w1w1对应的主题t1,t2,t1,t2,的概率也分别为pt1,pt2pt1,pt2,又得知词w1w1在文档d中出现了15次,于是得到词w1w1由主题t1,t2t1,t2产生的次数分别为10次、5次(这个是假设的); 
对文档d中的每个词都执行此操作,(假设文档中只有两个词)词w2w2由主题t1,t2t1,t2产生的次数分别为13次、2次,于是就能重新得到文档d中对应各个主题的词的数量,即对应主题t1,t2t1,t2的词的数量分别为2个、0个(初始的d中对应各个主题的词的数量是人为设定的超参数α⃗ α→)。

于是,我们最终得到了文档d对应各个主题的词的个数的更新值:记作向量n⃗ n→,我们将更新后的向量n⃗ n→再次作为狄利克雷分布的输入向量,即Dirichlet(θd|n⃗ )Dirichlet(θd|n→),就会又会得到文档d对应各个主题的概率的更新值,即更新的θdθd,如此反复迭代,最终得到收敛的θdθd,即为我们要的结果。

有了以上的经验,主题tktk产生各个词的概率βkβk可以同样处理,对于产生文档d中的第ii个词wiwi的各个主题的分布为: 
multi(βi)multi(βi),于是用同上面相同的方法,可以得到更新后的各个主题产生各个单词的数量:记作向量m⃗ m→,将向量m⃗ m→作为新的参数再次带入狄利克雷分布Dirichlet(βk|m⃗ )Dirichlet(βk|m→),就又会得到每个主题产生各个词的概率,即更新的βkβk,如此反复迭代,最终得到收敛的βkβk,即所求结果。

得到了收敛的θdθd和βkβk,算法就大功告成了,这时,该算法就会根据输入的文档d,找到潜在主题下的相关词啦!!!!

++++++++++++++++++++++++++++++++++++++++ 
个人整理,水平有限,可能存在很多错误,希望大家一起探讨研究,还有关于为什么选用狄利克雷分布以及狄利克雷分布和多项式分布之间的关系、先验概率后验概率等内容并没有仔细探讨,作者现在已经生不如死了,先休息休息,过几天再补充吧!! 
++++++++++++++++++++++++++++++++++++++++
 

 

 

上个月参加了在北京举办SIGKDD国际会议,在个性化推荐、社交网络、广告预测等各个领域的workshop上都提到LDA模型,感觉这个模型的应用挺广泛的,会后抽时间了解了一下LDA,做一下总结:

(一)LDA作用

        传统判断两个文档相似性的方法是通过查看两个文档共同出现的单词的多少,如TF-IDF等,这种方法没有考虑到文字背后的语义关联,可能在两个文档共同出现的单词很少甚至没有,但两个文档是相似的。

        举个例子,有两个句子分别如下:

                “乔布斯离我们而去了。”

                “苹果价格会不会降?”

        可以看到上面这两个句子没有共同出现的单词,但这两个句子是相似的,如果按传统的方法判断这两个句子肯定不相似,所以在判断文档相关性的时候需要考虑到文档的语义,而语义挖掘的利器是主题模型,LDA就是其中一种比较有效的模型。

        在主题模型中,主题表示一个概念、一个方面,表现为一系列相关的单词,是这些单词的条件概率。形象来说,主题就是一个桶,里面装了出现概率较高的单词,这些单词与这个主题有很强的相关性。

        怎样才能生成主题?对文章的主题应该怎么分析?这是主题模型要解决的问题。

        首先,可以用生成模型来看文档和主题这两件事。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到的。那么,如果我们要生成一篇文档,它里面的每个词语出现的概率为:

自然语言处理-LDA主题模型

 

        这个概率公式可以用矩阵表示:

自然语言处理-LDA主题模型

 

        其中”文档-词语”矩阵表示每个文档中每个单词的词频,即出现的概率;”主题-词语”矩阵表示每个主题中每个单词的出现概率;”文档-主题”矩阵表示每个文档中每个主题出现的概率。

        给定一系列文档,通过对文档进行分词,计算各个文档中每个单词的词频就可以得到左边这边”文档-词语”矩阵。主题模型就是通过左边这个矩阵进行训练,学习出右边两个矩阵。

        主题模型有两种:pLSA(ProbabilisticLatent Semantic Analysis)和LDA(Latent Dirichlet Allocation),下面主要介绍LDA。

(二)LDA介绍

        如何生成M份包含N个单词的文档,LatentDirichlet Allocation这篇文章介绍了3方法:

        方法一:unigram model

        该模型使用下面方法生成1个文档:

        For each ofthe N words w_n: 
                Choose a word w_n ~ p(w); 

        其中N表示要生成的文档的单词的个数,w_n表示生成的第n个单词w,p(w)表示单词w的分布,可以通过语料进行统计学习得到,比如给一本书,统计各个单词在书中出现的概率。

        这种方法通过训练语料获得一个单词的概率分布函数,然后根据这个概率分布函数每次生成一个单词,使用这个方法M次生成M个文档。其图模型如下图所示:

自然语言处理-LDA主题模型

 

        方法二:Mixture of unigram

        unigram模型的方法的缺点就是生成的文本没有主题,过于简单,mixture of unigram方法对其进行了改进,该模型使用下面方法生成1个文档:

        Choose a topicz ~ p(z); 

        For each ofthe N words w_n: 

                Choose a word w_n ~ p(w|z); 

        其中z表示一个主题,p(z)表示主题的概率分布,z通过p(z)按概率产生;N和w_n同上;p(w|z)表示给定z时w的分布,可以看成一个k×V的矩阵,k为主题的个数,V为单词的个数,每行表示这个主题对应的单词的概率分布,即主题z所包含的各个单词的概率,通过这个概率分布按一定概率生成每个单词。

        这种方法首先选选定一个主题z,主题z对应一个单词的概率分布p(w|z),每次按这个分布生成一个单词,使用M次这个方法生成M份不同的文档。其图模型如下图所示:

自然语言处理-LDA主题模型

 

        从上图可以看出,z在w所在的长方形外面,表示z生成一份N个单词的文档时主题z只生成一次,即只允许一个文档只有一个主题,这不太符合常规情况,通常一个文档可能包含多个主题。

        方法三:LDA(Latent Dirichlet Allocation)

        LDA方法使生成的文档可以包含多个主题,该模型使用下面方法生成1个文档:

        Chooseparameter θ ~ p(θ); 

        For each ofthe N words w_n: 

                Choose a topic z_n ~ p(z|θ); 

                Choose a word w_n ~ p(w|z); 

        其中θ是一个主题向量,向量的每一列表示每个主题在文档出现的概率,该向量为非负归一化向量;p(θ)是θ的分布,具体为Dirichlet分布,即分布的分布;N和w_n同上;z_n表示选择的主题,p(z|θ)表示给定θ时主题z的概率分布,具体为θ的值,即p(z=i|θ)= θ_i;p(w|z)同上。

        这种方法首先选定一个主题向量θ,确定每个主题被选择的概率。然后在生成每个单词的时候,从主题分布向量θ中选择一个主题z,按主题z的单词概率分布生成一个单词。其图模型如下图所示:

自然语言处理-LDA主题模型

 

        从上图可知LDA的联合概率为:

自然语言处理-LDA主题模型

 

        把上面的式子对应到图上,可以大致按下图理解:

自然语言处理-LDA主题模型

 

        从上图可以看出,LDA的三个表示层被三种颜色表示出来:

        1. corpus-level(红色):α和β表示语料级别的参数,也就是每个文档都一样,因此生成过程只采样一次。

        2.document-level(橙色):θ是文档级别的变量,每个文档对应一个θ,也就是每个文档产生各个主题z的概率是不同的,所有生成每个文档采样一次θ。

        3. word-level(绿色):z和w都是单词级别变量,z由θ生成,w由z和β共同生成,一个 单词w对应一个主题z。

        通过上面对LDA生成模型的讨论,可以知道LDA模型主要是从给定的输入语料中学习训练两个控制参数α和β,学习出了这两个控制参数就确定了模型,便可以用来生成文档。其中α和β分别对应以下各个信息:

        α:分布p(θ)需要一个向量参数,即Dirichlet分布的参数,用于生成一个主题θ向量;

        β:各个主题对应的单词概率分布矩阵p(w|z)。

        把w当做观察变量,θ和z当做隐藏变量,就可以通过EM算法学习出α和β,求解过程中遇到后验概率p(θ,z|w)无法直接求解,需要找一个似然函数下界来近似求解,原文使用基于分解(factorization)假设的变分法(varialtional inference)进行计算,用到了EM算法。每次E-step输入α和β,计算似然函数,M-step最大化这个似然函数,算出α和β,不断迭代直到收敛。