NLP︱LDA主题模型的应用难题

NLPLDA主题模型的应用难题

 

将LDA跟多元统计分析结合起来看,那么LDA中的主题就像词主成分,其把主成分-样本之间的关系说清楚了。多元学的时候聚类分为Q型聚类、R型聚类以及主成分分析。R型聚类、主成分分析针对变量,Q型聚类针对样本。

PCA主要将的是主成分-变量之间的关系,在文本中LDA也有同样的效果,将一撮词(变量)变成话题(主成分),同时通过画像主成分,可以知道人群喜欢什么样子的话题;

Q型聚类代表样本之间的群落关系。

 

LDA假设前提:主题模型中最主要的假设是词袋假设(bag of words),指通过交换文档内词的次序而不影响模型训练的结果,模型结果与词的顺序无关。

主题模型中最重要的参数就是各个文档的主题概率分布和各个主题下的词项概率分布。

LDA是一种三层贝叶斯模型,三层分别为:文档层、主题层和词层。

 

两种的估计方法——VEM 以及 gibbs

 

通常逼近这个后验分布的方法可以分为两类:

1. 变异算法(variationalalgorithms),这是一种决定论式的方法。变异式算法假设一些参数分布,并根据这些理想中的分布与后验的数据相比较,并从中找到最接近的。由此,将一个估计问题转化为最优化问题。最主要的算法是变异式的期望最大化算法(variational expectation-maximization,VEM)。这个方法是最主要使用的方法。在R软件的tomicmodels包中被重点使用。

2. 基于抽样的算法。抽样的算法,如吉布斯抽样(gibbssampling)主要是构造一个马尔科夫链,从后验的实证的分布中抽取一些样本,以之估计后验分布。吉布斯抽样的方法在R软件的lda包中广泛使用。

参考:使用R做主题模型:词语筛选和主题数量确定

 

R包列举——lda和topicmodel

在R语言中,有两个包(package)提供了LDA模型:lda和topicmodels。

lda提供了基于Gibbs采样的经典LDA、MMSB(themixed-membership stochastic blockmodel )、RTM(RelationalTopic Model)和基于VEM(variational expectation-maximization)的sLDA  (supervisedLDA)、RTM.。

topicmodels基于包tm,提供LDA_VEM、LDA_Gibbs、CTM_VEM(correlatedtopics model)三种模型。

另外包textir也提供了其他类型的主题模型。

参考:R之文档主题模型

        

但是主题模型存在一个非常大的问题:模型质量问题

1、模型质量较差,话题出来的无效词较多且较难清洗干净;

2、话题之间,区别不够显著,效果不佳;

3、话题内,词和词的关联性很低。

4、反映不出场景,笔者最开始希望得到的是一个话题,里面有场景词+用户态度、情绪、事件词,构成一个比较完善的系统,但是比较天真...

5、话题命名是个难点,基本词语如果效果差了,话题画像也很难了。

 

一、腾讯Peacock案例

来看看腾讯peacock的应用案例:

输入一个词,然后跳出来两个内容:搜索词-主题列表(主题里面有很多词语);搜索词-文档列表。

笔者猜测实现三个距离计算的过程:

先计算搜索词向量和主题词向量距离,主题排序;

再计算搜索词和主题下各个词语向量的距离,词语排序;

最后计算搜索词和文档向量的距离,文档排序。

 

腾讯花了大力气做的主题系统,从中可以看到这样几个信息:

1、总体来看,词和词之间的关联性也不是那么强烈;

2、词性基本都是名词,少有动作、形容词。

 

该系统还做了一些好玩的尝试:利用用户-QQ群矩阵,做主题模型,将QQ群进行聚类,可以很好的了解,不同用户群喜欢什么样子话题群,人数的多少。

 

二、主题模型主要作用(参考博客)



