`

IT女神说自然语言处理(1)----LDA

阅读更多

PS:我非常有幸请到一位IT女神,为我们分享自然语言处理的相关实践,希望大家踊跃使用图灵搜索或者关注图灵搜索微信平台,获取女神的第一手技术分享。

 

主题词提取算法LDA -- Latent Dirichlet Allocation

 

在自然语言处理中,文本的主题词提取一直都是重要的技术之一。在不清楚语言的语法和结构的情况下,我们一般可以按照统计学的方式来操作。从最简单的单一图模型开始

Unigram  Model

我们可以将一片文档认为是像高中概率课里装彩球的袋子,而词汇就是彩色的球。将所有的词当做一池子彩球,每一个词汇都有一个颜色(可以有很多相同颜色的球在池中。那么一篇文章可以被看做是一个袋子,那么这个袋子的概率就是组成它的所有词的概率的乘机:



 

它的图模型为:


 

II.Unigram的组合

 

    当我们想知道,这篇文章的主题的时候,就等于为原来池子里面的球又加上了话题分割,认为某词在不同主题下的概率也不同,那么原来这袋子词又可以表示为:  



 
在图模型中就有了Z,作为词们(小球们)的条件:


 

III.      LDA

   然而,研究出LDA的大牛们显然不满足于用这么简单的模型来描述概率的奥妙,所以他们又为主题的概率,文章词量,词由主题生成的概率等加上了不同的概率模型,将文档的概率模型扩充成下面这个样子:


 

其中的分布就是服从狄利克雷分布(Dirichlet)的,也就是我们LDA中间那个神一样的D。主题Z便是由以θ为参数的多项式分布生成出来的,这个狄利克雷分布就是用来描述分布之上的分布。

╮(╯▽╰)╭这又是后话了,如果小伙伴有兴趣可以来信探讨。先来瞧瞧,维基百科上它长这个样子:

 

 


 

  好了,大牛们把模型搞到这么复杂之后他们自己也不会优化了,这又涉及到凸优化的,最大似然的问题。。。咱们先放放。。。

于是咱们万能的工程师出现了,公式不行,咱们一步一步试嘛,连续的不行,咱们采样嘛。所以就诞生了LDA家族中最朴实的一员:GibbsLDA。它采用Monte Carlo的方式进行了采样(亲,不要查字典了,这个词是蒙特卡洛,是个城市,也是无监督学习中非常重要的算法)

 

GibbsLDA

   这个算法几百行代码就可以实现,网上也有很多实例。就给大家介绍一    个很好用的C++工具包:GibbsLDA++。代码包可以在这里下到:http://sourceforge.net/projects/gibbslda/

 

安装

 

     如果你的电脑里面有g++环境,那么直接解压缩后在目录下make即可  ,可能会有一些基础头文件需要引入: #include <cstdlib>  #include      <cstdio>

 

实例

     我们可以直接跑一下它现有的示例文件:    models/casestudy/trndocs.dat

如果有自己想训练的数据集可以按照这个文档做预处理。第一行是训练集中文章的条数,从第二行开始是经过切词处理的文本,一行为一个文章。

 

进入terminal,直接输入:

     ./lda -est -alpha 0.5 -beta 0.1 -ntopics 100 –niters 1000 -savestep 100 -twords 20 -dfile models/casestudy/trndocs.dat

其中:

  •    -est 是从头开始训练模型,
  •    -alpha是对图中α 参数的选择(可选),
  •    -beta是对图中β参数的选择(可选),
  •    –niters 是模型训练需要循环采样的次数(可选),
  •    -savestep 是第几步的模型需要被存储下来(可选),由于没有一个比较    好的停止条件,我理解这样的方式是可以减小一些过拟合的危险。
  •    -twords是top多少的词汇用来表示一个topic(可选),
  •    -dfile 是表示训练集的路径。

     可选的参数在程序中都已设定好了default值

 

结果

 

  • GIBBSLDA++会在同一路径下生成多个模型文件:
  • <model_name>.others: 中存储的是训练参数,就是我们刚刚输入进去的那些。。。
  • <model_name>.phi: 中存储的是,词在话题下的分布,p(wordw|topict)
  • <model_name>.theta:中存储的是,话题在文章下的分布,p(topict|documentd)
  • <model_name>.tassign:中存储的是,在训练集中,给每个词都分配哪个话题。每个文章都会有一个这样的list:<wordij>:<topic of wordij>
  • <model_file>.twords: 这里,就是当时我们定义的,对于每个话题,最有可能含有的词。

 

 

Reference:

[1] Latent Dirichlet Allocation(LDA) - David M.Blei http://www.xperseverance.net/blogs/2012/03/17/

[2] Dirichlet distribution, Wikipedia, https://en.wikipedia.org/wiki/Dirichlet_distribution

[3] GibbsLDA++, Xuan-Hieu Phan, A C/C++ Implementation of Latent Dirichlet Allocation (LDA) using Gibbs Sampling for Parameter Estimation and Inference, http://gibbslda.sourceforge.net/

  • 大小: 5.5 KB
  • 大小: 6.7 KB
  • 大小: 10.3 KB
  • 大小: 11.2 KB
  • 大小: 8.8 KB
  • 大小: 56.6 KB
2
1
分享到:
评论
1 楼 淫笑琪 2015-09-03  
女神照片呢。。

相关推荐

Global site tag (gtag.js) - Google Analytics