Statistical Language Model模型介绍
基于统计的方法实现NLP,假定S表示某个有意义的句子,由一连串特定顺序排列的词ω1,ω2,…,ωn组成,这里n是句子的长度。现在,我们想知道S在文本中出现的可能性,即S的概率P(S),则P(S)=P(ω1,ω2,…,ωn)。
利用条件概率的公式:
P(ω1,ω2,…,ωn)=P(ω1)•P(ω2|ω1)•P(ω3|ω1,ω2)•••P(ωn|ω1,ω2,…,ωn-1)
条件概率怎么算?
由于条件概率P(ωn|ω1,ω2,…,ωn-1)难以估算,可利用假设:
- 一个句子的合理性为该句子在语料中出现的概率
- 句子出现的概率为句子中词按顺序出现的概率
- 引入马尔可夫假设:N-gram模型为任意一个词出现的概率,和前N-1个词有关,即假设任一个词ωi出现的概率只同它前面的词ωi-1有关,则公式(1.1)可简化为
统计语言模型是二元模型(Bigram Model)。假设一个词由前面N-1个词决定,对应的模型称为N元模型。
接下来的问题是如何估计条件概率P(ωi|ωi-1)
估计联合概率P(ωi-1,ωi) 和边缘概率P(ωi-1) ,可利用语料库(Corpus),只要数一数(ωi-1,ωi)这对词在统计的文本中前后相邻出现的次数C(ωi-1,ωi),以及ωi-1本身在同样的文本中出现的次数C(ωi-1),然后用两个数分别除以语料库的大小Size .
f(ωi,ωi−1)=C(ωi−1,ωi)/Size
f(ωi−1)=C(ωi−1) / Size
根据大数定理,只要统计量足够,相对频度等于频率,因此:
P(ωi|ωi−1)≈ C(ωi−1,ωi)/C(ωi−1)
缺点
- Ngram是由词频率和共同出现的频率来估计概率的,算力的问题随着Ngram的N变大而指数增大
- 当N不太大的时候,无法解决长文本的依赖问题
优点
- 原理简单,语料库来自人类的自然文本,数据量巨大且不用标注
问题1:N阶语言模型的问题
假定文本中的每个词ωi和前面的N-1个词有关,而与更前面的词无关,这样当前词ωi的概率只取决于前面N-1个词P(ωi-N+1,ωi-N+2,…,ωi-1)。因此:
P(ωi|ω1,ω2,…,ωi-1)=P(ωi|ωi-N+1,ωi-N+2,…,ωi-1)
(2.1)
则对应的语言模型称为N元模型(N-Gram Model)。实际应用最多的是N=3的三元模型。
为什么N取值一般都这么小呢?
N元模型的大小(空间复杂度)几乎是N的指数函数,即0(|V|N),这里|V|是一种语言词典的词汇量,一般在几万到几十万。而使用N元模型的速度(时间复杂度)也几乎是一个指数函数,即0(|V|N-1)。因此,N不能很大。当N从1到2,再从2到3时,魔性的效果上升显著。而当模型从2到4时,效果的提升就不是很显著了,而资源的耗费却显著增加。
最后还有一个问题,三元或四元甚至更高阶的模型是否能覆盖所有的语言现象呢?**答案显然是否定的。**这就是马尔可夫假设的局限性,这时要采取其他一些长程的依赖性(Long distance Dependency)来解决这个问题。
问题2:统计的可靠性问题
基于统计的模型训练方法存在一定问题。比如对于二元模型(1.2),就是拿两个数字,(ωi-1,ωi)在语料中同现的次数#(ωi-1,ωi)和(ωi-1)在语料中同现的次数#(ωi-1),计算一下比值即可。但问题是,如果同现的次数#(ωi-1,ωi)=0,是否就意味着条件概率P(ωi|ωi-1)=0?反之,如果#(ωi-1,ωi)和#(ωi-1)都只出现了一次,能否得出P(ωi|ωi-1)=1的绝对性结论?
方法1 增加数据量
第一种解决方法是增加数据量。 但是仍可能遇到零概率或者统计量不足的问题。如果用直接的比值计算概率,大部分条件概率依然是零.这种模型我们称之为“不平滑”。
方法2 卡茨退避法
1953年古德(I.J.Good)在图灵(Alan Turing)的指导下,提出在统计中相信可靠的统计数据,而对不可信的统计数据打折扣的一种概率估计方法,同时将折扣的那一部分概率给予未出现的事件(Unseen Events),古德和图灵还给出了重新估算概率的公式,称为古德-图灵估计(Good-Turing Estimate)。
假定在语料库中出现r次的词有Nr个,特别地,未出现的词数量为N0。语料库大小为N,那么
出现r次的词在整个语料库中的相对频度(Relative Frequency)则是
现在假定当r比较小时,它的统计可能不可靠。因此在计算那些出现r次的词的概率时,要用一个更小一点的次数d{r}(而不直接使用r),dr的计算公式为
由此,我们可以出下面的公式是成立的
一般来说,出现一次的词的数量比出现两次的多,出现两次的比出现三次的多,这种规律称为Zipf定律(Zipf’s Law),即Nr+1<Nr 。因此,一般情况下,dr<r,而d0>0。
前IBM科学家卡茨(S.M.Katz)提出的卡茨退避法(Katz backoff) 在实际的自然语言处理中,一般对出现次数超过某个阈值的词,频率不下调,只对出现次数低于这个阈值 T的词,频率才下调,下调得到的频率总和给未出现的词。
T是一个阈值,一般在8~10左右,函数fgt()表示经过古德-图灵估计后的相对频度
对于三元模型
方法3 删除差值
用低阶语言模型和高阶语言模型进行线性插值来达到平滑的目的,这种方法称为删除差值(Deleted Interpolation),该方法效果比卡茨退避法略差,故现在较少使用。
P(ωi|ωi-2,ωi-1)=λ(ωi-2,ωi-1) • f(ωi|ωi-2,ωi-1)+λ(ωi-1) • f(ωi|ωi-1) +λ(ωi)
问题3 语料的选取问题
选择语料库的应该
- 训练语料和模型应用的领域要一致。
- 训练数据通常越多越好。
- 训练语料的噪音高低也会影响模型的效果。
参考
https://blog.csdn.net/foneone/article/details/102832347
https://www.cnblogs.com/yxdz-hit/p/7899594.html