转载自:http://blog.csdn.net/memray/article/details/16810763

 

一、概述

JGibbLDA是一个java版本的LDA(Latent Dirichlet Allocation)实现,它使用Gibbs采样来进行快速参数估计和推断。

LDA是一种由基于概率模型的聚类算法。该算法能够对训练数据(训练数据是这样一种记录的集合,它的每一条记录都是一组离散的项的集合)中的关键项集之于类簇的概率参数拟合模型,进而利用该参数模型实施聚类或分类等操作。

如果你的数据记录是离散的项,想用概率模型进行拟合或“一对多聚类”,不妨尝试一下LDA。

LDA最早是在文本挖掘主题发现(topic discovery)中作为一种图模型而使用。由 David BleiAndrew Ng, and Michael Jordan 在2002所提出。

[Blei, David M.; Ng, Andrew Y.; Jordan, Michael I (January2003). Lafferty, John. ed. "Latent Dirichlet allocation". Journal ofMachine Learning Research 3 (4–5): pp. 993–1022.doi:10.1162/jmlr.2003.3.4-5.993.]

本文假设你是一个了解LDA,并且打算把它用起来,并且像我一样暂时不打算用Mahout那个以MapReduce进行分布式实现的LDA算法(其实处理大数据量,还是试试Mahout的LDA吧),只是做原型实现的人。本文只说怎么把JGibbLDA在程序里跑起来,以及性能调优,不深入LDA原理。原理将在后续介绍。

二、Code

Code和更多信息请参考JGibbLDA的主页:http://jgibblda.sourceforge.net/#Griffiths04

我对JGibbLDA做了些许修改,包括:1,取消包依赖(原来是一个解析命令行的一个包),取消命令行执行。因为更多情况下不是执行完这一个程序就没事了。2,源代码对概率算到了小数点后N位然后保存,考虑文件规模(30万实验记录),概率保留小数点后3位,大大减小文件体积。3,数据结构上以及其他一些小的改进。4,我相信你一定会针对你的应用场景做修改的。

我的JGibbLDA修改版本可以点击这里进入网盘下载。【链接2013年04月28日已更新,百度网盘】

 

三、意义

JGibbLDA对于下列研究和应用领域都是比较有用的工具:

1,文本数据的潜语义分析、情感分析、主题聚类

2,文档聚类,文本摘要

3,协同过滤(用户聚类)

4,Content-basedImage Clustering, Object Recognition, and other applications of Computer Visionin general.

四、JGibbLDA的参数说明和设置

   //Specify whether we want to estimate modelfrom scratch

     boolean est= false;  /////是否开始训练模型

     //Specify whether we want to continue thelast estimation

 决定是否是基于先前已有的模型基础上继续用新数据训练模型

     boolean estc= false;

     //Specify whether we want to do inference

     boolean inf= true;    /////是否使用先前已经训练好的模型进行推断

     String dir= "";  //Specify directory  ////数据结果(模型数据)保存位置

     String dfile= "";  //Specify resource data filename    /////训练数据或原始数据文件名

     //Specify the model level to which you wantto applied. ///

     String modelName= "";  ////选择使用哪一个迭代的模型结果来进行推断

     int K= 100;  //Specify the number of topics  /////类簇数目,谨慎设置

     double alpha= 0.2;  //Specify alpha //////平滑系数

     double beta= 0.1;  //Specify beta

     int niters= 1000;  //Specify the number of iterations  /////迭代数目,谨慎设置

     //Specify the number of steps to save themodel since the last save.

     //The step (counted by the number ofGibbssampling iterations) 

     //at which the LDA model is saved to harddisk.

 //指定把迭代结果模型保存到硬盘上的迭代跨度,即每迭代10次保存一次。

     int savestep= 100;

     //Specify the number of most likely wordsto be printed for each topic

     int twords= 100;   /////对每一个类别(话题)选前多少个最大概率词项

     //Specify whether we include raw data in theinput

     public boolean withrawdata= false; 

     //Specify thewordmapfile

     publicString wordMapFileName= "wordmap.txt";  /////生成的副产品的文件名

五、输入数据格式

数据输入格式统一如下所述:

[M]
[document1]
[document2]
...
[documentM]

其中:

第一行为该数据文件有多少条记录数。然后每一行记录按行排列。

这里的“记录”的格式又规定为:

[documenti]= [wordi1] [wordi2] ... [wordiNi]

其中:[wordiNi]为[documenti]的各个词项,以空格分隔。

