当前位置:   article > 正文

语言模型困惑度的两种形式及python实现_ppl计算 python

ppl计算 python

语言模型困惑度的两种形式及python实现 - 海晨威的文章 - 知乎 https://zhuanlan.zhihu.com/p/57852713

 

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

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

                                                            

                                                                       

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

对于左边的式子,两边取对数之后,再反解出 PP(S) 就可以得到右式的结果。

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

下面给出python下困惑度计算的函数代码,以bi-gram为语言模型,上面的左式为计算方式

  1. def perplexity(sentence, uni_gram_dict, bi_gram_dict):
  2. sentence_cut = list(jieba.cut(sentence))
  3. V = len(uni_gram_dict)
  4. sentence_len = len(sentence_cut)
  5. p=1 # 概率初始值
  6. k=0.5 # ngram 的平滑值,平滑方法:Add-k Smoothing (k<1)
  7. for i in range(sentence_len-1):
  8. two_word = "".join(sentence_cut[i:i+2])
  9. p *=(bi_gram_dict.get(two_word,0)+k)/(uni_gram_dict.get(sentence_cut[i],0)+k*V)
  10. return pow(1/p, 1/sentence_len)

在准备好训练语料库,并分词之后,统计一元组和二元组的频数并保存为dict就可以得到uni_gram_dict, bi_gram_dict,再用频数计算概率时加入平滑即可

 

了防止分子或者分母为0的情况出现,比如上式就是Laplace平滑

测试集有很多句子,每个句子得到的ppl不同,计算模型的ppl,最后是取测试集中所有句子ppl的平均

 

 

在标点预测的代码中:

困惑度如下定义 格式转变不同而已。

语言模型中经常使用困惑度来作为语言模型的评价

对于一段 句子(sentence) s 由词构成,即: s=w_1w_2\cdot \cdot \cdot w_n ,w代表词

\large PPL(S)=P(w_1w_2 \cdot \cdot \cdot w_N)^{-1/N}

对两边都取 对数 则:

\large {\rm log} PPL(S)=\frac{-{\rm log}P(w_1w_2 \cdot \cdot \cdot w_N)}{N}=\frac{-\sum\limits_{i=1}^{N}{\rm log}P(w_1w_ 2\cdot \cdot \cdot w_{i-1})}{N}

所以:一般的困惑度越小,模型越好,应该尽可能找困惑度小的模型

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/548249
推荐阅读
相关标签
  

闽ICP备14008679号