话题模型topic model是自然语言处理领域里面热门的一个技术,可以用来做很多的事情,例如相似度比较,关键词提取,分类,还有就是具体产品业务上的事了,总之可以干很多的事情。今天不会讲LDA模型的很多细节和原理,没有满屏的数学公式,只讲一讲LDA模型是个什么东西,简单的原理,用什么技术实现的LDA,以及LDA能做什么开发和LDA在实现中的一些问题。
什么是主题
对于一篇新闻报道,看到里面讲了昨天NBA篮球比赛,用大腿想都知道它的主题是关于体育的。为什么大腿会那么聪明呢?这时大腿会回答因为里面出现了“科比”、“湖人”等等关键词。那么好了,我们可以定义主题是一种关键词集合,如果另外一篇文章出现这些关键词,我们可以直接判断他属于某种主题。但是,亲爱的读者请你想想,这样定义主题有什么弊端呢?按照这种定义,我们会很容易给出这样的条件:一旦文章出现了一个球星的名字,那么那篇文章的主题就是体育。可能你马上会骂我在瞎说,然后反驳说不一定,文章确实有球星的名字,但是里面全部在讲球星的性丑闻,和篮球没半毛钱关系,此时主题是娱乐还差不多。所以一个词不能硬性地扣一个主题的帽子,如果说一篇文章出现了某个球星的名字,我们只能说有很大概率他属于体育的主题,但也有小概率属于娱乐的主题。于是就会有这种现象:同一个词,在不同的主题背景下,它出现的概率是不同的。并且我们都可以基本确定,一个词不能代表一种主题,那么到底什么才是主题呢?耐不住性子的同学会说,既然一个词代表不了一种主题,那我就把所有词都用来代表一种主题,然后你自己去慢慢意会。没错,这样确实是一种完全的方式,主题本来就蕴含在所有词之中,这样确实是最保险的做法,但是你会发现这样等于什么都没做。老奸巨猾的LDA也是这么想的,但他狡猾之处在于它用非常圆滑手段地将主题用所有词汇表达出来。怎么个圆滑法呢?手段便是概率。LDA认为天下所有文章都是用基本的词汇组合而成,此时假设有词库V={v1,v2,....,vn},那么如何表达主题k呢?LDA说通过词汇的概率分布来反映主题!多么狡猾的家伙。
我们举个例子来说明LDA的观点。假设有词库{科比,篮球,足球,奥巴马,希拉里,克林顿}
假设有两个主题{体育,政治}
LDA说体育主题:{科比:0.3,篮球:0.3,足球:0.3,奥巴马:0.03,希拉里:0.03,克林顿:0.04}(数字代表某个词的出现概率),
而政治主题: {科比:0.03,篮球:0.03,足球:0.04,奥巴马:0.3,希拉里:0.3,克林顿:0.3}
LDA就是这样说明什么是主题的。
文章在讲什么
给你一篇文章读,然后请你简要概括文章在讲什么,你可能会这样回答:80%在讲政治的话题,剩下15%在讲娱乐,其余都是废话。这里大概可以提炼出三种主题:政治,娱乐,废话。对于某一篇文章,很有可能里面不止在讲一种主题,而是几种主题混在一起的。
LDA是一种可以从文档中提炼主题模型,文章和主题之间并不一定是一一对应的,也就是说,文章可以有多个主题,一个主题可以在多篇文章之中。
假设现在有K个主题,有M篇文章,那么每篇文章里面不同主题的组成比例应该是怎样的呢?由于上一小节我们知道不能硬性的将某个词套上某个主题,那么这里我们当然不能讲某个主题套在某个文章中,也就是有这样的现象:同一个主题,在不同的文章中,他出现的比例(概率)是不同的,文档和主题之间的关系和主题和词汇的关系是多么惊人的类似!
举个例子,假设现在有两篇文章:《体育快讯》,《娱乐周报》
有三个主题 体育,娱乐,废话
那么《体育快讯》是这样的:[废话,体育,体育,体育,体育,....,娱乐,娱乐]
而《娱乐周报》是这样的:[废话,废话,娱乐,娱乐,娱乐,....,娱乐,体育]
一篇文章在讲什么,通过不同的主题比例就可以概括得出。
文章是如何生成的
LDA认为,每个主题会对应一个词汇分布,而每个文档会对应一个主题分布,那么一篇文章是如何被写出来的呢?读者可能会说靠灵感+词汇。LDA脸一沉,感觉完蛋,灵感是什么玩意?LDA苦思冥想,最后没办法,想了个馊主意,它说 灵感=随机这也是没办法中的办法。因此对于某一篇文章的生产过程是这样的:
- 确定主题和词汇的分布
- 确定文章和主题的分布
- 随机确定该文章的词汇个数N
- 如果当前生成的词汇个数小于N执行第5步,否则执行第6步
- 由文档和主题分布随机生成一个主题,通过该主题由主题和词汇分布随机生成一个词,继续执行第4步
- 文章生成结束
只要确定好两个分布(主题与词汇分布,文章与主题分布),然后随机生成文章各个主题比例,再根据各个主题随机生成词,词与词之间的顺序关系被彻底忽略了,这就是LDA眼中世间所有文章的生成过程!聪明的读者肯定觉得LDA完全就是一个骗子,这样认为文章的生成未免也太过天真了吧。然而事实就是如此,这也是为什么说LDA是一个很简单的模型。幸好我们这是用LDA来做主题分析,而不是用来生成文章,而从上上节的分析我们知道,主题其实就是一种词汇分布,这里并不涉及到词与词的顺序关系,所以LDA这种BOW(bag of words)的模型也是有它的简便和实用之处的。
Latent Dirichlet Allocation(LDA)隐含主题模型
LDA是一种三层贝叶斯模型,三层分别为:文档层、主题层和词层。
该模型基于如下假设:
1)整个文档集合中存在k个互相独立的主题;
2)每一个主题是词上的多项分布;
3)每一个文档由k个主题随机混合组成;
4)每一个文档是k个主题上的多项分布;
5)每一个文档的主题概率分布的先验分布是Dirichlet分布;
6)每一个主题中词的概率分布的先验分布是Dirichlet分布。
文档的生成过程如下:
1)对于文档集合M,从参数为β的Dirichlet分布中采样topic生成word的分布参数φ;
2)对于每个M中的文档m,从参数为α的Dirichlet分布中采样doc对topic的分布参数θ;
3)对于文档m中的第n个词语W_mn,先按照θ分布采样文档m的一个隐含的主题Z_m,再按照φ分布采样主题Z_m的一个词语W_mn。
LDA数学分析
省略,网上有很多讲数学分析的,有兴趣的去看看吧,满屏的数学公式,那酸爽,味道好极了
https://blog.csdn.net/aws3217150/article/details/53840029
https://blog.csdn.net/baidu_18607797/article/details/40511755
https://blog.csdn.net/sinat_26917383/article/details/52233341
LDA模型能做什么
在NLP中用处还很大的。
自动发现大量文本中的规律性。首先概率主题模型提出一个“主题”的概念,可以自动发现主题,并且将主题相关的词语列出来。比如对大量科学论文进行LDA建模,可以将生物相关的主题发掘出来,并且给出主题词如“动物”、“植物”、“基因”。并且这个发现过程是非监督的,不需要人工干预的,很适合处理海量网络文本信息。
降维。对于一篇文档如果很长的话,比如有几万字,如果我们使用文档的词语作为信息处理的单元,显然信息量太大,相当于一个上万维的向量,必须要进行信息维度的降维。而LDA主题模型正是一个良好的降维模型。比如我们将主题定为100个,对文档进行建模,就可以将一篇文档的信息降成100维。
衡量文档之间的语义相似性。对于一篇文档,我们求出来的主题分布可以看作是对它的一个抽象表示。对于概率分布,我们可以通过一些距离公式(比如KL距离)来计算出两篇文档的语义距离,从而得到它们之间的相似度。
多义词。回想最开始的例子,“苹果”可能是水果,也可能指苹果公司。通过我们求出来的“词语-主题”概率分布,我们就可以知道“苹果”都属于哪些主题,就可以通过主题的匹配来计算它与其他文字之间的相似度。
排除文档噪音。一般来说,文档中的噪音往往处于次要主题中,我们可以把它们忽略掉,只保持文档中最主要的主题。
LDA开源库
1.Gensim:Python,实现模型,LDA,Dynamic Topic Model,Dynamic Influence Model,HDP,LSI,Random Projections,深度学习的word2vec,paragraph2vec。
官网地址:http://radimrehurek.com/gensim/index.html
github代码地址:https://github.com/piskvorky/gensim
2.Shuyo:Python,实现模型,LDA,Dirichlet Process Gaussian Mixture Model,online HDP,HDPLDA,Interactive Topic Model,Labeled LDA
github代码地址:https://github.com/shuyo/iir/tree/master/lda
3.arongdari:Python,实现模型,LDA,Correlated Topic Model,Relational topic model,Author-Topic model,HMM-LDA,Discrete Infinite logistic normal,Supervised Topic Model,Hierarchical Dirichlet process,Hierarchical Dirichlet scaling process
地址:https://github.com/arongdari/python-topic-model
4.ahmaurya:Python,实现模型,Topic Over Time
github代码地址:https://github.com/ahmaurya/topics_over_time
5.Blei实验室的代码:Python,实现模型,online lda,online HDP,turbo topic model,topic model visualization engine,实现语言,C,实现模型,correlated topic model,discrete infinite logistic normal,HLDA,lda,实现语言C++,实现模型,ctr,class-slda,Dynamic Topic model and the influence model,实现语言R,实现模型 lda
github代码地址:http://www.cs.columbia.edu/~blei/topicmodeling_software.html
LDA使用注意
1.LDA不是万能的,只用LDA解决问题,要看数据样本,数据样本质量好,LDA效果就好,反之就不好,切记切记!
2.要训练一个主题模型用于预测,数据量要足够大,足够大,够大,大!
3.想要主题划分的更细或突出专业主题,需要专业的词典!
4.主题数的确定没有特别突出的方法,更多需要经验!
5.文章内容要长,不长的话也要想办法加长,不适合短文本,非要做的话用,twitter lda!
6.应用场景要靠谱。分类等任务还是要有监督的,不太适合无监督的方法。基于内容的推荐应用,LDA是OK的!
7.如果LDA效果不好,可以看看LDA各种衍生的算法模型,没准会有惊喜!