在自然语言处理中,对于一个语言模型,一般用困惑度来衡量它的好坏,困惑度越低,说明语言模型面对一句话感到困惑的程度越低,语言模型就越好。
在网上关于语言模型困惑度的介绍文章中,一般会看到以下两种形式:
实际上两种形式是一样的,只不过是不一样的表达:
对于左边的式子,两边取对数之后,再反解出 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)