有了主题模型,我们该怎么使用它呢?它有什么优点呢?我总结了以下几点:

  1)它可以衡量文档之间的语义相似性。对于一篇文档,我们求出来的主题分布可以看作是对它的一个抽象表示。对于概率分布,我们可以通过一些距离公式(比如KL距离)来计算出两篇文档的语义距离,从而得到它们之间的相似度。



  2)它可以解决多义词的问题。回想最开始的例子,“苹果”可能是水果,也可能指苹果公司。通过我们求出来的“词语-主题”概率分布,我们就可以知道“苹果”都属于哪些主题,就可以通过主题的匹配来计算它与其他文字之间的相似度。


  3)它可以排除文档中噪音的影响。一般来说,文档中的噪音往往处于次要主题中,我们可以把它们忽略掉,只保持文档中最主要的主题。

4)它是无监督的,完全自动化的。我们只需要提供训练文档,它就可以自动训练出各种概率,无需任何人工标注过程。


  5)它是跟语言无关的。任何语言只要能够对它进行分词,就可以进行训练,得到它的主题分布。


  综上所述,主题模型是一个能够挖掘语言背后隐含信息的利器。近些年来各大搜索引擎公司都已经开始重视这方面的研发工作。语义分析的技术正在逐步深入到搜索领域的各个产品中去。在不久的将来,我们的搜索将会变得更加智能,让我们拭目以待吧。

 

三、主题模型的一些延伸

模型的延伸可以看看 

1、基于LDA的Topic Model变形

用在情感分析中:主题情感偏向性得分,对主题进行打分然后根据主题-文档矩阵,对每个文档的情感进行打分。

主题之间的关联性:根据主题分布的点积相似性,确定相关文本,建立主题之间的关联

时序文本,动态主题模型。

短文本,消除歧义,建立语义相似性聚类;

知识图谱的构建,知识图谱中需要一些集合,潜变量,那么主题建模比较适合作为一个大的包容的集合;

稀疏性利用,在模型中主题-词语矩阵,会有很低频的数据,那么可以强行让其变成0,减少影响。

2、摘录:LDA使用心得

  1. 如果要训练一个主题模型用于预测,数据量要足够大;
  2. 理论上讲,词汇长度越长,表达的主题越明确,这需要一个优秀的词库;
  3. 如果想要主题划分的更细或突出专业主题,需要专业的词典;
  4. LDA的参数alpha对计算效率和模型结果影响非常大,选择合适的alpha可以提高效率和模型可靠性;
  5. 主题数的确定没有特别突出的方法,更多需要经验;
  6. 根据时间轴探测热点话题和话题趋势,主题模型是一个不错的选择;
  7. 前面提到的正面词汇和负面词汇,如何利用,本文没有找到合适的方法;

(参考:R之文档主题模型)

3、摘录:LDA使用心得

整个过程中有很多不甚明朗的地方,我且谨列几条如下:

(1) doc应该怎样定义,是应该以每人为单位训练topicmodel还是应该以每条微博为单位?经过比较我发现以每条微博为单位训练的topicmodel中的每个topic的term类别更加一致;因此我选择了以微博为doc单位训练,并以人为doc单位做inference;不过我没有找到关于这个问题更详细的reference,看到的几篇关于twitter、microblog的topicmodel应用也是用逐条微博作为处理单位。

(2)不同的估计方法之间有什么区别?R包提供的有VEM、Gibbs、CTM等,这里没有做细节的比较,本文后文结果全部以Gibbs估计结果为主。

(3)topicmodel适不适合做短文本的分析?sparsity会带来怎样的问题?实际上以逐条微博为doc单位分析正会导致sparsity的问题,不过我还没意识到它潜在带来的问题。

(4)中文的文本处理感觉很捉急啊……除了分词之外的词性标注、句法分析、同义词等等都没有专门处理的R包,本文也仅做了初步的处理。

5)最后的聚类效果不仅仅考虑名人的专业领域,也考虑了其生活中的情感状态、爱好兴趣等,是一个综合的结果,选取不同的专业领域可以通过选取不同topic做聚类分析而得。

