LDA入门浅谈

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.什么是主题模型

在我的博客上,有篇文章《基于双数组Trie树的Aho Corasick自动机极速多模式匹配》被归入算法目录,算法即为该文章的主题。而该文章因为涉及到中文分词,又被我归入了分词目录。所以该文章的主题并不单一,具体来说文中80%在讲算法,20%稍微讲了下在分词中的应用。

传统的文本分类器,比如贝叶斯、kNN和SVM,只能将其分到一个确定的类别中。假设我给出3个分类“算法”“分词”“文学”让其判断,如果某个分类器将该文归入算法类,我觉得还凑合,如果分入分词,那我觉得这个分类器不够准确。

假设一个文艺小青年来看我的博客,他完全不懂算法和分词,自然也给不出具体的备选类别,有没有一种模型能够告诉这个白痴,这篇文章很可能(80%)是在讲算法,也可能(19%)是在讲分词,几乎不可能(1%)是在讲其它主题呢?

有,这样的模型就是主题模型。

2.什么是LDA

潜在狄立克雷分配(Latent Dirichlet Allocation,LDA)主题模型是最简单的主题模型,它描述的是一篇文章是如何产生的。如图所示:
这里写图片描述

从左往右看,一个主题是由一些词语的分布定义的,比如蓝色主题是由2%几率的data,2%的number……构成的。一篇文章则是由一些主题构成的,比如右边的直方图。具体产生过程是,从主题集合中按概率分布选取一些主题,从该主题中按概率分布选取一些词语,这些词语构成了最终的文档(LDA模型中,词语的无序集合构成文档,也就是说词语的顺序没有关系)。
如果我们能将上述两个概率分布计算清楚,那么我们就得到了一个模型,该模型可以根据某篇文档推断出它的主题分布,即分类。由文档推断主题是文档生成过程的逆过程。

在《LDA数学八卦》一文中,对文档的生成过程有个很形象的描述:
这里写图片描述

3.概率模型

LDA是一种使用联合分布来计算在给定观测变量下隐藏变量的条件分布(后验分布)的概率模型,观测变量为词的集合,隐藏变量为主题。
LDA的生成过程对应的观测变量和隐藏变量的联合分布如下:
这里写图片描述

式子有点长,耐心地从左往右看:
式子的基本符号约定——β表示主题,θ表示主题的概率,z表示特定文档或词语的主题,w为词语。进一步说——

β1:K为全体主题集合,其中βk是第k个主题的词的分布(如图1左部所示)。第d个文档中该主题所占的比例为θd,其中θd,k表示第k个主题在第d个文档中的比例(图1右部的直方图)。第d个文档的主题全体为zd,其中zd,n是第d个文档中第n个词的主题(如图1中有颜色的圆圈)。第d个文档中所有词记为wd,其中wd,n是第d个文档中第n个词,每个词都是固定的词汇表中的元素。

p(β)表示从主题集合中选取了一个特定主题,p(θd)表示该主题在特定文档中的概率,大括号的前半部分是该主题确定时该文档第n个词的主题,后半部分是该文档第n个词的主题与该词的联合分布。连乘符号描述了随机变量的依赖性,用概率图模型表述如下:

这里写图片描述

比如,先选取了主题,才能从主题里选词。具体说来,一个词受两个随机变量的影响(直接或间接),一个是确定了主题后文档中该主题的分布θd,另一种是第k个主题的词的分布βk(也就是图2中的第二个坛子)。

4.后验分布

沿用相同的符号,LDA后验分布计算公式如下:
这里写图片描述

分子是一个联合分布,给定语料库就可以轻松统计出来。但分母无法暴力计算,因为文档集合词库达到百万(假设有w个词语),每个词要计算每一种可能的观测的组合(假设有n种组合)的概率然后累加得到先验概率,所以需要一种近似算法。

基于采样的算法通过收集后验分布的样本,以样本的分布求得后验分布的近似。

θd的概率服从Dirichlet分布,zd,n的分布服从multinomial分布,两个分布共轭,所谓共轭,指的就是先验分布和后验分布的形式相同:

这里写图片描述

两个分布其实是向量的分布,向量通过这两个分布取样得到。采样方法通过收集这两个分布的样本,以样本的分布近似。

5.LDA求解方法

对于标准的LDA,模型求解是一个非常复杂的最优化问题,很难有精确的求解方法,所以我们采用不精确的模型求解方法。大概有三种不精确的方法进行模型的求解:1.Gibbs采样的方法。2.基于变分的EM求解。3.基于期望推进的方法。一般来说,Gibbs采样的方法推导起来更为简单而且求解效果也不错。

在简书上看到一段对LDA比较简单的入门级描述,特意摘录下来:
先简单的说一下LDA的核心思想:我们认为每一个文档Doc都是由多个主题Topic组成,而每一个主题Topic由多个词Word组成。

通过对语料库D中所有的文档d进行分词或者抽词处理之后,通过模型训练(具体的训练过程我就不写了,有点复杂,而且我不一定能够写清楚),我们得到两个概率矩阵:一是每一个Doc对应K个Topic的概率;二是每一个Topic对应N个词组成的词表的概率。

有了这两个概率矩阵,那么,我们需要的是每一个Doc对应的Word概率,然后找M个概率最大的词作为关键词。有Topic作为中间桥梁,那还有什么问题么?

并且,从这里,我们会发现,通过LDA模型进行关键词查找,其关键词不再依赖于词是否出现在该文档中,这点与传统的基于统计模型的主题抽取方式是不一样的。

算法实践:
在写这篇文章的时候,我们刚把LDA结果跑出来,词表大约5W左右,K值设置的大概是200,迭代次数为100左右。出来的结果简直惨不忍睹。
具体的方式也可以稍微的说一说,我们使用了Spark MLlib上的LDA实现。

(1)DistributedLDAModel类中有describeTopics方法,可以获取到每一个Topic对应的词Word概率矩阵;
(2)DistributedLDAModel类的topTopicsPerDocument方法可以获取到每一个Doc对应的K个Topic概率矩阵;
(3)有了如上两个矩阵,求Doc到Word的概率矩阵不是手到擒来?
(4)对于新文本,DistributedLDAModel类同样提供了topicDistributions方法进行新文档对应于K个Topic的概率预测;

参数肯定还是会继续调整的,但从我个人的角度上来说,我们目前的业务场景并不是很适合LDA算法模型,首先个人认为K值会比较大,因为K值的设置需要尽量的跟实际情况吻合,而我们的业务场景恰巧是主题分散的类型。
其次,LDA主题模型是三层概率模型,通过中间层进行桥接,概率映射的精度会进一步下降,所以,个人认为在富文本的场景下,直接的统计模型不会输于LDA。
再其次感觉就是LDA对干扰词相当的敏感,当然,也或许是我们没有用好。总之,我们会继续的进行探索。

简书原文地址:http://www.jianshu.com/p/72149cc6810b

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值