在学习NLP过程中,遇到了Good-turning的介绍,网上找了相关的资料查看,总结如下。
思想:
其主要思想是从概率的总量中分配少量的比例给零概率项。
思路:
假定给定的语料库中出现 \(r\)次数的词有\(N_r\)个,则有
\[N = \sum_{i=1}^{\infty }rN_r \]
当\(r\)较小时,我们使用\(d_r\)代替\(r\),这里\(d_r < r\),\(d_r\)的值可有下式表示
\[d_r = ( r+1 )N_{r+1}/N_r \]
其期望可以表示为
\[\hat{\theta }\left ( r \right )=\frac{1}{N}\left (r+1 \right )\frac{N_{r+1}}{N_r} \]
其中\(N\)为现有语料库中所有单词频数的总和,这样可以保证
\[N = \sum_{r}^{ }d_rN_r \]
一般情况下,发生次数为\(r\)的词个数大于发生次数为\(r+1\)的词个数,\(r\)越大,词的数量\(N_r\)越小。通过Good-turning smooth可以让数据稀疏度有效的降低,所有词的概率估计会看起来很平滑。
证明:
要证明上述假设的正确性,只需要证明期望和为1即可,即
\[\sum_{r}^{ }\hat{\theta }\left ( r \right )N_r=1 \]
证明
\[\sum_{r}^{ }\hat{\theta }\left ( r \right )N_r=\frac{1}{N}\sum_{r}^{ }\left (r+1 \right )\frac{N_{r+1}}{N_r}N_r=\frac{1}{N}\sum_{r}^{ }\left (r+1 \right )N_{r+1} \]
我们知道
\[\sum_{r}^{ }\left (r+1 \right )N_{r+1}=\sum_{r}^{ }rN_r \]
另外
\[\frac{1}{N}\sum_{r}^{ }rN_r=\frac{N}{N}=1 \]
则
\[\sum_{r}^{ }\hat{\theta }\left ( r \right )N_r=\frac{1}{N}\sum_{r}^{ }\left (r+1 \right )N_{r+1}=\frac{1}{N}\sum_{r}^{ }rN_r=1 \]
故上述证明说明了Good-turning估计的正确性
参考文章:
Good-turning估计
srilm语言模型中的平滑算法——Good-Turing平滑算法