ngram平滑主要解决在当前gram下,词表中没有出现该词的情况(不能使用想当然的词频0).
Sen=一个 傻子 走 在 大陆 上
p(sen)=p(一个|start)p(傻子|一个)p(走|一个,傻子)*p(在|傻子,走)…
求p(傻子|一个)的方法为在词表中找 【一个 傻子】 的概率(经过了log计算)但是….没有找到
于是,使用 这个回退系数bow(-0.4344)来通过p(傻子)*bow作为p(傻子|一个)【如果傻子也不存在,那么应该是OOV了吧】
那么bow应该怎么求呢?
参考: https://blog.csdn.net/xmdxcsj/article/details/50373554
假设p(傻子|一个)[一个 傻子]在2gram中不存在,则求p(傻子|一个)变为求
bow(一个)*p(傻子)。
假设词表中为[一个 苹果],[一个 粒子],而没有[一个 傻子]。
根据公式 bow(一个)=(1-p(苹果|一个)-p(例子|一个))/(p(傻子)
从而得到p(傻子|一个)的概率值。
假设p(在|傻子,走) [傻子 走 在]在3gram中不存在,则求p(在|傻子,走)变为求:
bow(傻子,走)*p(在|走)。那么bow(傻子,走)怎么求。
假设词表中存在[傻子 走 好],[傻子 走 起],而没有[傻子 走 在]。
bow(傻子,走)=(1-p(好|傻子,走)-p(起|傻子,走))/(p(好|走)+p(起|走))
从而可以得到p(在|傻子,走)的概率值。
最后相乘得到句子的概率。