LDA程序使用的是JGibbLDA
读theta文件,构造theta二维矩阵。
读phi文件,构造phi二维矩阵。
读tassign文件,得到每篇文本的词数Nd,继而得到测试集的总词数Nsum;并根据tassign文件构造每篇文本所有词组成的词表。
编程实现,根据tassign文件构造测试集每篇文本中所有词组成的词表,根据该词表(Map形式,存储的是每篇文本所有出现的词的词id(词不排重)),得到每一篇文本的词id(index),从而根据此前构造好的theta二维矩阵、phi二维矩阵,分别得到double dt=theta[m][k]、double tw=phi[k][index]。则,一篇文本中第i个词wi的概率为pwi。 一篇文本的所有词的概率为pwd。构造困惑度的分子,即所有文本的词的概率的 log值pwM 。
因此,可以得到LDA模型的困惑度 perp = Math.exp(-pwM / Nsum)。
但是,依据上述编程思想得到的困惑度 perp值,随主题数的增加而增大(主题数设置的是20、40、60、80、100、120),并没有随主题数的增加产生抛物线或者减小。不知道是哪里出了错,望大神指教。
//计算困惑度
public double computePerplexity() throws IOException{
testFileLDAtassignpath="."+File.separator+"testFile"+File.separator+"LDA的文件"+File.separator+"测试文本集LDA格式.txt.model-final.tassign";
testFileLDAthetapath="."+File.separator+"testFile"+File.separator+"LDA的文件"+File.separator+"测试文本集LDA格式.txt.model-final.theta";
testFileLDAphipath="."+File.separator+"testFile"+File.separator+"LDA的文件"+File.separator+"测试文本集LDA格式.txt.model-