赞
踩
转
语言模型困惑度的两种形式及python实现 - 海晨威的文章 - 知乎 https://zhuanlan.zhihu.com/p/57852713
在自然语言处理中,对于一个语言模型,一般用困惑度来衡量它的好坏,困惑度越低,说明语言模型面对一句话感到困惑的程度越低,语言模型就越好。
在网上关于语言模型困惑度的介绍文章中,一般会看到以下两种形式:
实际上两种形式是一样的,只不过是不一样的表达:
对于左边的式子,两边取对数之后,再反解出 PP(S) 就可以得到右式的结果。
上面式子中的 S 就是一句话,N 是这句话的长度,如果是中文,那就是分词后词的个数,N的作用实际上也相当于是一个Norm,使得不同长度的句子困惑度可以在一个量级下比较。
下面给出python下困惑度计算的函数代码,以bi-gram为语言模型,上面的左式为计算方式
- def perplexity(sentence, uni_gram_dict, bi_gram_dict):
- sentence_cut = list(jieba.cut(sentence))
- V = len(uni_gram_dict)
- sentence_len = len(sentence_cut)
- p=1 # 概率初始值
- k=0.5 # ngram 的平滑值,平滑方法:Add-k Smoothing (k<1)
- for i in range(sentence_len-1):
- two_word = "".join(sentence_cut[i:i+2])
- p *=(bi_gram_dict.get(two_word,0)+k)/(uni_gram_dict.get(sentence_cut[i],0)+k*V)
-
- return pow(1/p, 1/sentence_len)
在准备好训练语料库,并分词之后,统计一元组和二元组的频数并保存为dict就可以得到uni_gram_dict, bi_gram_dict,再用频数计算概率时加入平滑即可
了防止分子或者分母为0的情况出现,比如上式就是Laplace平滑
测试集有很多句子,每个句子得到的ppl不同,计算模型的ppl,最后是取测试集中所有句子ppl的平均
困惑度如下定义 格式转变不同而已。
语言模型中经常使用困惑度来作为语言模型的评价
对于一段 句子(sentence) s 由词构成,即: ,w代表词
对两边都取 对数 则:
所以:一般的困惑度越小,模型越好,应该尽可能找困惑度小的模型
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。