众所周知,对词项集合进行预处理,如去除停用词、主干提取等,对结果精度的提升有较大帮助。在基于所属宝贝属性序列的用户聚类中,预处理这一步可以省略。因为提取属性序列的主干是一件较为困难的事。

六、输出数据

建立模型阶段,会输出5类以如下规则命名的文件类型:

model-XXXXX.others:

model-XXXXX.phi

model-XXXXX.theta

model-XXXXX.tassign

model-XXXXX.twords

XXXXX都以数字组成。最后一次迭代所保存的这些数字将会换成“final”。

其中:

  •    .others为“信息文件”。文件保存的是跟该LDA模型有关的参数,比如alpha,beta,ntopiccs,ndocs,nwords,liter(the Gibbssampling iteration at which the model was saved)
  •    .phi文件为“词项-主题概率分布文件”。表现上是一个大矩阵M。其中,假设设类簇的数目topict为1000个,每一个主题需要列出top 100个词项wordw,则M以100为行,1000为列。即M每一行是词项,每一列是主题。M元素值则为条件概率p(wordw|topict),即每个词属于每个主题的概率。
  •     .theta文件为“文档-主题概率分布文件”。表现上也是一个大矩阵M。每行i代表训练数据的一个文档,每一列代表一个主题,元素值则为条件概率 p(topict|documentm),即该文档属于不同主题的概率。
  •     .tassign文件为“文档-词项-主题分布文件”。该文件与输入文件的格式一致,一行一个文档,只不过原来的输入文件中的词项换成了一个一个“词项ID:类别”。文件每一行代表训练数据的一条文档,原文档由一组词项组成,现每一行为原来的记录词项指派了其最大可能的所属主题。注意,该文档所属主题分布是在theta文件中,并未在tassign文件中指明。
  •   .twords文件为“词项-主题推断文件”。这个文件作为模型参数结果推断出了每一个主题下最优的topN个词项及其概率。请注意这里的主题数和N都是事先指定的。

这5个文件包括副产品wordmap.txt在有些应用场景下有时并不是完全需要的,是否生成可视情况而定。如果利用主题下topN词项来做基于距离的聚类,可能只需.twords即可。

七、推断新数据和关键代码

将产生如下文件,其组织和意义如前所述一致:

newdocs.dat.others
newdocs.dat.phi
newdocs.dat.tassign
newdocs.dat.theta
newdocs.dat.twords

关键代码:初始化一个模型:

LDACmdOptionldaOption = new LDACmdOption(); 
ldaOption.inf =true; 
ldaOption.dir ="C:\\LDAModelDir"; 
ldaOption.modelName= "newdocs"; 
ldaOption.niters =100;

推断新数据:

Inferencerinferencer = new Inferencer(); 
inferencer.init(option);

ldaOption.dfile= "input-lda-data.txt"; 
Model newModel =inferencer.inference();

数据也可以是词项的一组数组:

String[] test = {"politics bill clinton", "lawcourt", "football match"};
Model newModel =inferencer.inference(test);

=============================================================

关于代码的一点补充[2012年05月01日]:

去掉LDACmdOption,是因为嵌入自己的代码不需要命令行的。参数设置全在Option里。其中,

设置:

option.dir = "D:\\.......\\model";

option.dfile = "doc.dat";

把数据文件doc.dat放在dir里。结果也写在里边。

[document] :每一行就是一个文档,不需要文档名。结果跟训练数据集顺序一致。一旦模型生成,可以来一个文档做一个lda分类:

Option option = new Option();
option.dir = "D:\\.......\\model";
option.est = false;
option.estc = false;
option.inf = true;
option.modelName = "model-final";
Inferencer inferencer = new Inferencer();
inferencer.init(option);
while(line){
String [] newData = new String[1];
newData[0] = line;
Model newModel = inferencer.inference(newData);
for (int j = 0; j < newModel.theta[0].length; j++) {
sysout(newModel.theta[0][j]);
}
}

这里,看的是θ(theta),doc-topic关系。同样也可以看φ(phi),word-topic关系。都用文件保存,具体怎么用就看你用什么数据结构(比如HashMap)来存了。

