N元语法模型的数据稀疏问题解决方法之一:Good-Turing平滑

本文介绍了古德-图灵平滑算法在处理统计语言模型中数据稀疏问题的应用。通过平滑处理,提高了模型在验证集上的表现。详细解释了算法原理及具体步骤,并通过实例进行了演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在统计语言模型章节中,我们谈到了N元语法模型不可避免的一个问题,就是数据稀疏,其原因是大规模语料统计与有限语料的矛盾。根据齐普夫(Zipf)法则,我们能够推测知零概率问题不可避免。数据稀疏问题的解决办法就是进行平滑处理。平滑处理的算法有很多,本文将介绍众多算法中的佼佼者:古德-图灵(Good-Turing)平滑算法。

        古德-图灵(Good-Turing)估计法是很多平滑技术的核心,于1953年有古德(I.J.Good)引用图灵(Turing)的方法而提出来的。其基本思想是:利用频率的类别信息来平滑频率。对于任何发生r次数的n元语法,都假设它发生了r*次。


        其中,nr是训练语料中正好发生r次的N元组的个数。也就是说,发生r次的N元组的调整由发生r次的N元组与发生r+1次的N元组两个类别共同决定。统计数为r*次的N元组,其概率为:
        我们注意到:
        也就是说,N等于这个分布中最初的统计。那样,样本中所有事件的概率之和为
        因此,可以这样说我们把你n1/N的概率剩量分配给未见事件。为了更好地理解古德-图灵(Good-Turing)估计法,以一个例子来讲解。
        训练集合:T={<s>what is it what is small?}|T|=8
        验证集合:V={what is it small ? <s> flying birds are a bird.}, |V|=12
        在训练集合上,我们得到:p(<s>)=p(it)=p(small)=p(?)=0.125, p(what)=p(is)=0.25,其他为0
        如果不经过平滑处理,则验证集上两句子的概率分别为:p(what is it?)=(0.25*2)*(0.125*2)≈0.001  p(it is flying.)=0.125*0.25*(0*2)=0
        现在用古德-图灵算法进行平滑处理,如下:
        首先计算,各发生r次N元组类别的数目,依次为 N(0)=6,N(1)=4,N(2)=2,N(i)=0 ,i>2:
        其次,重新估计各概率值。
        对于发生0次的事件概率:Pr(.)=p(flying)=p(birds)=p(are)=p(bird)=p(a)= (0+1)*N(0+1)/(8*N(0))=1*4/(8*6)≈0.083
        对于发生1次的时间概率:Pr(it)=p(<s>)=p(small)=p(?)=(1+1)*N(1+1)/(8*N(1))=2*2 /(8*4)=0.125
        对于发生两次的时间概率:Pr(what)=Pr(is)=(2+1)*N(2+1)/(8*N(2))=3*0/(8*2)=0: 保持原值0.25
        归一化处理,6*P0+4*P1+2*P2=1.5。.
        所以,归一化处理后,p’(it)=p’(<s>)=p’ (small)=p’(?)= 0.125/1.5 ≈0.08,  p’(what)=p’(is)= 0.25/1.5 ≈0.17,  
        p’(.)=p’(birds)=p’(are)=p’(bird)=p’(a) = 0.083/1.5  ≈0.06
        因此:p’(what is it?)=(0175*2)*(0.08*2)≈0.0002   p’(it is flying.) ≈ 0.08*0.17*(0.06*2)≈0.00004


任务描述 本关任务:实现二语言模型数据平滑,并利用平滑后的数据计算句子概率。 相关知识 为了完成本关任务,你需要掌握:1.模型平滑化。2.good-turning平滑模型平滑 在使用语言模型直接计算某个句子出现的概率时,可能会由于某个单词或单词对出现的概率为0而导致整个句子出现的概率为0。 例如下面这个场景: 在上面的场景中,由于部分单词对出现的概率为0,导致最终两句话出现的概率均为0。但实际上,s1=“今天没有训练营”比s2=“今天训练营没有”更符合语法习惯,我们也更希望计算出来的P(s1)大于P(s2)。 一般来说,语言模型平滑处理可分为以下三类: Discounting(折扣):通过给概率不为0的项打折扣,来提高概率为0的项的概率; Interpolation(插值):在使用N-gram模型计算某一项的概率时,同时结合低阶的模型所计算出的概率; Back‐off:approximate counts of unobserved N‐gram based on the proportion of back‐off events (e.g., N‐1 gram)。 这里我们主要介绍与使用Discounting中的good-turning平滑方法good-turning平滑 Good-Turing技术是在1953年由古德(I.J.Good)引用图灵(Turing)的方法而提出来的,其基本思想是:用观察计数较高的N语法数重新估计概率量的大小,并把它指派给那些具有零计数或者较低计数的N语法。涉及的符号含义为: c:某个N语法出现的频数。 Nc:出现次数为c的 N-gram 词组的个数,是频数的频数 c*:Good-Turing平滑计数 设N为测试组集合中组的数目,则有如下公式: 通过新频数可计算出经过good-turing平滑后的组概率,公式如下: 编程要求 根据提示,在右侧编辑器补充代码,编写平滑函数,计算句子的概率 测试说明 平台会对你编写的代码进行测试: 语料库: 研究生物很有意思。他大学时代是研究生物的。生物专业是他的首选目标。他是研究生。 测试输入:他是研究物理的 预期输出:5.6888888888888895e-05 开始你的任务吧,祝你成功! import jieba #语料句子 sentence_ori="研究生物很有意思。他大学时代是研究生物的。生物专业是他的首选目标。他是研究生。" #测试句子 sentence_test=input() #任务:编写平滑函数完成数据平滑,利用平滑数据完成对2-gram模型的建立,计算测试句子概率并输出结果 # ********** Begin *********# # ********** End **********#
03-29
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值