在这篇文章中,我将介绍用于Latent Dirichlet Allocation(LDA)的lda Python包的安装和基本用法。我不会在这篇文章中介绍该方法的理论基础。将语料库(文档集)中的文档分配给基于单词矢量的潜在(隐藏)主题的主要思想是至关容易理解的,而这个例子(来自lda)将有助于巩固咱们对LDA模型的理解。dom
简而言之,两种方法:测试
我将以用户身份安装ldaui
$ pip install --user lda
这也将安装所需的pbr包。如今我将 在一个设置中提供lda,其中包含我以前安装的全部其余软件包。使用此方法,您应该在安装后获得相似的内容:spa
$ pip show lda \-\-\- Name: lda Requires: pbr, numpy
lda已经安装好了。让咱们一块儿完成示例。code
查看路透社新闻发布的语料库。首先,咱们作一些导入:orm
import numpy as np import lda import lda.datasets
接下来,咱们导入用于示例的数据。这包含在 lda包中,所以这一步很简单(我还输出出每一个项目的数据类型和大小):ip
从上面咱们能够看到有395个新闻项目(文档)和一个大小为4258的词汇表。文档术语矩阵X具备395个词汇,表中是每一个4258个词汇单词的出现次数。文档。例如,X [0,3117]是单词3117在文档0中出现的次数。咱们能够找出计数和与之对应的单词和文档标题:rem
doc_id = 0 word_id = 3117 print("doc id: {} word id: {}".format(doc\_id, word\_id)) print("-- count: {}".format(X\[doc\_id, word\_id\])) print("-- word : {}".format(vocab\[word_id\])) print("-- doc : {}".format(titles\[doc_id\]))
接下来,咱们初始化并拟合LDA模型。咱们必须选择主题的数量(其余方法也能够尝试查找主题的数量,但对于LDA,咱们必须假设一个数字)。继续咱们选择的示例:文档
model = lda.LDA(n\_topics=20, n\_iter=500, random_state=1)
先前有几个参数是咱们保留默认值。据我所知,这里只使用对称先验 。get
从拟合模型中咱们能够看到主题词几率:
从输出的大小咱们能够看出,对于20个主题中的每个,咱们在词汇表中分配了4258个单词。对于每一个主题,应该对单词的几率进行标准化。咱们来看看前5:
for n in range(5): sum\_pr = sum(topic\_word\[n,:\]) print("topic: {} sum: {}".format(n, sum_pr))
咱们还能够得到每一个主题的前5个单词(按几率):
* 主题 6 - 德国 战争 政治 政府 * 主题 7 - 哈里曼 克林顿 丘吉尔 大使 * 主题 8 - 俄罗斯 总统 克里姆林宫 * 主题 9 - 王子 女王 鲍尔斯 教会 王 * 主题 10 - 辛普森 亿 年前 南 - 红衣主教 癌症 教会 生活 * 主题 17 - 丧葬 教会 城市 死亡 * 主题 18 - 博物馆 文化 城市 文化 * 主题 19 - 艺术 展 世纪 城市 之旅
这让咱们了解了20个主题多是什么含义。
咱们从模型中得到文档主题几率:
doc\_topic = model.doc\_topic_
查看输出的大小,咱们能够看到395个文档中的每一个文档都有20个主题的分布。这些应该针对每一个文档进行标准化,让咱们测试前5个:
for n in range document: 0 sum: 1.0 document: 1 sum:
文件: 0 总和: 1.0
文件: 1 总和: 1.0
文件: 2 总和: 1.0
文件: 3 总和: 1.0
文件: 4 总和: 1.0
咱们能够对最可能的主题进行抽样:
for n in range(10): topic\_most\_pr = doc_topic\[n\].argmax
让咱们看看主题词分布是什么样的。每一个主题应该有一个独特的单词分布。在下面的词干图中,每一个词干的高度反映了主题中单词的几率:
plt.tight_layout() plt.show()
最后,让咱们看一下几个文档的主题分布。这些分布给出了每一个文档的20个主题中每一个主题的几率。
plt.tight_layout() plt.show()