文本主题提取--LDA

论文下载链接   提取码:nm62

  • 概念:LDA模型是一个对类似文本语料的离散型数据集合的生成概率模型 。LDA是一个三层的贝叶斯层级模型,集合的每一条数据在一系列主题的基础上作为一个有限的混合被建立模型。每个主题是一系列主题概率混合构建,在文章的上下文中,主题概率模型对文档提供了一个清楚的呈述。因此提出了基于变化的有效近似推断技术和基于先验的贝叶斯参数估计的EM算法。

  • 作用: 此模型可以做文档分类、协同过滤、unigram模型的比较、和LSI模型概率。

  • 目的:从离散的数据中找到一个能够表示本质关系的有用的简短描述。

  • 过程:将语料库中的每个文件缩减为一个实数向量,每个实数表示计数的比率。 在流行的tf-idf中,选择单词或术语的基本词汇,对于语料库中的每个文档,对每个单词的出现次数进行计数。经过适当的归一化后,将此术语频率计数与反向文档频率计数进行比较 ,代表着语料库中每个单词出现的次数。最终结果是一个文档的术语矩阵X,其列包含语料库中每个文档的tf-idf值。因此tf-idf方案将任意长度的文档减少为固定长度的数字列表。 在论文中提出了可交换性假设,其本质上是符合独立同分布的。可以通过混合分布捕获显著的文档内统计结构。

Latent Dirichlet allocation

过程

  • word作为离散数据的最基础的单元,我们通过字典索引{1,...,V}来定义一个item

  • document是有N个单词表示的序列,诸如 W = (w1,w2,...,wn),wn表示序列中的第N个单词。

  • corpus是一个M个文档的集合,表示为D={W1,W2,...,Wm}

潜在狄利克雷分配(Latent Dirichlet allocation, LDA)是语料库的生成概率模型。其基本思想是,文档被表示为潜在主题的随机混合物,其中每个主题的特征是单词的分布。

对于LDA假设,语料D中的每个文档W有以下的过程

一些简化的假设运用在这个模型上。首先,我们假设Dirichlet 分布的维度K是已知的而且是确定的。那么矩阵​也是确定的,泊松假设对真实的文档长度是有更多的要求的,因此,对于所有的数据变量​,​,对此我们可以得到以下的简单的概率密度公式

参数​\alpha是一个​\alpha_i > 0的k向量,​\Gamma是一个Gamma函数。

图模型表示LDA。外部的框表示文档,然而内部的框表示的是文档中反复选择的主题和单词。从图中可知有三层。​,​ 为语料层次参数,​为文档层次的,​,​为单词层级参数。LDA模型它涉及三个级别,特别是在文档中反复采样主题节点。在这个模型下,文档可以与多个主题关联。

在给定参数α和β的条件下,关于θ、z、和w的联合分布公式为:

这儿对于唯一的i来说,p(z_n | \theta)是简单的,以至于z^i_n = 1。在\theta 上积分,在z上求和,我们就可以得到关于文档的边缘分布:

最后,取单个文档的边缘概率的乘积就能得到整个语料的概率。

解决的问题

LDA模型将主题混合权重作为一个k参数随机隐藏变量而不是个人参数,并明确地链接到训练集。如上面所述,LDA是一个定义良好的生成模型,可以很容易地推广到新文档。此外,k主题 LDA模型中的k+kV参数不会随着训练语料库的大小而增大。因此LDA不存在与pLSI相同的过拟合问题。

优势

像LDA这样的生成模型,优势在于它的模块化和可扩展性。

  • LDA可以很容易地嵌入到一个更复杂的模型中,这是LSI所不具备的特性。使用成对的LDA模块来建模图像之间的关系及其相应的描述性标题

  • LDA很容易扩展到连续数据或其他非多项数据。

  • LDA的另一个简单扩展来自于允许Dirichlet分布的混合来代替LDA的单一Dirichlet。这使得潜在主题空间具有更丰富的结构,特别是允许一种不同于通过共享主题实现的集群的文档集群形式。

实例

我们用gensim提供的API进行LDA计算。首先从语料中提取字典,并用该字典把语料转换成词袋。

# 得到文档-单词矩阵 (直接利用统计词频得到特征)
dictionary = corpora.Dictionary(content)
# 将dictionary转化为一个词袋,得到文档-单词矩阵
texts = [dictionary.doc2bow(text) for text in content]
  • 在得到文档-单词矩阵的时候输入的content是个能够迭代的迭代str,类似于是array,形如[['a','b','c']]

num_topics=5
lda = models.ldamodel.LdaModel(corpus=texts, id2word=dictionary, num_topics=num_topics)
for idx,topic in lda.show_topics(num_topics=4,num_words=3):
    print(topic)

LdaModel中比较重要的几个参数含义如下:

  • corpus,计算LDA的语料

  • id2word,语料对应的字典

  • num_topics,计算的主题的数量

show_topics是得到主题的展示,参数含义:

  • num_topics 的含义是显示排名前几个话题,类似topN参数

  • num_words是指每个主题要显示的单词的个数

案例

我们做一下商品评价的主题

import pandas as pd
import jieba
from gensim.models.ldamodel import LdaModel
from gensim.corpora import Dictionary

# 读取数据
data = pd.read_csv('./comments.csv',encoding="utf8")
mycut = lambda s:jieba.lcut(s)
# 将数据data的评价列 进行jieba分词
cut_data = data['comments'].apply(mycut)
# 读取停用词
stop_words =[line.strip() for line in open('stoplist.txt', 'r',encoding='utf8').readlines()]
filter_stop = lambda words:[word for word in words if word not in stop_words]
# 将分词后的数据 进行停用词的滤除
result = cut_data.apply(filter_stop)
comment_dict = Dictionary(result)
comment_cor = [comment_dict.doc2bow(i) for i in result]
model = LdaModel(comment_cor,num_topics=3,id2word=comment_dict,)
for idx,topic in model.show_topics(num_words=4):
	print(topic)

运行结果如下:

0.067*"品牌" + 0.061*"值得" + 0.059*"信赖" + 0.021*"服务"
0.161*"很" + 0.089*"好" + 0.048*"不错" + 0.018*"质量"
0.162*"不错" + 0.059*"还" + 0.048*"性价比" + 0.013*"速度"

对于最后的结果可能不是很好,那么我们可以在数据处理阶段对文本信息做详细的处理,我想肯定能达到理想的效果的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值