LDA的相关介绍可以看这二篇博客
LDA浅析:http://blog.csdn.net/huagong_adu/article/details/7937616
http://www.52nlp.cn/lda-math-mcmc-%E5%92%8C-gibbs-sampling1
这里记录一下使用GibbsLDA++的介绍以及JGibbLDA的使用过程:
GibbsLDA++主页地址: http://gibbslda.sourceforge.net/
GibbsLDA ++是使用Gibbs采样技术进行参数估计和推理的潜在Dirichlet分配(LDA)的C / C ++实现。它非常快,旨在分析大型数据集的隐藏/潜在主题结构,包括大量文本/ Web文档。 LDA首先由David Blei等引入。在C(使用变分方法),Java和Matlab中已经有了这个模型的几个实现。
GibbsLDA ++可用于以下潜在应用领域:
1.信息检索和搜索(分析大型文本收集的语义/潜在主题/概念结构,实现更智能的信息搜索)。
2.文件分类/集群,文档摘要和文本/网络挖掘社区。
3.基于内容的图像聚类,对象识别和计算机视觉的其他应用。
4.生物数据中的其他潜在应用。
GibbsLDA ++代码下载页:https://sourceforge.net/projects/gibbslda/
JGibbLDA代码下载页:https://sourceforge.net/projects/jgibblda/
GibbsLDA ++ 是LDA的C/C++版本:
环境要求:linux
解压并且编译:
$ gunzipGibbsLDA++.tar.gz
$ tar -xfGibbsLDA++.tar
$ make clean
$ make all
在编译GibbsLDA ++之后,我们在GibbsLDA ++ / src目录中有一个可执行文件“lda”
GibbsLDA++使用方法:
在linux编译好之后有一个lda的可执行文件,可以在linux环境下用命令行的形式执行。
1. 从零开始的参数估计
$ lda -est [-alpha <double>] [-beta <double>][-ntopics <int>] [-niters <int>] [-savestep <int>] [-twords<int>] -dfile <string>
参数说明([]里面的参数是可以选择的):
-est:从头估计LDA模型
-alpha <double>:LDA的alpha的超参数的值。 alpha的默认值为50 / K(K是主题数)。有关选择α和β值的详细讨论,请参阅[Griffiths04]。
-beta <double>:beta的值,也是LDA的超参数。其默认值为0.1
-ntopics <int>:主题数量。其默认值为100.这取决于输入数据集。请参阅[Griffiths04]和[Blei03]更加仔细地讨论选择主题数量。
-niters <int>:吉布斯抽样迭代次数。默认值为2000。
-savestep <int>:将LDA模型保存到硬盘的步骤(按Gibbs采样迭代次数计算)。默认值为200。也就是说每迭代200次就保存一次模型。
-twords <int>:每个主题最有可能的单词。默认值为零。如果将此参数设置为大于零的值,例如20,则GibbsLDA ++将根据上述参数savestep将每个主题的前20个最有可能单词列表打印出来,以便每次将模型保存到硬盘时。
-dfile <string>:输入训练数据文件。
2. 先验估计模型的参数估计
$ lda -estc -dir <string> -model<string> [-niters <int>] [-savestep <int>] [-twords<int>
参数说明([]里面的参数是可以选择的):
-estc:从以前估计的模型继续估计模型。
-dir <string>:目录包含以前估计的模型
-model <string>:先前估计的模型的名称。
-niters <int>:Gibbs采样迭代次数以继续估计。 默认值为2000。
-savestep <int>:将LDA模型保存到硬盘的步骤(按Gibbs采样迭代次数计算)。 默认值为200。
-twords <int>:每个主题最有可能的字数。 默认值为零。 如果将此参数设置为大于零的值,例如20,则GibbsLDA ++将根据上述参数savestep将每个主题的前20个最有可能单词列表打印出来,以便每次将模型保存到硬盘时。
3. 推测以前看不见(新)的数据
$ lda -inf -dir <string> -model<string> [-niters <int>] [-twords <int>] -dfile<string>
参数说明([]里面的参数是可以选择的):
-inf:使用先前估计的LDA模型推断以前看不到的(新)数据。
-dir <string>:目录包含以前估计的模型
-model <string>:先前估计的模型的名称。
-niters <int>:用于推断的吉布斯抽样迭代次数。 默认值为20。
-twords <int>:新数据的每个主题的最有可能的字数。 默认值为零。 如果将此参数设置为大于零的值(例如20),则GibbsLDA ++将在推断后打印每个主题前20个最有可能的单词列表。
-dfile <string>:包含新数据的文件。
输入数据的格式:用于训练/估计模型和新数据的数据(即,以前看不见的数据)都是如下相同的格式:
[M]
[document1]
[document2]
...
[documentM]
其中第一行是文件的总数[M]。之后的每一行都是一个文本。 [documenti]是数据集的第i个文档,由Ni单词/术语列表组成。
[documenti] = [wordi1] [wordi2] ...[wordiNi]
其中所有[wordij](i = 1..M,j = 1..Ni)是文本字符串(词),它们由空白字符分隔。
输出:GibbsLDA ++的吉布斯抽样估计的输出包括以下文件:
<model_name>.others
<model_name>.phi
<model_name>.theta
<model_name>.tassign
<model_name>.twords
说明:
<model_name>:是与保存在硬盘上的时间步长对应的LDA模型的名称。例如,模型的名称保存在Gibbs采样迭代中,第400个将是模型00400。类似地,模型在第1200次迭代中被保存为模型01200。最后一个Gibbs采样迭代的模型名称是最终模型。
<model_name> .others:此文件包含LDA模型的一些参数,如:
alpha=?
beta=?
ntopics=? # 即主题数量
ndocs=? # 即文件数量
nwords=? # 即词汇大小
liter=? # 即保存模型的Gibbs采样迭代
<model_name> .phi:此文件包含单词主题分布,即p(wordw | topict)。每行都是一个主题,每一列都是词汇中的一个单词。
<model_name> .theta:此文件包含主题文档分发,即p(topict | documentm)。每行都是一个文档,每一列是一个主题。
<model_name> .tassign:此文件包含训练数据中词的主题分配。 每一行都是一个文件,它由一个<wordij>:<topic of wordij>的列表组成
<model_file> .twords:此文件包含每个主题的词汇最有可能的词。 在命令行中指定了词。
GibbsLDA ++还保存了一个名为wordmap.txt的文件,其中包含单词和单词的ID(整数)之间的映射。这是因为GibbsLDA ++直接使用单词/术语的整数ID而不是文本字符串。
Gibbs采样推理的输出,用于以前看不见的数据:
GibbsLDA ++推理的输出与估计过程的输出几乎相同,只是这些文件的内容是新数据。 <model_name>与输入(新)数据的文件名完全相同。
GibbsLDA ++ 例子:
例如,我们要估计存储在名为models / casestudy / trndocs.dat的文件中的文档集合的LDA模型,然后使用该模型对存储在文件模型/ casestudy / newdocs.dat中的新数据进行推理。
我们想估计100个主题,alpha = 0.5和beta = 0.1。我们要执行1000次Gibbs采样迭代,每100次迭代保存一个模型,每次保存一个模型时,打印每个主题20个最有可能的单词列表。假设我们现在在GibbsLDA ++的主目录下,我们将执行以下命令来从头估计LDA模型,命令如下:
$ src/lda -est -alpha 0.5 -beta 0.1 -ntopics 100-niters 1000 -savestep 100 -twords 20 -dfile models/casestudy/trndocs.dat
现在看看models/casestudy目录,我们可以看到输出:
现在,我们要继续从先前估计的模型型号01000(model-01000) 执行800次吉布斯抽样迭代,其中savestep = 100,twords = 30,我们执行以下命令:
$ src/lda -estc -dir models/casestudy/-model model-01000 -niters 800 -savestep 100 -twords 30
看casestudy目录的输出。
现在,如果我们要对新数据newdocs.dat(注意,新数据文件存储在LDA模型的同一目录中)使用之前估计的LDA模型之一进行推理(30吉布斯抽样迭代),例如 model-01800,我们执行以下命令:
$ src/lda -inf -dir models/casestudy/ -modelmodel-01800 -niters 30 -twords 20 -dfile newdocs.dat
现在,看casestudy目录,我们可以看到推论的输出:
newdocs.dat.others
newdocs.dat.phi
newdocs.dat.tassign
newdocs.dat.theta
newdocs.dat.twords