python LDA (Latent Dirichlet Allocation)实例讲解

LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。以上,摘自百度百科。
下面用一个例子来讲解实现,贴代码,注释相对详细,不需要其他地方多说了,不是 原理性的东西:

# test the lda

import numpy as np
import lda
import lda.datasets

titles = lda.datasets.load_reuters_titles()#原始的文本资料,长度是395
vocab = lda.datasets.load_reuters_vocab()#字典,tuple类型,长度是4258.
x = lda.datasets.load_reuters()#加载的one-hot形式的文本资料,是一个(395,4258)的矩阵

model = lda.LDA(n_topics=20, n_iter=1500, random_state=1)#设置topic的数量是20,定义模型

model.fit(x)#训练模型

topic_word = model.topic_word_ #topic到word的模型,(20,4258)的权重矩阵

n_top_words = 8

for i, topic_dist in enumerate(topic_word):
  topic_words = np.array(vocab)[np.argsort(topic_dist)][:-(n_top_words+1):-1]#找到topic对应的前8个最重要的单词
  print('Topic {}: {}'.format(i, ' '.join(topic_words)))

doc_topic = model.doc_topic_# doc到topic的权重矩阵(395,20)
for i in range(10):
  print("{} (top topic: {})".format(titles[i], doc_topic[i].argmax()))#输出每个文本对应的topic

以上是自带的例子,在具体的应用中,一般是只有原始的文本资料,也就是titiles,需要自己生成字典,然后根据字典将titles表示为one-hot向量,也就是x的形式,然后定义一个模型,训练模型,最后就能学习到两个权重矩阵。

以上,都是不分训练测试的,如果分训练测试的话,训练完毕之后可以使用model.transform(x_test)来获得测试的doc_topic的结果:

>>> X = lda.datasets.load_reuters()
>>> titles = lda.datasets.load_reuters_titles()
>>> X_train = X[10:]
>>> X_test = X[:10]
>>> titles_test = titles[:10]
>>> model = lda.LDA(n_topics=20, n_iter=1500, random_state=1)
>>> model.fit(X_train)
>>> doc_topic_test = model.transform(X_test)
>>> for title, topics in zip(titles_test, doc_topic_test):
...     print("{} (top topic: {})".format(title, topics.argmax()))

你可能感兴趣的:(python,NLP)