[NLP] 实例讲解 N-gram语言模型 中 Good-Turning 平滑技术

18 篇文章 0 订阅
12 篇文章 1 订阅

1.背景

最近在阅读论文的时候接触到了古德-图灵估计法,感觉比较模糊不清,进一步查阅了一些资料,希望有一个自己的直观理解。

…本论文采用的是古德-图灵估计法,其基本思想是对于任意出现r次的n元语法对,都假设它出现了r*次,即降低高概率的n元语法对,提高低概率的n元语法对…

1.1 为什么要用平滑技术?

通常来讲,我们认为N-gram模型是一个无监督模型,具有非常大的语料库。
然而,语料库再大,也会出现未知的N元对。
以bigram为例,p(鼠标|弃飞),语料库再大这个p(鼠标|弃飞)也该等于0吧?天王老子来了也是0(手动狗头
等于0有什么后果呢?
请做一道速算题,1秒出答案:
847/129333.333838*(109-23)/(33+100)*0=?
以我南山幼儿园珠心算冠军的名义,这显然等于0。
所以,以马尔科夫假设为基础的N-gram模型也会等于0。
当然,这只是举一个简单的例子,实际应用中可能不会受到影响,可能会受到更大的影响。

2. 什么是Good-Turning 平滑技术?

这一小节转载自:https://www.cnblogs.com/yhzhou/p/13308734.html

在这里插入图片描述

一般情况下,发生次数为r的词个数大于发生次数为r+1的词个数,r越大,词的数量Nr越小。通过Good-turning smooth可以让数据稀疏度有效的降低,所有词的概率估计会看起来很平滑。

通俗来说,有
在这里插入图片描述
(公式里的c就是前文中的dr)

3. 具体实例

这里参考前辈的例子,并加以补充:https://blog.csdn.net/lt326030434/article/details/87893601

假设你在钓鱼,已经抓到了18只鱼:
10条鲤鱼,3条黑鱼,2条刀鱼,1条鲨鱼,1条草鱼,1条鳗鱼…
Q1:下一个钓到的鱼是鲨鱼的概率是多少?
Q2:下一条鱼是娃娃鱼的概率是多少?

当我没学过Good-Turning的时候,
Q1:天王老子来了也是 1/18
Q2: 天王老子来了也是0

学了Good-Turning之后:
我们先看Q2,
Q2:Good-Turning方法论中,我们会假设未出现过的鱼种的概率与出现一次的鱼种的概率相同,即N_0 = N_1 (N_k表示出现k次的元素的总数),在上面的例子中N_10=1,N_3=1,N_2=1,N_1=3。
此时Q2的结果也为3/18,即1/6。

回过头看Q1,
Q1:参考第二节的公式,出现一次的东西要使用到出现2次的东西,陶金公式得
p(shayu)= (1+1)*1/3/18= 1/27

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
n-gram模型是一种用于自然语言处理的统计语言模型,用于预测一个词语在给定前文的情况下出现的概率。在R语言,可以使用`quanteda`包来实现n-gram模型。 首先,需要安装`quanteda`包,可以使用以下命令进行安装: ```R install.packages("quanteda") ``` 安装完成后,可以使用以下代码创建n-gram模型: ```R library(quanteda) # 创建一个文本对象 text <- c("I love coding in R", "R is a powerful language") # 创建一个corpus对象 corpus <- corpus(text) # 创建一个token对象 tokens <- tokens(corpus) # 创建一个n-gram模型 ngram_model <- tokens_ngrams(tokens, n = 2) ``` 上述代码,我们首先创建了一个文本对象`text`,然后将其转换为corpus对象`corpus`,再将corpus对象转换为token对象`tokens`。最后,使用`tokens_ngrams`函数创建了一个n-gram模型`ngram_model`,其`n`参数指定了n-gram的大小。 创建完n-gram模型后,可以使用以下代码获取n-gram的频率信息: ```R # 获取n-gram的频率信息 ngram_freq <- textstat_frequency(ngram_model) ``` 上述代码,我们使用`textstat_frequency`函数获取了n-gram模型各个n-gram的频率信息。 除了获取频率信息外,还可以使用n-gram模型进行文本生成和预测。例如,可以使用以下代码生成一个新的文本: ```R # 使用n-gram模型生成新的文本 new_text <- generate(ngram_model, n = 10) ``` 上述代码,我们使用`generate`函数根据n-gram模型生成了一个包含10个词语的新文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值