语言模型困惑度

\[PP(S)=2^{-\frac{1}{N}\sum log(P(w_i))}\]

上面式子中\(S\)就是一句话,\(N\) 是这句话的长度,如果是中文,那就是分词后词的个数,\(N\)的作用实际上也相当于标准化,使得不同长度的句子困惑度可以在一个量级下比较。
Python实现如下

def perplexity(sentence, uni_gram_dict, bi_gram_dict):
    sentence_cut = list(jieba.cut(sentence))
    V = len(one_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)

你可能感兴趣的:(语言模型困惑度)