共计 1936 个字符,预计需要花费 5 分钟才能阅读完成。
原文链接:http://tecdat.cn/?p=5318
在这篇文章中,我将介绍用于 Latent Dirichlet Allocation(LDA)的 lda Python 包的装置和根本用法。我不会在这篇文章中介绍该办法的实践根底。将语料库(文档集)中的文档调配给基于单词矢量的潜在(暗藏)主题的次要思维是相当容易了解的,而这个例子(来自 lda)将有助于坚固咱们对 LDA 模型的了解。
装置 lda
简而言之,两种办法:
- 办法 1 :
我将以用户身份装置 lda
$ pip install --user lda
这也将装置所需的 pbr 包。当初我将 在一个设置中提供 lda,其中蕴含我之前装置的所有其余软件包。应用此办法,您应该在装置后失去相似的内容:
$ pip show lda
\-\-\-
Name: lda
Requires: pbr, numpy
lda 曾经装置好了。让咱们一起实现示例。
一个例子
查看路透社新闻公布的语料库。首先,咱们做一些导入:
import numpy as np
import lda
import lda.datasets
接下来,咱们导入用于示例的数据。这蕴含在 lda 包中,因而这一步很简略(我还输入出每个我的项目的数据类型和大小):
从下面咱们能够看到有 395 个新闻我的项目(文档)和一个大小为 4258 的词汇表。文档术语矩阵 X 具备 395 个词汇,表中是每个 4258 个词汇单词的呈现次数。文档。例如,X [0,3117]是单词 3117 在文档 0 中呈现的次数。咱们能够找出计数和与之对应的单词和文档题目:
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)
先前有几个参数是咱们保留默认值。据我所知,这里只应用对称先验。
主题字
从拟合模型中咱们能够看到主题词概率:
从输入的大小咱们能够看出,对于 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()