python下进行lda主题挖掘(一)——预处理(英文)
python下进行lda主题挖掘(二)——利用gensim训练LDA模型
python下进行lda主题挖掘(三)——计算困惑度perplexity
本篇是我的LDA主题挖掘系列的第三篇,专门来介绍如何对训练好的LDA模型进行评价。
训练好LDA主题模型后,如何评价模型的好坏?能否直接将训练好的模型拿去应用?这是一个比较重要的问题,在对模型精度要求比较高的项目或科研中,需要对模型进行评价。一般来说,LDA模型的主题数量都是需要需要根据具体任务进行调整的,即要评价不同主题数的模型的困惑度来选择最优的那个模型。
那么,困惑度是什么?
1.LDA主题模型困惑度
这部分参照:
LDA主题模型评估方法–Perplexity
,不过后面发现这篇文章
Perplexity(困惑度)
感觉写的更好一点,两篇都是翻译的维基百科。
perplexity是一种信息理论的测量方法,b的perplexity值定义为基于b的熵的能量(b可以是一个概率分布,或者概率模型),通常用于概率模型的比较
wiki上列举了三种perplexity的计算:
1.1 概率分布的perplexity
公式:
其中H§就是该概率分布的熵。当概率P的K平均分布的时候,带入上式可以得到P的perplexity值=K。
1.2 概率模型的perplexity
公式:
公式中的Xi为测试局,可以是句子或者文本,N是测试集的大小(用来归一化),对于未知分布q,perplexity的值越小,说明模型越好。
指数部分也可以用交叉熵来计算,略过不表。
1.3单词的perplexity
perplexity经常用于语言模型的评估,物理意义是单词的编码大小。例如,如果在某个测试语句上,语言模型的perplexity值为2^190,说明该句子的编码需要190bits
2.困惑度perplexity公式
p
(
w
)
=
∑
z
p
(
z
∣
d
)
∗
p
(
w
∣
z
)
(
z,d分别指训练过的主题和测试集的各篇文档
)。分母的N是测试集中出现的所有词,或者说是测试集的总长度,不排重。
3.计算困惑度的代码
下述代码中加载的.dictionary(字典)、.mm(语料)、.model(模型)文件均为在
python下进行lda主题挖掘(二)——利用gensim训练LDA模型
中得到的结果,如果文件格式与我不同,说明调用的不是同一个包,代码无法直接使用,可参考代码逻辑,若是已按照
python下进行lda主题挖掘(二)——利用gensim训练LDA模型
中的方法得到上述文件,可直接调用下述代码计算困惑度。
PS:将语料经过TFIDF训练模型后计算得到的困惑度要远大于直接进行训练的困惑度(在我这边是这样),应该是正常情况,不必惊慌。
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import os
from gensim.corpora import Dictionary
from gensim import corpora, models
from datetime import datetime
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s : ', level=logging.INFO)
def perplexity(ldamodel, testset, dictionary, size_dictionary, num_topics):
"""calculate the perplexity of a lda-model"""
print ('the info of this ldamodel: \n')
print ('num of testset: %s; size_dictionary: %s; num of topics: %s'%(len(testset), size_dictionary, num_topics))
prep = 0.0
prob_doc_sum = 0.0
topic_word_list = []
for topic_id in range(num_topics):
topic_word = ldamodel.show_topic(topic_id, size_dictionary)
dic = {}
for word, probability in topic_word:
dic[word] = probability
topic_word_list.append(dic)
doc_topics_ist = []
for doc in testset:
doc_topics_ist.append(ldamodel.get_document_topics(doc, minimum_probability=0))
testset_word_num = 0
for i in range(len(testset)):
prob_doc = 0.0
doc = testset[i]
doc_word_num = 0
for word_id, num in doc.items():
prob_word = 0.0
doc_word_num += num
word = dictionary[word_id]
for topic_id in range(num_topics):
prob_topic = doc_topics_ist[i][topic_id][1]
prob_topic_word = topic_word_list[topic_id][word]
prob_word += prob_topic*prob_topic_word
if prob_word <= 0:
prob_word = 1
prob_doc += math.log(prob_word)
prob_doc_sum += prob_doc
testset_word_num += doc_word_num
prep = math.exp(-prob_doc_sum/testset_word_num)
print ("the perplexity of this ldamodel is : %s"%prep)
return prep
if __name__ == '__main__':
middatafolder = r'E:\work\lda' + os.sep
dictionary_path = middatafolder + 'dictionary.dictionary'
corpus_path = middatafolder + 'corpus.mm'
ldamodel_path = middatafolder + 'lda.model'
dictionary = corpora.Dictionary.load(dictionary_path)
corpus = corpora.MmCorpus(corpus_path)
lda_multi = models.ldamodel.LdaModel.load(ldamodel_path)
num_topics = 50
testset = []
for i in range(corpus.num_docs/300):
testset.append(corpus[i*300])
prep = perplexity(lda_multi, testset, dictionary, len(dictionary.keys()), num_topics)
1.LDA主题模型评估方法
2.LDA perplexity计算 java写的代码,本博客中的代码是参照改博客函数写的。
3.Perplexity(困惑度)
以上,欢迎交流。
代码略为粗糙,如有问题,请务必指正,感激不尽。
训练好LDA主题模型后,如何评价模型的好坏?能否直接将训练好的模型拿去应用?这是一个比较重要的问题,在对模型精度要求比较高的项目或科研中,需要对模型进行评价。一般来说,LDA模型的主题数量都是需要需要根据具体任务进行调整的,即要评价不同主题数的模型的困惑度来选择最优的那个模型。...
为了
计算LDA 的
困惑度,费劲千辛万苦,终于有所收获,以此记录。
本篇文章主要介绍p
erplexity的
计算方式,并未涉及过多的
困惑度原理,想了解更多原理部分,请移步p
erplexity介绍
本文主要是对P
erplexity per word
进行困惑度计算,公式:
主题建模作为一种基于机器学习的文本内容分析技术,一般用于推断文本文档中隐藏主题的技术。很多研究使用了基于Latent Dirichlet Allocation (LDA)的主题建模算法来处理大规模文档并识别潜在主题。LDA主题模型已经在多个研究领域得到应用,且都有着不俗表现。
LDA作为一种无监督机器学习技术,利用词袋方法识别隐藏在大规模文档集或语料库中的主题信息。LDA模型可挖掘出文档集或语料库中的潜在主题信息,并采用词 袋构建模型,在不考虑词汇出现顺序的情况下,构成“文档-主题分布”和“主题-词分布”
LDA主题模型困惑度Perplexity计算导入gensim库计算困惑度
perplexity是一种信息理论的测量方法,b的perplexity值定义为基于b的熵的能量(b可以是一个概率分布,或者概率模型),通常用于概率模型的比较。
该部分内容可参考Perplexity(困惑度)、python下进行lda主题挖掘(三)——计算困惑度perplexity
可搜索到的资料都通过编程实现了困惑度的计算,不过gensim库其实自带了perplexity的计算模块,稍作修改即可返回模型困惑度。
导入gensim库
python+gensim【中文LDA】简洁模型
https://blog.csdn.net/Yellow_python/article/details/83097994
用Python进行简单的文本相似度分析
https://blog.csdn.net/m0_3787...
http://www.52nlp.cn/lda-math-lda-%E6%96%87%E6%9C%AC%E5%BB%BA%E6%A8%A1
LDA主题模型评估方法--Perplexity
http://www.52nlp.cn/lda-math-lda-%E6%96%87%E6%9C%AC%E5%BB%BA%E6%A8%A1
LDA-math-LDA 文本建模
http://www.iyu...
前期训练数据使用的工具包是LDA, [ 文档传送 ]
如果需要Java版本,可以参考下面链接,本文也是基于此文改写为python,不得不说,python还是要简洁的多哈哈
https://blog.csdn.net/dongweionly/article/details/50286961
dw是文档-词矩阵,dt是经过LDA训练后的文档-主题矩阵,tw是经过LDA训练后...
对于LDA模型,最常用的两个评价方法困惑度(Perplexity)、相似度(Corre)。
其中困惑度可以理解为对于一篇文章d,所训练出来的模型对文档d属于哪个主题有多不确定,这个不确定成都就是困惑度。困惑度越低,说明聚类的效果越好。
计算公式 分母是测试集中所有单词之和,即测试集的总长度,不用排重。其中p(w)指的是测试集中每个单词出现的概率,计算公式...
你好,关于计算LDA主题模型的困惑度,我可以回答你。在Python中,可以使用gensim库来计算LDA主题模型的困惑度。具体实现方法可以参考以下代码:
```python
from gensim.models.ldamodel import LdaModel
from gensim.models.coherencemodel import CoherenceModel
from gensim.corpora.dictionary import Dictionary
# 假设已经有了文本集合corpus和词典dictionary
# 假设LDA模型的主题数为num_topics
# 训练LDA模型
lda_model = LdaModel(corpus=corpus, id2word=dictionary, num_topics=num_topics)
# 计算困惑度
coherence_model_lda = CoherenceModel(model=lda_model, texts=corpus, dictionary=dictionary, coherence='perplexity')
perplexity = coherence_model_lda.get_coherence()
print("LDA主题模型的困惑度为:", perplexity)
希望这个回答能够帮到你。