个人博客地址:http://xurui.club/
最近在做一个动因分析的项目,自然想到了主题模型LDA。这次先把模型流程说下,原理后面再讲。
lda实现有很多开源库,这里用的是gensim.
大概说下文本的样子,LDA是无监督模型,也就是说不需要标签,只要传入文本就好。LDA要学习文档-主题分布和主题-词分布,所以我们把一个人的数据join在一起作为一条文档。对文档进行分词,使用的jieba分词工具包。注意,这里要做去停用词处理,包括标点和一些没用的词,如“呵呵”,“哈哈”。做项目时,第一版没有去无用词,最后提出的主题都是“你”“我”“他”“你好”这样的东西,去掉之后可以较好提高结果质量。
即将所有文档数表示成m*n的矩阵D,m表示有m篇文档,n表示这篇文档有n个词,n不定长。
用gensim.corpora.Dictionary包
这个包讲下吧
from gensim.corpora import Dictionary text = [['我', '想吃', '大龙虾', '和', '烤猪蹄']] dictionary = Dictionary(text) print((dictionary)) doc = dictionary.doc2bow(['我', '想吃', '大龙虾', '和', '我','你','烤猪蹄']) print(doc) #####output##### Dictionary(5 unique tokens: ['我', '大龙虾', '想吃', '和', '烤猪蹄']) [(0, 1), (1, 1), (2, 2), (3, 1), (4, 1)]
可以看出,我们把我想吃大龙虾和烤猪蹄编成字典,共五个词,这里输出结果里看不出是个字典,其实是有下标的,0对应我,1对应大龙虾,…4对应烤猪蹄。
然后我们在下一步将文本变成词袋,这里用的文本是[‘我’, ‘想吃’, ‘大龙虾’, ‘和’, ‘我’,’你’,’烤猪蹄’],注意文本格式也是词为元素的列表。这句话是我自己构造的,只是为了说两点,语法请忽略。第一点:“我”这个词出现了两次,所以下标为2的地方,值为2;第二点,“你”这个词出现了1次,可是在词典中没有,所有直接被忽略。
这样就可以用字典,将文本表示成词袋模型,词袋模型不懂的,见我另一篇文章,自然语言处理NLP的词如何表示。当我们做完了LDA模型后,对于新的文本,我们想看下它所在的主题分布,就要使用该字典再进行词袋编码,也就是说这个字典,我们以后也会用到,所以,我们在这里把词典保存起来。
保存词典可以用pickle,很好用。不懂的见我另一篇文章,神奇的pickle。
这里用的是gensim.models.ldamodel包 ldamodel = LdaModel(text, num_topics=10, id2word=dictionary, passes=20)
使用这句话就可以直接训练LDA模型了,讲一下参数吧。
text:文本,已经表示成词袋了。
num_topics: 提取的主题数
id2word:词典
passes:类似于在机器学习中常见的epoch,也就是训练了多少轮。
然后我们得到了训练好的ldamodel.用这个模型可以做哪些事情呢?
可以输出这个模型的各个主题下的主题词
这里随便找了些数据,效果不是太明显,这里主要讲处理流程,不要被这结果干扰心情,不过工业应用中很多时候,实际结果和你理想的结果有很大差距。用一些正常的数据,是可以看出一些信息的。上次用汽车之家的评论数据做lda,主题信息就比较明显,有关于油耗的,有关于买车的等等。
也可以对新文本,找出其所在的主题分布。
def to_lda_vec(model, dictionary, text_list=None): ''' :param model: lda model :param dictionary: Dictionary for toBow :param text_list: texts :return: texts about one topic ''' lda_list = [] for texts in text_list: doc_bow = dictionary.doc2bow(texts) doc_lda = model[doc_bow] lda_list.append(doc_lda) return lda_list
这个方法中的参数加了注释,这里可以看到有个参数是dictionary,这里就是我们前面训练lda时用的词典,前面保存的词典派上用场了。最后输出的lda_list是一个列表,列表中元素为每句话的doc_lda,doc_lda是这样子的[(5,0.342345),(6,0.1111)…],也就是个list,无素为元组,元组包括两个值,第一个值表示主题id,第二个值表示属于该主题的概率。
也可以用于新文本数据的向量化,即将新的文本映射成主题向量,然后可以做分类,做聚类,做推荐。