关于主题模型这一块是比较特殊的,这期间也给我带来了一些困惑,因为其中的一些算法和我们在机器学习中使用的算法还是很不同的,在这篇文章里,我想简单介绍下LSI(潜在语义牵引)
这个模型的作用是通过海量的文献找出词汇的关系.就跟警察抓嫌疑人一样,犯罪事件在这个区域里出现的多了,这片区域越有可能成为犯罪的重点辖区. 词汇也是这样,当一些词汇大量出现在一篇文章里时,我们可以认为这篇文章会倾向去成为某一种类型,而这些词之间也存在着语义相关性.
一:主题模型算法
我们使用的主题模型算法跟聚类差不多,但是细究起来还是有一些差距:
1:聚类模型计算的是数据样本之间的欧拉距离等.
2:主题模型是通过对文本隐含主题的建模,词特性聚类很难找出主题相关度.
找出主题的方法有一些是基于统计的方法,还有一些不是基于统计的方法,比如LSI
二:潜在语义索引概述
LSI是基于奇异值分解(SVD)的方法来得到文本的主题的。关于其中的数学知识,我就不再赘述了,这里说一说她的降维过程:
1:把文档库表示为
的词-文档矩阵,词作为行,文档作为列.(m表示词向量在不同文档中出现的次数,n表示不同文档的个数),A表示为A = [α ij ],在此矩阵中,α ij为非负值 , 表示第 i 个词在第j 个文档中出现的频度。显然,A是稀疏矩阵.
2:利用SVD求A的正交因子的降秩矩阵,这其实就是关键所在,降维,SVD在我看来,最主要的作用在这里是将词和文档映射到一个语义空间,然后把文档和词表示为因子形式,这样既可以保留主要信息,又可以减少运算复杂度.
这当中K的取值挺关键,我看前人给出的经验是,K过小,则丢失信息就越多;K过大,信息虽然多,但可能有冗余且计算消耗大。K的选择也是值得研究的,不过一般取值为100-300,不绝对。
三:LSI的应用性
LSI在我看来最关键的还是设计K的取值,如果K取的很合适,可以把联系较为紧密的词语提出来,其实就是用降维做相关性计算.但是LSI现在并不是那么流行,也是有一些原因:
1:太慢
SVD计算太费劲了,特别是我们几十万的文本数据一块来,这样高维矩阵SVD分解基本是机器吃不消,然后现在用的TF-IDF只需要通过两个整数相乘就能计算出不同单词的重要性,岂不是更有效?尽管在某些程度上LSI有一些优势,但是在工业界似乎没多少人用.
2:K值选取
K值的选取太过于影响计算结果,直接使用LSI做单词相关度计算的并不多,一方面在于现在有一些灰常好用的同义词词典,另外相对无监督的学习大家还是更信任有监督的学习(分类)得到的结果。
3:LSI不能聚类
因为LSI 得到的不是一个概率模型,缺乏统计基础,结果难以直观的解释。所以聚类不行,但是该算法后续额变种包括LDA聚类是很有效的,因为LSI找的是特征子空间,聚类找的则是实例分组,
LSI 虽然能得到看起来貌似是聚类的结果,但其意义不见得是聚类所想得到的。
四:实验
代码整理ing~
后续附加
五:总结
对于LSI,我们在一些规模较小的问题上,使用LSI是很划算的,但是你想实打实的做主题模型,因为数据量太多了,还是老老实实用LDA这样的模型吧.