N-gram 语言模型
本内容主要介绍统计语言模型——N-gram(n 元)模型。
1.1 语言模型
语言模型(Language model,LM)就是用来计算一个句子的概率的模型,也就是判断一句话是否合理的概率。语言模型常用于语音识别、手写识别、机器翻译、输入法、搜索引擎的自动补全等领域。
1.2 N-gram 模型
本节将介绍 n-gram 模型(n 元模型)。N-gram 是一种基于统计的语言模型。
一个 n-gram 是 n 个词的序列:一个 2-gram(bigram 或二元)是两个词的序列,例如 “I love”;一个 3-gram(trigram 或三元)是三个词的序列,例如“I love you”。后面将介绍:当给定 n-gram 的上文后,如何利用 n-gram 模型估计最后一个词的概率;以及估计整个序列的概率值。
需要注意的是,通常 n-gram 即表示词序列,也表示预测这个词序列概率的模型。
假设给定一个词序列 (w1,w2,⋯,wm)(w_1,w_2,\cdots,w_m)(w1,w2,⋯,wm),我们应该如何求这个序列的概率呢?根据概率的链式法则,可得:
P(w1,w2,⋯,wm)=P(w1)∗P(w2∣w1)⋯P(wm∣w1,⋯,wm−1)=∏i=1mP(wi∣w1,⋯,wi−1)(1.1)P(w_1,w_2,\cdots,w_m)= P(w_1) * P(w_2|w_1) \cdots P(w_m|w_1,\cdots,w_{m-1}) \\ =\prod_{i=1}^{m} P(w_i|w_1,\cdots,w_{i-1}) \tag{1.1} P(w1,w2,⋯,wm)=P(w1)∗P(w2∣w1)⋯P(wm∣w1,⋯,wm−1)=i=1∏mP(wi∣w1,⋯,wi−1)(1.1)
1.2.1 马尔科夫假设
在实践中,如果文本的长度较长时,公式(1.1)右边的 P(wi∣w1,⋯,wi−1)P(w_i|w_1,\cdots,w_{i-1})P(wi∣w1,⋯,wi−1) 的估算会非常困难。那我们应该怎么处理呢?在这里我们需要引入马尔科夫假设。
马尔科夫假设是指,每个词出现的概率只跟它前面的少数几个词有关。比如,二阶马尔科夫假设只考虑前面两个词,相应的语言模型是三元(trigram)模型。引入马尔科夫假设的语言模型,也叫做马尔科夫模型。
也就是说,应用了这个假设表明当前这个词仅仅跟前面几个有限的词有关,因此也就不必追溯到最开始的那个词,这样便可以大幅缩减上述算式的长度。
基于马尔科夫假设,可得
P(wi∣w1,⋯,wi−1)≈P(wi∣wi−n+1,⋯,wi−1)(1.2)P(w_i|w_1,\cdots,w_{i-1}) \approx P(w_i|w_{i-n+1},\cdots,w_{i-1}) \tag{1.2} P(wi∣w1,⋯,wi−1)≈P(wi∣wi−n+1,⋯,wi−1)(1.2)
当 n=1n=1n=1 时称为一元模型(unigram model),公式(1.2)右边会退化成 P(wi)P(w_i)P(wi),此时,整个句子的概率为:
P(w1,w2,⋯,wm)=P(w1)∗P(w2)⋯P(wm)=∏i=1mP(wi)P(w_1,w_2,\cdots,w_m)= P(w_1) * P(w_2) \cdots P(w_m) \\ =\prod_{i=1}^{m} P(w_i) P(w1,w2,⋯,wm)=P(w1)∗P(w2)⋯P(wm)=i=1∏mP(wi)
当 n=2n=2n=2 时称为二元模型(bigram model),公式(1.2)右边会退化成 P(wi∣wi−1)P(w_i|w_{i-1})P(wi∣wi−1),此时,整个句子的概率为:
P(w1,w2,⋯,wm)=P(w1)∗P(w2∣w1)⋯P(wm∣wm−1)=∏i=1mP(wi∣wi−1)P(w_1,w_2,\cdots,w_m)= P(w_1) * P(w_2|w_1) \cdots P(w_m|w_{m-1}) \\ =\prod_{i=1}^{m} P(w_i|w_{i-1}) P(w1,w2,⋯,wm)=P(w1)∗P(w2∣w1)⋯P(wm∣wm−1)=i=1∏mP(wi∣wi−1)
当 n=3n=3n=3 时称为三元模型(trigram model),公式(1.2)右边会退化成 P(wi∣wi−2,wi−1)P(w_i|w_{i-2},w_{i-1})P(wi∣wi−2,wi−1),此时,整个句子的概率为:
P(w1,w2,⋯,wm)=P(w1)∗P(w2∣w1)⋯P(wm∣wm−2,wm−1)=∏i=1mP(wi∣wi−2,wi−1)P(w_1,w_2,\cdots,w_m)= P(w_1) * P(w_2|w_1) \cdots P(w_m|w_{m-2},w_{m-1}) \\ =\prod_{i=1}^{m} P(w_i|w_{i-2},w_{i-1}) P(w1,w2,⋯,wm)=P(w1)∗P(w2∣w1)⋯P(wm∣wm−2,wm−1)=i=1∏mP(wi∣wi−2,wi−1)
1.2.2 估计 n-gram 概率
那我们应该如何估计 n-gram 的概率呢?我们可以采用极大似然估计(maximum likelihood estimation,MLE)。即通过从语料库中获取计数,并将计数归一化到(0,1),从而得到 n-gram 模型参数的极大似然估计。即:
P(wi∣wi−n+1,⋯,wi−1)=count(wi−n+1,⋯,wi)∑wicount(wi−n+1,⋯,wi−1,wi)=count(wi−n+1,⋯,wi)count(wi−n+1,⋯,wi−1)(1.3)\begin{aligned} P(w_i|w_{i-n+1},\cdots,w_{i-1}) &= \frac {\mathbb{count}(w_{i-n+1},\cdots,w_{i})} {\sum_{w_{i}}\mathbb{count}(w_{i-n+1},\cdots,w_{i-1},w_{i})} \\ &=\frac {\mathbb{count}(w_{i-n+1},\cdots,w_{i})} {\mathbb{count}(w_{i-n+1},\cdots,w_{i-1})} \end{aligned} \tag{1.3} P(wi∣wi−n+1,⋯,wi−1)=∑wicount(wi−n+1,⋯,wi−1,wi)count(wi−n+1,⋯,wi)=count(wi−n+1,⋯,wi−1)count(wi−n+1,⋯,wi)(1.3)
其中,count(wi−n+1,⋯,wi)\mathbb{count}(w_{i-n+1},\cdots,w_{i})count(wi−n+1,⋯,wi) 表示文本序列 (wi−n+1,⋯,wi)(w_{i-n+1},\cdots,w_{i})(wi−n+1,⋯,wi) 在语料库中出现的次数。
1.2.3 计算 n-gram 概率的样例
下面我们看看来自 《Speech and Language Processing》(3rd ed. draft) 中的两个例子。
首先,我们看一下由 3 个句子组成的小语料库的例子。首先,我们需要对每个句子进行增强,在句首添加 <s>
,在句末添加 </s>
。
在句首添加
<s>
是为了给第一个词添加 bigram 上下文,如果是 trigram 概率,则需要在句首添加<s><s>
。在句末添加
</s>
是为了使 bigram 称为真正的概率分布。如果没有添加结束符,给定长度的所有句子的概率总和为 1。这个模型将定义一组无限的概率分布,每个长度的句子一个分布。
下面列出这个语料库中的一些 bigram 概率:
下面我们继续看一个伯克利酒店项目的例子。其中一些词出现的数量如下:
图 1.1 显示了部分词的 bigram 统计数。例如,第二行第三列,表示句子中在“want”后面出现“to”的次数为 608。图 1.2 显示归一化后的 bigram 概率。
图 1.1 在伯克利酒店项目语料库中的 8 个词的二元统计数(伯克利酒店项目语料包含 9332 个句子,词库数量 V=1446)。
图 1.2 在伯克利酒店项目语料库中的 8 个词的二元概率。
我们来看看图 1.2 中的概率是如何计算出来的。比如我们需要计算概率值 p(to|want)。根据式(1.3)可知,p(to|want) = count(want, to) / count(want) = 608 / 927 ≈ 0.66。
下面是一些有用的概率值:
现在我们可以计算 I want English food
的二元概率:
P(<s>iwantenglishfood)=P(i∣<s>)P(want∣i)P(english∣want)P(food∣english)P(</s>∣food)=0.25×0.33×0.0011×0.5×0.68=0.000031\begin{aligned} P(<s> \ &\mathbb{i \quad want \quad english \quad food}) \\\\ &= P(\mathbb{i|<s>}) P(\mathbb{want|i}) P(\mathbb{english|want}) \\ &\qquad \qquad \qquad P(food|english) P(</s>|food)\\\\ &= 0.25 \times 0.33 \times 0.0011 \times 0.5 \times 0.68 \\\\ &= 0.000031 \end{aligned} P(<s> iwantenglishfood)=P(i∣<s>)P(want∣i)P(english∣want)P(food∣english)P(</s>∣food)=0.25×0.33×0.0011×0.5×0.68=0.000031
1.2.4 小结
为了更好地保留词序信息,构建更有效的语言模型,我们希望在 nnn 元模型中选用更大的 nnn。但是,当 nnn 较大时,长度为 nnn 的序列出现的次数就会非常少,在按照公式(1.3)估计 nnn 元条件概率时,就会遇到数据稀疏问题,导致估算结果不准确。因此,一般在百万词级别的语料中,三元模型是比较常用的选择,同时也需要配合响应的平滑算法,进一步降低数据稀疏带来的影响。
由于概率值小于或等于 1,当我们将越多的概率值进行相乘时,得到的乘积将越小。将足够多的 n-gram 概率值进行相乘将可能导致数值下溢。所以通常可以使用对数概率(log probabilities)替代原始概率,这样我们得到的结果将不会太小。
log(p1×p2×p3×p4)=logp1+logp2+logp3+logp4\log(p_1 \times p_2 \times p_3 \times p_4) = \log p_1 + \log p_2 + \log p_3 + \log p_4 log(p1×p2×p3×p4)=logp1+logp2+logp3+logp4
1.3 语言模型评估
评估语言模型最好的方式是将其嵌入到应用中,然后评估应用的改善程度。这种端到端的评估被称为外部评估(Extrinsic Evaluation)。外部评估是评估某个组件的改善是否真正对整个任务有帮助的唯一方法。比如,对于语音识别,可以运行语音识别器两次,每次使用其中一个语音模型,看看哪个语言模型获取更高的识别准确率。
由于端到端运行大型 NLP 系统的代价是昂贵的,所以我们需要一种能够快速评估语言模型的潜在改善效果的方法。内部评估(Intrinsic evaluation) 可以不依赖任何应用而独立评估语言模型的效果。
如果我们有一个语料库,并且想比较两个 n-gram 模型。首先,我们可以将语料库分为训练集和测试集,并使用训练集训练两个模型;然后,在测试集上比较哪个模型与测试集更符合。
如何判断与测试集更符号呢?答案就是:哪个模型给测试集更高的概率值,哪个模型就更好,因为意味着模型对测试集有更高的预测准确率。
1.3.1 评估指标-困惑度(Perplexity)
在实际操作中,我们不使用概率值来评估语言模型,而是使用 困惑度(Perplexity,PP)。对于测试集 W=w1w2⋯wmW=w_1 w_2 \cdots w_mW=w1w2⋯wm,困惑度的定义如下:
PP(W)=P(w1w2⋯wm)−1m=1P(w1w2⋯wm)m=∏i=1N1P(wi∣w1⋯wi−1)m\begin{aligned} PP(W) &= P(w_1 w_2 \cdots w_m)^{-\frac{1}{m}} \\ &= \sqrt[m]{\frac{1}{P(w_1 w_2 \cdots w_m)}} \\ &= \sqrt[m]{\prod_{i=1}^{N} \frac{1}{P(w_i|w_1\cdots w_{i-1})}} \end{aligned} PP(W)=P(w1w2⋯wm)−m1=mP(w1w2⋯wm)1=mi=1∏NP(wi∣w1⋯wi−1)1
通过 PP(W)PP(W)PP(W) 的定义可知,词序列的条件概率越大,困惑度越小。因此,最小化困惑度等价于最大化词序列的概率。
困惑度的改善不能保证会提升语言处理任务(如语音识别、机器翻译)的性能。尽管如此,因为困惑度常常与这些改善有关,所以通常用它对算法进行快速检查。但是,最终需要对实际任务进行端到端评估,以确定模型的改善。
参考
[1] 《Speech and Language Processing》(3rd ed. draft)
[2] 来斯惟——《基于神经网络的词和文档语义向量表示方法研究》
[3] 自然语言处理中N-Gram模型介绍
N-gram 语言模型相关推荐
- 语音识别技术的原理及研究难点
在我们的生活中,语言是传递信息最重要的方式,它能够让人们之间互相了解.人和机器之间的交互也是相同的道理,让机器人知道人类要做什么.怎么做.交互的方式有动作.文本或语音等等,其中语音交互越来越被重视,因 ...
- 词嵌入(word embedding)(pytorch)
文章目录 词嵌入 代码 Skip-Gram 模型 如何取词 建模 模型细节 隐层,我们需要的结果 输出 N Gram模型 代码 词嵌入 参考:<深度学习入门之Pytorch> 词嵌入到底是 ...
- 自动语音识别(ASR)研究综述
自动语音识别ASR研究综述 一.语言识别基础知识 从语音系统识别构成来讲,一套完整的语音识别系统包括:预处理.特征提取.声学模型.语言模型.以及搜索算法等模块,具体结构示意图如下所示: 特征提取(MF ...
- Pytorch项目实战聊天机器人(02.项目的准备阶段)
Pytorch项目实战聊天机器人(02.项目的准备阶段) 02.项目的准备阶段 二.2-2 NLP涉及知识 三.2-3 NLTK库 四 ,2-4 语料和词性标注 五 ,2-5 分词 六 , 2-6 T ...
- 自动语音识别ASR入门介绍
GMM + HMM 应用场景,做输入法,输入一段话,变成文字,智能地往里面加标点符号. 特征提取 最常用MFCC 一帧frame信号,通常20-50ms(2-3个周期,人说话频率100Hz),一个音素 ...
- Spark MLlib 源码学习---朴素贝叶斯模型(Naive Bayes)
朴素贝叶斯是机器学习中比较常用的一种模型,尤其在文本分类的问题上是比较常用的baseline.朴素贝叶斯本身训练速度快,具有可并行化程度高,可解释性好的优点,但由于其对特征之间的独立性假设不是很符合某 ...
- DLM:微信大规模分布式n-gram语言模型系统
来源 | 微信后台团队 Wechat & NUS<A Distributed System for Large-scale n-gram Language Models at Tence ...
- edittext禁止换行符但能自动换行简书_使用n-gram创建自动完成系统
n-gram语言模型用于就是计算句子的概率,通俗来讲就是判断这句话是人话的可能性有多少.n就是将句子做切割,n个单词为一组. 如何计算句子的概率?根据条件概率和链式规则 P(B|A)=P(A,B)/P ...
- NLP基础:n-gram语言模型和神经网络语言模型
文章目录 语言模型的计算 n-gram 语言模型 n-gram 平滑技术 神经网络语言模型(NNLM) 基本思想 神经网络语言模型小结 语言模型评价指标-困惑度 语言模型是自然语言处理中的重要技术,假 ...
- 语言模型(N-Gram)
问题描述:由于公司业务产品中,需要用户自己填写公司名称,而这个公司名称存在大量的乱填现象,因此需要对其做一些归一化的问题.在这基础上,能延伸出一个预测用户填写的公司名是否有效的模型出来. 目标:问题提 ...
最新文章
- 利用tuning-primer脚本优化MySQL数据库
- sharepoint 备份还原
- js判断undefined和null
- 深入理解分布式消息队列
- 还是俄罗斯方块之android版
- mysql 5.6 ibdata1_mysql 里的 ibdata1 文件不断的增长?
- RabbitMQ集群故障恢复详解
- 【代码模板】不存在的NOIP2017
- 应用动态html教学反思,12月份教学反思:百分数的应用(一)反思
- 3S基础知识:MapInfo应用MapX编程实现地图数据查询
- 游戏战斗力量模型量化
- ISO8601时间格式转换为Date
- 通过for循环生成简单的座位表
- 量化投资学习——一份高频因子的研报综述
- 这张图可以帮助解释为什么欧洲有些国家欢迎难民,有些国家拒绝难民【The Washington Post】
- 您的计算机配置已更改,你的硬件设置已更改请重启电脑怎么回事
- True Liars (POJ - 1417)带权并查集+dp路径
- 4-kali修改root密码
- 创业者的噩梦 - 怎么就侵权了
- 大数据开发之在idea中开发第一个hadoop程序
热门文章
- 武汉同济医院挂号指南
- BUUCTF:[0CTF 2016]piapiapia
- mysql mtq_mysql实现远程登录
- linux 实现不同网段网络互通
- jmeter的吞吐量控制器
- 断舍离------活成自己喜欢的样子
- C语言将CSR存储模式转为coo,spmv_csr 稀疏矩阵的DIA/ELLPACK/COO/CSR/HYB表示形式 - 下载 - 搜珍网...
- 鸿海成立AI研发中心 5年投资100亿新台币
- 不规则图片显示(css实现多边形)
- 整数 (Integer)