在做LDA的过程中比较比较难的问题就是主题数的确定,下面介绍困惑度、一致性这两种方法的实现。
-
其中的一些LDA的参数需要结合自己的实际进行设定
-
直接计算出的log_perplexity是负值,是困惑度经过对数去相反数得到的。
import csv
import datetime
import re
import pandas as pd
import numpy as np
import jieba
import matplotlib.pyplot as plt
import jieba.posseg as jp, jieba
import gensim
from snownlp import seg
from snownlp import SnowNLP
from snownlp import sentiment
from gensim import corpora, models
from gensim.models import CoherenceModel
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn.decomposition import NMF, LatentDirichletAllocation
import warnings
warnings.filterwarnings("ignore")
comment = pd.read_csv(r"good_1", header = 0, index_col = False, engine='python',encoding = 'utf-8')
csv_data = comment[[(len(str(x)) > 100) for x in comment['segment']]]
print(csv_data.shape)
train = []
for i in range(csv_data.shape[0]):
comment = csv_data.iloc[i,7].split()
train.append(comment)
id2word = corpora.Dictionary(train)
corpus = [ id2word.doc2bow(sentence) for sentence in train]
coherence_values = []
perplexity_values = []
model_list = []
for topic in range(15):
lda_model = gensim.models.LdaMulticore(corpus = corpus, num_topics=topic+1, id2word = id2word, random_state=100, chunksize=100, passes=10, per_word_topics=True)
perplexity = pow(2,-lda_model.log_perplexity(corpus))
print(perplexity,end=' ')
perplexity_values.append(round(perplexity,3))
model_list.append(lda_model)
coherencemodel = CoherenceModel(model=lda_model, texts=train, dictionary=id2word, coherence='c_v')
coherence_values.append(round(coherencemodel.get_coherence(),3))
下面展示一种一致性可视化的方法
x = range(1,21)
plt.plot(x, coherence_values)
plt.xlabel("Num Topics")
plt.ylabel("Coherence score")
plt.legend(("coherence_values"), loc='best')
plt.show()
在做LDA的过程中比较比较难的问题就是主题数的确定,下面介绍困惑度、一致性这两种方法的实现。其中的一些LDA的参数需要结合自己的实际进行设定直接计算出的log_perplexity是负值,是困惑度经过对数去相反数得到的。import csvimport datetimeimport reimport pandas as pdimport numpy as npimport jiebaimport matplotlib.pyplot as pltimport jieba.posseg
主题建模作为一种基于机器学习的文本内容分析技术,一般用于推断文本文档中隐藏主题的技术。很多研究使用了基于Latent Dirichlet Allocation (LDA)的主题建模算法来处理大规模文档并识别潜在主题。LDA主题模型已经在多个研究领域得到应用,且都有着不俗表现。
LDA作为一种无监督机器学习技术,利用词袋方法识别隐藏在大规模文档集或语料库中的主题信息。LDA模型可挖掘出文档集或语料库中的潜在主题信息,并采用词 袋构建模型,在不考虑词汇出现顺序的情况下,构成“文档-主题分布”和“主题-词分布”
为了计算LDA 的困惑度,费劲千辛万苦,终于有所收获,以此记录。
本篇文章主要介绍perplexity的计算方式,并未涉及过多的困惑度原理,想了解更多原理部分,请移步perplexity介绍
本文主要是对Perplexity per word进行困惑度计算,公式:
读theta文件,构造theta二维矩阵。
读phi文件,构造phi二维矩阵。
读tassign文件,得到每篇文本的词数Nd,继而得到测试集的总词数Nsum;并根据tassign文件构造每篇文本所有词组成的词表。
编程实现,根据tassign文件构造测试集每篇文本中所有词组成的词表,根据该词表(Map形式,存储的是每篇文本所有出现的词的词id(词不排重)),得到...
对于LDA模型,最常用的两个评价方法困惑度(Perplexity)、相似度(Corre)。
其中困惑度可以理解为对于一篇文章d,所训练出来的模型对文档d属于哪个主题有多不确定,这个不确定成都就是困惑度。困惑度越低,说明聚类的效果越好。
计算公式 分母是测试集中所有单词之和,即测试集的总长度,不用排重。其中p(w)指的是测试集中每个单词出现的概率,计算公式...
lda topic model需要确定从每篇文章中提取多少个关键词,最简单的就是折肘法+困惑度的方法。
补充:还是懒得说背景!以后想起来再补充!还是电脑硬盘坏过,代码忘参考谁的了!原作者发现可以联系我!立马改参考!
LDA模型中需要评估的选项一般是主题数量,而主题数量需要根据具体任务进行调整,即通过评估不同主题数模型的困惑度来选择最优的模型主题数。本课题中,通过计算困惑度perplexity来衡量主题数量:
其中,M是测试
LDA主题模型好坏的评估,判断改进的参数或者算法的建模能力。
Blei先生在论文《Latent Dirichlet Allocation》实验中用的是Perplexity值作为评判标准。
一、Perplexity定义
http://en.wikipedia.org/wiki/Perplexity
perplexity是一种信息理论的测量方法,b的perplexity值定义为基于b的
小白一枚,有什么不对的地方请多指教。
BTM主题模型主要针对短文本而言,这里实现的方法主要参考论文《A Biterm Topic Model for Short Texts》,代码在作者的github上也有上传,我主要参考的是它的python版本:https://github.com/jasperyang/BTMpy
本文主要在以上基础上加入困惑度计算,困惑度计算公式如下所示:
def pe...