参考文献:原文链接:微博名人那些事儿 

延伸一:主题模型在关键词提取的应用

延伸二:LDA相似文章聚类

         论文:《ClusteringSimilar Stories Using LDA | Flipboard Engineering》by Arnab Bhadury

         去掉一些噪音词,然后LDA模型后用向量来表征文章,提供了一个低纬度、稳健性较强的词向量表达方式。

延伸三:中文标签/话题提取/推荐

来自知乎的一次回答,进行一定的总结:如何为中文文本做中文标签推荐?

1、按照关键词的权值如tfidf值从高到底推荐TopN个关键词作为文本标签推荐给用户。

2、LDA,首先计算各中文文本的K个主题分布,取概率最大的主题,然后取该主题下概率最大的TopN个词作为标签推荐给用户,但是该方法K值不容易确定,最后计算出来的效果还不如第一种方法好。不过,LDA 不适合解决细粒度标签问题,比如提取某个实例名称。

3、标签分发模型(NTDM),来源于社会媒体用户标签的分析与推荐(https://wenku.baidu.com/view/e57ba9c0f121dd36a32d82db.html)

4、抽取关键词还有一个常用的方法就是TextRank ,基于词的窗口共现或者相似度来构建词网,然后基于 PageRank 算法计算词的权重。

延伸四:文本挖掘中主题追踪的可视化呈现

延伸五:迭代的LDA模型

LDA本身作为一种非监督的算法模型,同时也可能由于训练集本身存在有大量的噪声数据,可能导致模型在效果上并不能满足工业上的需求。比如我们经过一次LDA过程之后,得到的每个Topic的词列表(xxx.twords)中,多多少少的混杂有其他Topic的词语或噪声词语等,这就导致后边的inference的正确率不理想。
在LDA过程完成,得到xxx.twords文件之后,我们可以尝试根据“专家经验”,手动去除每个Topic中不应该属于该主题的词。处理完之后,相当于我们得到一个比较理想、比较干净的“先验知识”。
得到这样的“先验知识”之后,我们就可以将它当做变量传入下一次的LDA过程,并在模型初始化时,将“先验知识”中的词以较大概率落到相应的Topic中。同样的训练集、同样的参数再次迭代LDA过程。两三次这样的迭代之后,效果应该就有一定改进。
虽然能在一定程度上改进模型效果,但是这样做也有一定的弊端:大大增大了人工成本,同时如果Topic个数过多(几千上万个),也很难一个个去筛选“先验知识”。

提升的python代码,来源知乎玩点高级的--带你入门Topic模型LDA(小改进+附源码)

延伸六:高效的主题模型如何建立?

本节来源于知乎问答:主题模型(topic model)到底还有没有用,该怎么用?

 

1,文本要长,要长。不长要想办法拼凑变长
2,语料要好,多下功夫去掉翔
3,规模要大。两层意思,一是文档数大,二是主题数多

4,算法上,plda+能支持中等规模; lightlda能支持大规模(本宝宝有点小贡献,插播个广告); warplda应该也可以,不过没开源,实现应该不复杂。

5、应用场景要靠谱。直觉上讲,分类等任务还是要有监督的,不太适合无监督的方法去办。而类似基于内容的推荐应用,这种感觉的东西,LDA是靠谱的。

6、短文本别用。要用也要用twitter lda~~~~

 

Topic Model最适合的变种是加入先验信息:
我相信题主使用的是完全无监督的Topic Model,然而这实在是过于不work~~~浪费了现实生活中那么多的标注数据,有监督的模型一定比无监督的好~所以!可以试试Supervised Topic Model利用你在现实中已有的标注来提高模型准确度~比如利用知乎的tag来train个有监督Topic Model~~~一定会词聚类效果好不少。

开源的的有监督的LDA:
iir/llda.py at master · shuyo/iir · GitHub
chbrown/slda · GitHub

你可能感兴趣的:(数据分析,自然语言处理,Python)