用python计算lda语言模型的困惑度并作图
转载请注明:电子科技大学EClab——落叶花开http://www.cnblogs.com/nlp-yekai/p/3816532.html
困惑度一般在自然语言处理中用来衡量训练出的语言模型的好坏。在用LDA做主题和词聚类时,原作者D.Blei就是采用了困惑度来确定主题数量。文章中的公式为:
perplexity=exp^{ - (∑log(p(w))) / (N) }
其中,P(W)是指的测试集中出现的每一个词的概率,具体到LDA的模型中就是P(w)=∑z p(z|d)*p(w|z)【z,d分别指训练过的主题和测试集的各篇文档】。分母的N是测试集中出现的所有词,或者说是测试集的总长度,不排重。
因而python程序代码块需要包括几个方面:
1.对训练的LDA模型,将Topic-word分布文档转换成字典,方便查询概率,即计算perplexity的分子
2.统计测试集长度,即计算perplexity的分母
3.计算困惑度
4.对于不同的Topic数量的模型,计算的困惑度,画折线图。
python代码如下:
# -*- coding: UTF-8-*-
import numpy
import math
import string
import matplotlib.pyplot as plt
import re def dictionary_found(wordlist): #对模型训练出来的词转换成一个词为KEY,概率为值的字典。
word_dictionary1={}
for i in xrange(len(wordlist)):
if i%2==0:
if word_dictionary1.has_key(wordlist[i])==True:
word_probability=word_dictionary1.get(wordlist[i])
word_probability=float(word_probability)+float(wordlist[i+1])
word_dictionary1.update({wordlist[i]:word_probability})
else:
word_dictionary1.update({wordlist[i]:wordlist[i+1]})
else:
pass
return word_dictionary1 def look_into_dic(dictionary,testset): #对于测试集的每一个词,在字典中查找其概率。
'''Calculates the TF-list for perplexity'''
frequency=[]
letter_list=[]
a=0.0
for letter in testset.split():
if letter not in letter_list:
letter_list.append(letter)
letter_frequency=(dictionary.get(letter))
frequency.append(letter_frequency)
else:
pass
for each in frequency:
if each!=None:
a+=float(each)
else:
pass
return a def f_testset_word_count(testset): #测试集的词数统计
'''reture the sum of words in testset which is the denominator of the formula of Perplexity'''
testset_clean=testset.split()
return (len(testset_clean)-testset.count("\n")) def f_perplexity(word_frequency,word_count): #计算困惑度
'''Search the probability of each word in dictionary
Calculates the perplexity of the LDA model for every parameter T'''
duishu=-math.log(word_frequency)
kuohaoli=duishu/word_count
perplexity=math.exp(kuohaoli)
return perplexity def graph_draw(topic,perplexity): #做主题数与困惑度的折线图
x=topic
y=perplexity
plt.plot(x,y,color="red",linewidth=2)
plt.xlabel("Number of Topic")
plt.ylabel("Perplexity")
plt.show() topic=[]
perplexity_list=[]
f1=open('/home/alber/lda/GibbsLDA/jd/test.txt','r') #测试集目录
testset=f1.read()
testset_word_count=f_testset_word_count(testset) #call the function to count the sum-words in testset
for i in xrange(14):
dictionary={}
topic.append(5*(3i+1)) #模型文件名的迭代公式
trace="/home/alber/lda/GibbsLDA/jd/stats/model-final-"+str(5*(i+1))+".txt" #模型目录
f=open(trace,'r')
text=f.readlines()
word_list=[]
for line in text:
if "Topic" not in line:
line_clean=line.split()
word_list.extend(line_clean)
else:
pass
word_dictionary=dictionary_found(word_list)
frequency=look_into_dic(word_dictionary,testset)
perplexity=f_perplexity(frequency,testset_word_count)
perplexity_list.append(perplexity)
graph_draw(topic,perplexity_list)
下面是画出的折线图,在拐点附近再调整参数(当然与测试集有关,有图为证~~),寻找最优的主题数。实验证明,只要Topic选取数量在其附近,主题抽取一般比较理想。


