Ex_treme's blog.

主题检索模型铺垫————LDA基础

2018/03/30 Share

LDA算法(一)

  • LDA算法的定义
  • LDA算法应用范围
  • LDA算法的原理

LDA算法的定义

隐式狄利克雷分布(Latent Dirichlet Allocation,简称LDA)是一种概率主题模型
LDA是2003年提出的一种主题模型,它可以将文档集中每篇文档的主题以概率分布的形式给出。LDA通过分析一些文档可以从中抽取出它们的主题分布,根据主题分布进行主题聚类或文本聚类

LDA算法的特点

LDA是一种典型的词袋模型,即一篇文档是由一组词构成,词与词之间没有先后顺序的关系。一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。

LDA算法的作用

将文档集中每篇文档的主题以概率分布的形式给出。

LDA算法应用范围

  • 用户关联

对用户言论进行收集,得到他们的主题和概率后,就可以得到相同兴趣的用户了。

  • 文本分类

把具有相似主题的文章放在一起

  • 推荐系统

建立在用户关联上,用户A喜欢的可能用户B也喜欢。

  • 與情分析

比如收集某个时间段的微薄,计算主题就知道大家在讨论什么了。

LDA算法原理

文章是如何生成的?

  1. 随机从主题集中选择一个主题
  2. 随机从该主题中选择一个词
  3. 一直循环前面两个步骤,形成一篇文章

LDA就是将上面的过程反转了,它计算出选择某个主题的概率和选择该主题下某个词的概率,这两个概率分布计算清楚,就可以建立主题模型。
LDA的生成过程对应的观测变量(单词)和隐藏变量(主题)的联合分布

p(β1:k,θ1,D,z1:D,w1,D)=i=1Kp(β)d=1Dp(θd)(n=1Np(zd,nθd)p(wd,nβ1:K,zd,n))p(\beta _{1:k},\theta_{1,D},z_{1:D},w_{1,D})=\prod_{i=1}^K p(\beta)\prod_{d=1}^D p(\theta _d)(\prod_{n=1}^N p(z_{d,n}|\theta _d)p(w_{d,n}|\beta_{1:K},z_{d,n}))

LDA(二)

这一部分主要是对LDA主题模型的简单应用,即输入文档,给定K值(预定的主题数目),输出主题分布,下面给出主要的处理流程。

  1. 给定多篇篇文档(为了简便,以一篇文档的换行符划分,模拟多个文档),拟做训练使用。
  2. 装载停用词(如果没有停词,语料再大也没用)
  3. 对所有文档进行分词和去停词处理
  4. 以处理后的文档为一个单位存储到一个list中
  5. 训练LDA主题模型
  6. 输出主题分布
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import gensim
import re
import useHanLP as HanLP
import docx2txt

doc_path = '/home/pzs741/PycharmProjects/LDA/心肌梗塞须知.docx'
#将每一句话当成一篇文章处理
doc_list = docx2txt.process(doc_path).split('\n')

texts = []

stop_words = []
with open('stop_words.txt', encoding='utf-8') as f:
line = f.readline()
while line:
stop_words.append(line[:-1])
line = f.readline()
stop_words = set(stop_words)
print('停用词读取完毕,共{n}个单词'.format(n=len(stop_words)))

for doc in doc_list:
text = str(HanLP.GetFenword(doc)).split(',')
text_list = []
for t in text:
if re.findall('[\u4e00-\u9fa5]',t):
t = t.replace(' ', '').replace('[','').replace(']','')
if t not in stop_words:
text_list.append(t)
if text_list:
texts.append(text_list)
# 为不重复的单词设置一个ID,并记录出现次数
dictionary = gensim.corpora.Dictionary(texts)
#文档词频矩阵
corpus = [dictionary.doc2bow(text) for text in texts]

ldamodel = gensim.models.ldamodel.LdaModel(corpus,num_topics=2,id2word=dictionary,passes=20)

print(ldamodel.print_topics(num_topics=2,num_words=3))

由于采用gemsim库实现,编程相当简单,加之一篇文章试验,仅作演示,后期再对主题检索模型做更深入的探讨。

CATALOG
  1. 1. LDA算法(一)
    1. 1.1. LDA算法的定义
    2. 1.2. LDA算法的特点
    3. 1.3. LDA算法的作用
    4. 1.4. LDA算法应用范围
    5. 1.5. LDA算法原理
  2. 2. LDA(二)