JGibbLDA:java版本的LDA(Latent Dirichlet Allocation)实现、修改及使用的更多相关文章

  1. LDA(latent dirichlet allocation)

    1.LDA介绍 LDA假设生成一份文档的步骤如下: 模型表示: 单词w:词典的长度为v,则单词为长度为v的,只有一个分量是1,其他分量为0的向量         $(0,0,...,0,1,0,... ...

  2. LDA(Latent Dirichlet allocation)主题模型

    LDA是一种典型的词袋模型,即它认为一篇文档是由一组词构成的一个集合,词与词之间没有顺序以及先后的关系.一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成. 它是一种主题模型,它可以将文档 ...

  3. LDA(Latent Dirichlet Allocation)主题模型算法

    原文 LDA整体流程 先定义一些字母的含义: 文档集合D,topic集合T D中每个文档d看作一个单词序列< w1,w2,...,wn >,wi表示第i个单词,设d有n个单词.(LDA里面 ...

  4. Latent Dirichlet Allocation 文本分类主题模型

    文本提取特征常用的模型有:1.Bag-of-words:最原始的特征集,一个单词/分词就是一个特征.往往一个数据集就会有上万个特征:有一些简单的指标可以帮助筛选掉一些对分类没帮助的词语,例如去停词,计 ...

  5. LDA( Latent Dirichlet Allocation)主题模型 学习报告

    1     问题描述 LDA由Blei, David M..Ng, Andrew Y..Jordan于2003年提出,是一种主题模型,它可以将文档集中每篇文档的主题以概率分布的形式给出,从而通过分析一 ...

  6. 转:关于Latent Dirichlet Allocation及Hierarchical LDA模型的必读文章和相关代码

    关于Latent Dirichlet Allocation及Hierarchical LDA模型的必读文章和相关代码 转: http://andyliuxs.iteye.com/blog/105174 ...

  7. [综] Latent Dirichlet Allocation(LDA)主题模型算法

    多项分布 http://szjc.math168.com/book/ebookdetail.aspx?cateid=1&&sectionid=983 二项分布和多项分布 http:// ...

  8. LDA(Latent Dirichlet Allocation)

    转自:http://leyew.blog.51cto.com/5043877/860255#559183-tsina-1-46862-ed0973a0c870156ed15f06a6573c8bf0 ...

  9. LDA(latent dirichlet allocation)的应用

    http://www.52ml.net/1917.html 主题模型LDA(latent dirichlet allocation)的应用还是很广泛的,之前我自己在检索.图像分类.文本分类.用户评论的 ...

随机推荐

  1. 使用开源库MagicalRecord操作CoreData

      1. 将 MagicalRecord 文件夹拖入到工程文件中,引入 CoreData.frame 框架 2. 在 .pch 文件中引入头文件 CoreData+MagicalRecord.h 注: ...

  2. MVC中的Routing

    Routing ASP.NET Routing模块的责任是将传入的浏览器请求映射为特有的MVC controller actions. public static void RegisterRoute ...

  3. 【CSS3】---文本阴影text-shadow

    text-shadow可以用来设置文本的阴影效果. 语法: text-shadow: X-Offset Y-Offset blur color; X-Offset:表示阴影的水平偏移距离,其值为正值时 ...

  4. 自定义View(一)-ViewGroup实现优酷菜单

    自定义View的第一个学习案例 ViewGroup是自动以View中比较常用也比较简单的一种方式,通过组合现有的UI控件,绘制出一个全新的View 效果如下: 主类实现如下: package com. ...

  5. 二维码zxing源码分析(二)decode部分

           在上一篇博客中分析了zxing怎么打开摄像头,并且扫描结果,那么扫描之后的数据呢,是不是就要解析了呢,那我们看一下zxing怎么解析这个数据的.       上一篇博客地址ZXING源码 ...

  6. C# 序列化xml

    把一个类序列化成xml,显示在txtarea,然后在获取txtarea的值进行反序列化成类,因为一个字段的值是url形式的,url里面有这个符号:&,所以反序列化的时候报错了,查了好久才发现是 ...

  7. linux 用户打开进程数和文件数调整

    1 查看nproc(max user processes)命令 [root@vm-cdh4 ~]# ulimit -u 14866 2 修改nproc 临时修改, 重登录或重启后失效: [root@v ...

  8. 关于offsetWidth,clientWidth,与jquery的width()方法

    offsetWidth包括了边框的宽度, clientWidth只是元素的宽度, 当元素的"display"属性为“none”的时候,用offsetWidth(clientWidt ...

  9. 正确使用Android性能分析工具——TraceView

    http://blog.jobbole.com/78995/     首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他技术 - 导航条 - 首页 最新文章 IT 职场 前端 - Ja ...

  10. 【原创】ORA-04068: 已丢弃程序包 的当前状态研究

    不久前在市检的生产环境上有个存储过程执行报错,错误信息如下: ORA: 已丢弃程序包 的当前状态 ORA: package "ZHANGXSH.PR_TEST" 的当前状态失效 O ...