本人也是新手开始作研究~程序或者其他地方有错误的,希望大家指正。
用python计算lda语言模型的困惑度并作图的更多相关文章
- LDA主题模型困惑度计算
对于LDA模型,最常用的两个评价方法困惑度(Perplexity).相似度(Corre). 其中困惑度可以理解为对于一篇文章d,所训练出来的模型对文档d属于哪个主题有多不确定,这个不确定成都就是困惑度 ...
- 计算LDA模型困惑度
http://www.52nlp.cn/lda-math-lda-%E6%96%87%E6%9C%AC%E5%BB%BA%E6%A8%A1 LDA主题模型评估方法--Perplexity http:/ ...
- 【NLP】Python实例:基于文本相似度对申报项目进行查重设计
Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...
- python计算不规则图形面积算法
介绍:大三上做一个医学影像识别的项目,医生在原图上用红笔标记病灶点,通过记录红色的坐标位置可以得到病灶点的外接矩形,但是后续会涉及到红圈内的面积在外接矩形下的占比问题,有些外接矩形内有多个红色标记,在 ...
- [转载] python 计算字符串长度
本文转载自: http://www.sharejs.com/codes/python/4843 python 计算字符串长度,一个中文算两个字符,先转换成utf8,然后通过计算utf8的长度和len函 ...
- Python计算斗牛游戏的概率
Python计算斗牛游戏的概率 过年回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛.在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都是看运气(专业术语是概率). ...
- 利用Python计算π的值,并显示进度条
利用Python计算π的值,并显示进度条 第一步:下载tqdm 第二步;编写代码 from math import * from tqdm import tqdm from time import ...
- 用Python计算幂的两种方法,非递归和递归法
用Python计算幂的两种方法: #coding:utf-8 #计算幂的两种方法.py #1.常规方法利用函数 #不使用递归计算幂的方法 """ def power(x, ...
- Python计算分位数
Python计算分位数 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/gdkyxy2013/article/details/80911514 ...
随机推荐
- leetcode第16题--3Sum Closest
Problem:Given an array S of n integers, find three integers in S such that the sum is closest to a g ...
- ssis的script task作业失败(调用外部dll)
原文 ssis的script task作业失败 我的ssis作业包里用了一个script task,会查询一个http的页面接口,获取json数据后解析然后做后续处理,其中解析json引用了本地目录下 ...
- HTML 速成
html零基础者入. 记得学计算机网络的时候好像有学过一些HTML,但没运用起来都忘光了.近来想学学如何写网页.就从html(HyperText Markup Language超文本标记语言)入手了. ...
- 在 InstantRails 环境下,安装使用 redMine
在 InstantRails 环境下,安装使用 redMine 分类: Redmine2009-06-01 10:35 732人阅读 评论(0) 收藏 举报 characterrailsencodin ...
- Asp.Net Web Api 接口,拥抱支持跨域访问。
如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问. 由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题 ...
- Javascript多线程引擎(一)
Javascript多线程引擎(一) Javascript 天生是单线程的语言, 不支持synchronized等线程操作, 但是这便不妨碍Javascript作为web语言中最具有魅力语言之一. 虽 ...
- [置顶] Android事件—单选按键和下拉按键
在平常的开发中单选按键和下拉按键是非常常用的2个点击事件.首先介绍下单选按键 1:单选按键,单选的主键是radiogroup 这个主键也是很重要的 首先介绍下主键的布局 <?xml versio ...
- python 字符串(汉语)获得MD5编码
MD5即Message-Digest Algorithm 5(消息摘要算法第五版)的简称,是当前计算机领域用于确保信息传输完整一致而广泛使用的散列算法之一(又译哈希算法.摘要算法等),主流编程语言普遍 ...
- BizTalk 2010/2013 EDI B2B
BizTalk 2010/2013 EDI B2B项目实践(1) BizTalk 2010/2013 EDI B2B项目实践(1) BizTalk开发标准EDI B2B是件非常容易的事情,但对于初 ...
- opengl离屏渲染(不需要和窗口绑定,仅当作一个可以渲染一张图片的API使用)+ opencv显示
具体过程参考的是这篇BLOG: http://wiki.woodpecker.org.cn/moin/lilin/swig-glBmpContext 这一片BLOG的代码有个 BOOL SaveBmp ...