在自然语言处理中,对于一个语言模型,一般用困惑度来衡量它的好坏,困惑度越低,说明语言模型面对一句话感到困惑的程度越低,语言模型就越好。

在网上关于语言模型困惑度的介绍文章中,一般会看到以下两种形式:

在这里插入图片描述在这里插入图片描述

实际上两种形式是一样的,只不过是不一样的表达:

对于左边的式子,两边取对数之后,再反解出 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)

更多推荐