主题建模作为一种基于机器学习的文本内容分析技术,一般用于推断文本文档中隐藏主题的技术。很多研究使用了基于Latent Dirichlet Allocation (LDA)的主题建模算法来处理大规模文档并识别潜在主题。LDA主题模型已经在多个研究领域得到应用,且都有着不俗表现。
LDA作为一种无监督机器学习技术,利用词袋方法识别隐藏在大规模文档集或语料库中的主题信息。LDA模型可挖掘出文档集或语料库中的潜在主题信息,并采用词 袋构建模型,在不考虑词汇出现顺序的情况下,构成“文档-主题分布”和“主题-词分布”。
对于LDA模型,最常用的两个评价方法困惑度(Perplexity)、一致性(coherence)。本文先介绍如何用python对个含有多条文本的文件进行LDA主题建模,并绘制主题-困惑度曲线来得到最好的主题数。
import gensim
from gensim import corpora, models
import matplotlib.pyplot as plt
import matplotlib
from nltk.tokenize import RegexpTokenizer
from nltk.stem.porter import PorterStemmer
# 准备数据
PATH = "C:/Users/out.csv" #已经进行了分词的文档(如何分词前面的文章有介绍)
file_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')
data_set=[] #建立存储分词的列表
for i in range(len(file_object2)):
result=[]
seg_list = file_object2[i].split() #读取没一行文本
for w in seg_list :#读取每一行分词
result.append(w)
data_set.append(result)
print(data_set) #输出所有分词列表
dictionary = corpora.Dictionary(data_set) # 构建 document-term matrix
corpus = [dictionary.doc2bow(text) for text in data_set]
Lda = gensim.models.ldamodel.LdaModel # 创建LDA对象
#计算困惑度
def perplexity(num_topics):
ldamodel = Lda(corpus, num_topics=num_topics, id2word = dictionary, passes=50) #passes为迭代次数,次数越多越精准
print(ldamodel.print_topics(num_topics=num_topics, num_words=7)) #num_words为每个主题下的词语数量
print(ldamodel.log_perplexity(corpus))
return ldamodel.log_perplexity(corpus)
# 绘制困惑度折线图
x = range(1,30) #主题范围数量
y = [perplexity(i) for i in x]
plt.plot(x, y)
plt.xlabel('主题数目')
plt.ylabel('困惑度大小')
plt.rcParams['font.sans-serif']=['SimHei']
matplotlib.rcParams['axes.unicode_minus']=False
plt.title('主题-困惑度变化情况')
plt.show()
我的代码最后得到的图如下:
之后的文章我还会介绍如何用coherence来评价LDA主题模型。
主题建模作为一种基于机器学习的文本内容分析技术,一般用于推断文本文档中隐藏主题的技术。很多研究使用了基于Latent Dirichlet Allocation (LDA)的主题建模算法来处理大规模文档并识别潜在主题。LDA主题模型已经在多个研究领域得到应用,且都有着不俗表现。LDA作为一种无监督机器学习技术,利用词袋方法识别隐藏在大规模文档集或语料库中的主题信息。LDA模型可挖掘出文档集或语料库中的潜在主题信息,并采用词 袋构建模型,在不考虑词汇出现顺序的情况下,构成“文档-主题分布”和“主题-词分布”
对于
LDA
模型,最常用的两个评价方法
困惑度
(P
erp
lex
ity
)、相似度(Corre)。
其中
困惑度
可以理解为对于一篇文章d,所训练出来的模型对文档d属于哪个
主题
有多不确定,这个不确定成都就是
困惑度
。
困惑度
越低,说明聚类的效果越好。
计算公式 分母是测试集中所有单词之和,即测试集的总长度,不用排重。其中p(w)指的是测试集中每个单词出现的概率,计算公式...
为了计算
LDA
的
困惑度
,费劲千辛万苦,终于有所收获,以此记录。
本篇文章主要介绍p
erp
lex
ity
的计算方式,并未涉及过多的
困惑度
原理,想了解更多原理部分,请移步p
erp
lex
ity
介绍
本文主要是对P
erp
lex
ity
per word进行
困惑度
计算,公式:
python
使用 gensim 进行
LDA
主题
词分析,
主题
词频可视化。
LDA
(Latent Dirichlet Allocation 文档主体生模型)是一种文档主体生成模型,也成为一个三层贝叶斯概率模型,包含词、主体、文档这三层结构。所谓生成模型,就是说,一篇文章的每个词都是通过以一定的概率选择了一个
主题
,并从这个
主题
中以一定的概率选择这个词语这个一个过程得到的。
LDA
方法生成的文档可以包含多个
主题
,该模型使用下面的方法生成一个文档:
Chooseparameter θ ~ p(θ);
For each ofthe N words w_n:
Choose a topic z_n ~ p(z|θ);
Choose a word w_n ~ p(w|z);
其中θ是
主题
向量,向量的每一列表示每个
主题
在文档中出现的概率,该向量为非负的归一化向量;p(θ)是θ的分布,具体为Dirichiket分布,即分布的分布(这个没懂是啥意思啊,有空借本书看看,留个坑);N和w_n同上;z_n表示选择的
主题
,p(z|θ)表示给定θ是
主题
z的概率分布,具体为θ的值,即p(z=
from gensim.models import
Lda
Model
from gensim.corpora import Dictionary
from gensim.models.coherencemodel import CoherenceModel
# 加载语料和字典
corpus = ...
dictionary = Dictionary.load('dictionary.dict')
# 训练
LDA
模型
lda
_model =
Lda
Model(corpus=corpus, id2word=dictionary, num_topics=10)
# 计算
困惑度
p
erp
lex
ity
=
lda
_model.log_p
erp
lex
ity
(corpus)
# 计算一致性
coherence_model_
lda
= CoherenceModel(model=
lda
_model, texts=texts, dictionary=dictionary, coherence='c_v')
coherence_score = coherence_model_
lda
.get_coherence()
上面的代码中,我们首先加载语料和字典,然后使用这些
数
据训练
LDA
模型。接着,我们使用
LDA
模型的log_p
erp
lex
ity
方法计算
困惑度
。最后,我们使用CoherenceModel方法计算一致性得分。
需要注意的是,计算一致性时需要提供原始文本
数
据,而不是仅仅提供语料和字典。因此,在使用CoherenceModel方法时,需要将原始文本
数
据作为texts参
数
传递进去。