在这篇文章中,我将介绍用于Latent Dirichlet Allocation(LDA)的lda Python包的安装和基本用法。
我不会在这篇文章中介绍该方法的理论基础。
将语料库(文档集)中的文档分配给基于单词矢量的潜在(隐藏)主题的主要思想是相当容易理解的,而这个例子(来自lda)将有助于巩固我们对LDA模型的理解。
LDA(Latent Dirichlet Allocation)中文翻译为:潜在狄利克雷分布。LDA主题模型是一种文档生成模型,是一种非监督机器学习技术。它认为一篇文档是有多个主题的,而每个主题又对应着不同的词。一篇文档的构造过程,首先是以一定的概率选择某个主题,然后再在这个主题下以一定的概率选出某一个词,这样就生成了这篇文档的第一个词。不断重复这个过程,就生成了整篇文章(当然这里假定词与词之间是没有顺序的,即所有词无序的堆放在一个大袋子中,称之为词袋,这种方式可以使算法相对简化一些)。
LDA的使用是上述文档生成过程的逆过程,即根据一篇得到的文档,去寻找出这篇文档的主题,以及这些主题所对应的词。LDA是NLP领域一个非常重要的非监督算法。
白话解释:比如document1的内容为:[自从乔布斯去世之后,iPhone再难以产生革命性的创新了]
通过上述的方法,document1将对应两个主题topic1,topic2,进而,主题topic1会对应一些词:[苹果创始人][苹果手机],主题topic2会对应一些词:[重大革新][技术突破]。于是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()
可下载资源
关于作者
Kaizong Ye是拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。
本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。
非常感谢您阅读本文,如需帮助请联系我们!