最近在做基於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文件夾中。