之前看LDA,一直没搞懂到底作用是什么,公式推导了一大堆,dirichlet分布求了一堆倒数,却没有真正理解精髓在哪里。
最近手上遇到了一个文本分类的问题,采用普通的VSM模型的时候,运行的太慢,后来查找改进策略的时候,想起了LDA,因此把LDA重新拉回我的视线,也终于弄懂了到底是做什么的。
LDA本质是一种降维
为什么这么说,因为在我的文本分类问题中,文本共有290w个,根据词项得到的维度为90w个,这样一个巨大的矩阵【尤其是维度过多】扔到分类器里,肯定会有各种各样的问题【比如训练过慢,过拟合,等等】
因此,LDA的出现,能让VSM模型的列,由词项变成“主题”。这也就是主题模型的来历吧。
文档——主题矩阵
先看一个简单的:LSI 隐语意索引。基本方法是SVD矩阵分解
现在我们开始分析这两个矩阵各自长啥样:
文档——主题矩阵求出来之后,是这样的
在这里,我定义了200个主题,现只截图了前25个主题。
需要说明的是,这个是第一个文档的主题分布。我们可以看到,第一个样本的第6,第7个主题明显得分更高一些。至于主题都是“什么主题”,需要人自己通过“主题——词”矩阵观看,并给出
【其实,并不需要定义每个主题是什么,其实只是一列,并放在分类器里用就可以了。】
其实,我们降维得到的这个矩阵,就可以放在分类器里面用了。
LDA得到的主题表征:
LDA神奇之处在于,如果我定义了200个主题,那么我得到corpus_lda的时候,比如要看第二个样本的主题,它不会像LSI一样全部显示出来,而是选择性地显示几个大的。
主题——词矩阵
同样地,如果想看每个主题都有哪些词,也就是主题——词矩阵,那么可以看到:
总结
最后,【在文本分类中】其实我们要做的,就是从文本——词项矩阵变为文本——主题【维度为200】矩阵,通过降维的方式,对文本分类。其中的值由词项的TF-IDF值变为了主题的权重得分值。
附上整个lda的过程的步骤和代码:
第一步,把待转换成词袋的词变成需要的类型
通过学习value_list得到我们的字典。【注意:value_list的格式】
第二步:把所有文档根据字典转换成VSM
现在得到的corpus利用了字典,把每一个文档变成了一个一个tuple组合的形式,key为ID,value为出现的频数
第三步,把频数变为tfidf值【用corpus训练】
此时,可以转换一个文档,方法:先用dictionary的dic2bow方法变成词频,再把词频变为tfidf频率
第四步:用训练好的tfidf把测试文档变为tfidf格式
第五步:把规整后的tfidf矩阵放进LSI,LDA模型中
所以说实际上没有做舆情的话,我是没有用到主题——词项矩阵的。这个充其量是让我理解“这个主题是讲的什么东西”。
另外,多说一句。短文本【标签,名称】并不适合做LDA,因为一个文档里的标签太少了,LDA并不能发挥其真正效果