首页 > 编程语言 > 详细

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

时间:2015-08-29 02:05:06      阅读:284      评论:0      收藏:0      [点我收藏+]

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

?

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

?

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

Unigram ?Model

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


bubuko.com,布布扣
?

它的图模型为:


bubuko.com,布布扣

?

II.Unigram的组合

?

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


bubuko.com,布布扣
?
在图模型中就有了Z,作为词们(小球们)的条件:


bubuko.com,布布扣

?

III.??????LDA

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


bubuko.com,布布扣

?

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

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

?

?

bubuko.com,布布扣
?

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

于是咱们万能的工程师出现了,公式不行,咱们一步一步试嘛,连续的不行,咱们采样嘛。所以就诞生了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/

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

原文:http://tulingss.iteye.com/blog/2238740

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!