csdn博客推荐系统实战-5文本聚类-话题模型LDA

推荐系统实战 专栏收录该内容
16 篇文章 1 订阅

话题模型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苦思冥想,最后没办法,想了个馊主意,它说 灵感=随机

这也是没办法中的办法。因此对于某一篇文章的生产过程是这样的:

  1. 确定主题和词汇的分布
  2. 确定文章和主题的分布
  3. 随机确定该文章的词汇个数N
  4. 如果当前生成的词汇个数小于N执行第5步,否则执行第6步
  5. 由文档和主题分布随机生成一个主题,通过该主题由主题和词汇分布随机生成一个词,继续执行第4步
  6. 文章生成结束

只要确定好两个分布(主题与词汇分布,文章与主题分布),然后随机生成文章各个主题比例,再根据各个主题随机生成词,词与词之间的顺序关系被彻底忽略了,这就是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各种衍生的算法模型,没准会有惊喜!

  • 4
    点赞
  • 3
    评论
  • 24
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 3 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

worryabout

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值