基于JGibbLDA lda topic主题模型
最近在做基于LDA(Latent Dirichlet Allocation)的文本分类处理,开始学习和接触了LDA,因为代码采用的是Java,所以我选择的LDA开源工具是JGibbLDA,这个是LDA的Java版本实现,下载地址为:http://jgibblda.sourceforge.net/ ,当前最新版本为v1.0。同时对应的C++版本为GibbsLDA,下载地址为:http://gibbslda.sourceforge.net/。
感谢Phantom(byr ID)在学习和使用过程中对我的指导和帮助。
首先下载并解压,解压后文件目录如下所示:
bin存放的是编译后的class文件,lib中放args4j-2.0.6.jar,models中存放已经生成好的主题模型示例,src存放那个源文件。我在使用时把jar文件放于工程中,另外直接把src下的jgibblda包复制于项目中。
1.输入文件格式
输入文件的格式形如下图所示:
其中第一行表述训练语料文档的数目,之后每一行是一个文档,每一行的内容是文档中的词语。
2.输出文件
输出文件主要有<model_name>.others、<model_name>.phi、<model_name>.theta、<model_name>.tassign、<model_name>.twords,另外还有一个wordmap.txt文件。其中<model_name>根据采样迭代次数来指定,如model-00800,最后一次采样名称命名为model-final。
.others文件存储LDA模型参数,如alpha、beta等。
.phi文件存储词语-主题分布,每一行是一个主题,列内容为词语。
.theta文件主题文档分布,每一行是一个文档,列内容是主题概率。
.tassign文件是训练预料中单词的主题指定(归属),每一行是一个语料文档。
3.使用方式
JGibbLDA可以通过命令行或者代码调用运行。
3.1.命令行调用简介
初次使用训练模型
- $ java [-mx512M] -cp bin:lib/args4j-2.0.6.jar jgibblda.LDA -est [-alpha <double>] [-beta <double>] [-ntopics <int>] [-niters <int>] [-savestep <int>] [-twords <int>] –dir <string> -dfile <string>
-est 从训练语料中评估出LDA模型
-alpha LDA模型中的alpha数值,默认为50/K(K是主题数目)
-beta LDA模型中的beta数值,默认是0.1
-ntopics 主题数目,默认值是100
-niters GIbbs采样的迭代数目,默认值为2000
-savestep 指定开始保存LDA模型的迭代次数
-dir 训练语料目录
-dfile 训练语料文件名称
此处需要指出的是dfile最好写输入语料文件名称,而dir指定语料文件所在的目录,训练过程中生成的模型文件会默认存放在dir下面。例如语料的绝对路径为/usr/Java/models/newDoc.dat,可以设置为dir=/usr/Java/models,而dfile=newDoc.dat,这样训练过程中的模型文件会默认存放在/usr/Java/models下面。
在原有模型上继续迭代
- $ java [-mx512M]-cp bin:lib/args4j-2.0.6.jar jgibblda.LDA -estc -dir <string> -model <string> [-niters <int>] [-savestep <int>] [-twords <int>]
具体参数的含义可以在官网上找到,这里不一一介绍了。
根据现有LDA模型,预测新语料
- $ java [-mx512M] -cp bin:lib/args4j-2.0.6.jar jgibblda.LDA -inf -dir <string> -model <string> [-niters <int>] [-twords <int>] -dfile <string>
3.2代码调用
初次训练,生成模型
- LDACmdOption ldaOption = new LDACmdOption();
- ldaOption.est = true;
- ldaOption.estc = false;
- ldaOption.modelName = "model-final";
- ldaOption.dfile = "newDoc.dat";
- ldaOption.alpha = 0.5;
- ldaOption.beta = 0.1;
- ldaOption.K = 100;
- ldaOption.niters = 1000;
- topicNum = ldaOption.K;
- Estimator estimator = new Estimator();
- estimator.init(ldaOption);
- estimator.estimate();
LDACmdOption类主要用于设置LDA所需的参数,Estimator用于评估生成LDA模型。
根据LDA模型,推断新语料的LDA主题信息。
- LDACmdOption ldaOption = new LDACmdOption();
- ldaOption.inf = true;
- ldaOption.estc = false;
- ldaOption.dir = "LDAResult";
- ldaOption.modelName = "model-final";
- ldaOption.dfile = "predictionDoc.dat";
- Inferencer inferencer = new Inferencer();
- inferencer.init(ldaOption);
- Model newModel = inferencer.inference();
测试语料的LDA模型文件将生成在LDAResult文件夹中。