NLP基础:n-gram语言模型和神经网络语言模型
文章目录
- 语言模型的计算
- n-gram 语言模型
- n-gram 平滑技术
- 神经网络语言模型(NNLM)
- 基本思想
- 神经网络语言模型小结
- 语言模型评价指标—困惑度
语言模型是自然语言处理中的重要技术,假设一段长度为 TTT的文本中的词依次为 w1,w2,…,wTw_1, w_2, \ldots, w_Tw1,w2,…,wT,语言模型将计算该序列的概率:
P(w1,w2,…,wT).P(w_1, w_2, \ldots, w_T). P(w1,w2,…,wT).
语言模型有助于提升自然语言处理任务的效果,例如在语音识别任务中,给定一段“厨房里食油用完了”的语音,有可能会输出“厨房里食油用完了”和“厨房里石油用完了”这两个读音完全一样的文本序列。合适的语言模型能够判断出前者的概率大于后者的概率,于是可以得到正确的“厨房里食油用完了”这个文本序列。
语言模型的计算
我们可以把文本看作一段离散的时间序列w1,w2,…,wTw_1, w_2, \ldots, w_Tw1,w2,…,wT,假设每个词是按时间先后顺序依次生成的,那么在离散的时间序列中,wtw_twt(1≤t≤T1 \leq t \leq T1≤t≤T)可看作在时间步(time step)ttt的输出或标签。于是,对于一个句子而言,有:
P(w1,w2,…,wT)=∏t=1TP(wt∣w1,…,wt−1).P(w_1, w_2, \ldots, w_T) = \prod_{t=1}^T P(w_t \mid w_1, \ldots, w_{t-1}). P(w1,w2,…,wT)=t=1∏TP(wt∣w1,…,wt−1).
例如,一段含有4个词的文本序列的概率:
P(w1,w2,w3,w4)=P(w1)P(w2∣w1)P(w3∣w1,w2)P(w4∣w1,w2,w3).P(w_1, w_2, w_3, w_4) = P(w_1) P(w_2 \mid w_1) P(w_3 \mid w_1, w_2) P(w_4 \mid w_1, w_2, w_3). P(w1,w2,w3,w4)=P(w1)P(w2∣w1)P(w3∣w1,w2)P(w4∣w1,w2,w3).
n-gram 语言模型
如果一个句子特别长,那么计算和存储多个词共同出现的概率的复杂度会呈指数级增加。
由此引入 n-gram 语言模型,n-gram 是一种基于统计模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为n的滑动窗口操作,形成了长度为n的字节片段序列,每一个字节片段称为gram。
n-gram 模型基于马尔可夫假设,第n个词的出现只与前面 n-1 个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积:
P(w1,w2,…,wT)≈∏t=1TP(wt∣wt−(n−1),…,wt−1).P(w_1, w_2, \ldots, w_T) \approx \prod_{t=1}^T P(w_t \mid w_{t-(n-1)}, \ldots, w_{t-1}) . P(w1,w2,…,wT)≈t=1∏TP(wt∣wt−(n−1),…,wt−1).
这些概率可以通过直接从语料中统计 n 个词同时出现的次数得到。常用的是 n=2 的Bi-Gram和 n=3 的Tri-Gram。
例如,长度为4的序列w1,w2,w3,w4w_1, w_2, w_3, w_4w1,w2,w3,w4在Bi-Gram和Tri-Gram中的概率分别为:
P(w1,w2,w3,w4)=P(w1)P(w2∣w1)P(w3∣w2)P(w4∣w3),P(w1,w2,w3,w4)=P(w1)P(w2∣w1)P(w3∣w1,w2)P(w4∣w2,w3).\begin{aligned} P(w_1, w_2, w_3, w_4) &= P(w_1) P(w_2 \mid w_1) P(w_3 \mid w_2) P(w_4 \mid w_3) ,\\ P(w_1, w_2, w_3, w_4) &= P(w_1) P(w_2 \mid w_1) P(w_3 \mid w_1, w_2) P(w_4 \mid w_2, w_3) . \end{aligned} P(w1,w2,w3,w4)P(w1,w2,w3,w4)=P(w1)P(w2∣w1)P(w3∣w2)P(w4∣w3),=P(w1)P(w2∣w1)P(w3∣w1,w2)P(w4∣w2,w3).
当nnn较小时,nnn元语法往往并不准确。然而,当nnn较大时,nnn元语法需要计算并存储大量的词频和多词相邻频率。
对于Bi-Gram而言,有:
p(wt∣wt−1)=c(wt−1,wt)∑wtc(wt−1,wt)p(w_t|w_{t-1}) = \frac{c(w_{t-1},w_t)}{\sum_{w_t}c(w_{t-1},w_t)} p(wt∣wt−1)=∑wtc(wt−1,wt)c(wt−1,wt)
当t=1t=1t=1时,为了使上式有意义,在句子的开头加上<BOS><BOS><BOS>,即对于所有的句子w0=<BOS>w_0 = <BOS>w0=<BOS>。同时,给每个句子加上一个结束符<EOS><EOS><EOS>,加上结束符的目的是使得所有的字符串的概率之和∑sp(s)=1\sum_sp(s)=1∑sp(s)=1。
举个例子,我们有下面的语料数据:
用计算最大似然估计的方法计算概率:
p(wi∣wi−1)=c(wi−1wi)∑wic(wi−1wi)p(w_i|w_{i-1}) = \frac{c(w_{i-1}w_i)}{\sum_{w_i}c(w_{i-1}w_i)} p(wi∣wi−1)=∑wic(wi−1wi)c(wi−1wi)
其中,函数 c 表示个数统计。
用计算最大似然估计的方法计算概率p(BROWREADABOOK)p(BROW \quad \quad READ \quad A \quad BOOK)p(BROWREADABOOK),具体过程如下:
P(BROW∣<BOS>)=c(<BOS>BROW)∑wc(<BOS>w)=13P(READ∣BROW)=c(BROWREAD)∑wc(BROWw)=11P(A∣READ)=c(READA)∑wc(READw)=23P(BOOK∣A)=c(ABOOK)∑wc(Aw)=12P(<EOS>∣BOOK)=c(BOOK<EOS>)∑wc(BOOKw)=12\begin{aligned} &P(BROW |<BOS>) = \frac{c(<BOS>\quad BROW )}{\sum_{w}c(<BOS> \quad w)} = \frac{1}{3} \\ & P(READ |BROW) = \frac{c(BROW \quad READ )}{\sum_{w}c(BROW \quad w)} = \frac{1}{1} \\ & P(A |READ) = \frac{c(READ \quad A )}{\sum_{w}c(READ \quad w)} = \frac{2}{3} \\ & P(BOOK |A) = \frac{c( A \quad BOOK )}{\sum_{w}c(A \quad w)} = \frac{1}{2} \\ & P(<EOS>|BOOK ) = \frac{c( BOOK \quad <EOS> )}{\sum_{w}c(BOOK \quad w)} = \frac{1}{2} \end{aligned} P(BROW∣<BOS>)=∑wc(<BOS>w)c(<BOS>BROW)=31P(READ∣BROW)=∑wc(BROWw)c(BROWREAD)=11P(A∣READ)=∑wc(READw)c(READA)=32P(BOOK∣A)=∑wc(Aw)c(ABOOK)=21P(<EOS>∣BOOK)=∑wc(BOOKw)c(BOOK<EOS>)=21
所以:
p(BROWREADABOOK)=P(BROW∣<BOS>)×P(READ∣BROW)×P(A∣READ)×P(BOOK∣A)×P(<EOS>∣BOOK)=13×1×23×12×12≈0.06\begin{aligned} &p(BROW \; READ\; A\; BOOK)\\ = &P(BROW |<BOS>)\times P(READ |BROW) \times P(A |READ)\\&\times P(BOOK |A)\times P(<EOS>|BOOK ) \\ =&\frac{1}{3} \times 1 \times\frac{2}{3}\times\frac{1}{2}\times\frac{1}{2}\\ \approx & \;0.06 \end{aligned} ==≈p(BROWREADABOOK)P(BROW∣<BOS>)×P(READ∣BROW)×P(A∣READ)×P(BOOK∣A)×P(<EOS>∣BOOK)31×1×32×21×210.06
n-gram 平滑技术
在自然语言处理处理中,难免会遇到未登录词(OOV),即测试集中出现了训练集中未出现过的词,或者未出现过的子序列,导致语言模型计算出的概率为0。使用平滑技术的目的就是在条件概率为0时,防止整个句子的概率为0,人为按一定规则,给0条件概率一定的值。常见的平滑方法有:
- 加法平滑方法
- 古德-图灵(Good-Turing)估计法
- Katz平滑方法
- Jelinek-Mercer平滑方法
- Witten-Bell平滑方法
- 绝对减值法
具体内容参考宗成庆老师的《统计自然语言处理 第二版》
神经网络语言模型(NNLM)
基本思想
神经网络语言模型先给每个词赋予一个词向量,利用神经网络去建模当前词出现的概率与其前 n-1 个词之间的约束关系,即通过神经网络去学习词的向量表示。结构如下图所示:
具体而言,假设当前词出现的概率只依赖于前n−1n-1n−1个词。即:
p(wt∣w1…wt−1)=p(wt∣wt−n+1…wt−1)p(w_t|w_1\ldots w_{t-1}) = p(w_t|w_{t-n+1}\ldots w_{t-1}) p(wt∣w1…wt−1)=p(wt∣wt−n+1…wt−1)
假设VVV表示所有N个词的集合,wt∈Vw_t \in Vwt∈V,存在一个∣V∣×m|V|\times m∣V∣×m的参数矩阵C,矩阵的每一行代表每一个词的特征向量,m代表每个特征向量由m个维度。C(wt)C(w_t)C(wt)表示第 t 个词wtw_twt的对应的特征向量。
如上图所示,将句子的前 n-1 个词特征对应的向量C(wt−n+1)…C(wt−1)C(w_{t-n+1})\ldots C(w_{t-1})C(wt−n+1)…C(wt−1)作为神经网络的输入,输出当前的词是wtw_twt的概率。计算过程如下:
y=Wx+Utanh(d+Hx)+by = W x + U tanh(d+Hx) + b y=Wx+Utanh(d+Hx)+b
其中:
x=(C(wt−1),C(wt−2),…,C(wt−n+1))x = (C(w_{t-1}),C(w_{t-2}),\ldots ,C(w_{t-n+1})) x=(C(wt−1),C(wt−2),…,C(wt−n+1))
经过上式得到yw=(yw,1,yw,2,…,yw,N)Ty_w = (y_{w,1},y_{w,2},\ldots,y_{w,N})^Tyw=(yw,1,yw,2,…,yw,N)T ,其中,将ywy_wyw进行softmax后,yw,iy_{w,i}yw,i 表示当上下文为context(w)context(w)context(w)时,下一个词恰好是词典中第iii个词的概率,即:
P(w∣context(w))=eyw,iw∑i=1Neyw,iP(w|context(w)) = \frac{e^{y_{w,i_w}}}{\sum_{i=1}^N e^{y_{w,i}}} P(w∣context(w))=∑i=1Neyw,ieyw,iw
其中,iwi_wiw表示词在词典中的索引。
计算集中在隐藏层和输出层之间的矩阵向量运算,以及输出层上的softmax归一化运算。该模型的参数是:
θ=(b,d,W,U,C)\theta = (b,d,W,U,C) θ=(b,d,W,U,C)
损失函数是:
L=−1T∑tlogp^(wt=i∣wt−n+1…wt−1)+R(θ)L = -\frac{1}{T} \sum_t \log \hat p(w_t=i|w_{t-n+1}\ldots w_{t-1}) + R(\theta) L=−T1t∑logp^(wt=i∣wt−n+1…wt−1)+R(θ)
$ R(\theta)$是正则化项,用于控制过拟合。
有了损失函数,我们可以用梯度下降法,在给定学习率η\etaη的条件下,进行参数更新:
θ←θ−η∂L∂θ\theta \leftarrow \theta - \eta \frac{\partial L}{\partial \theta} θ←θ−η∂θ∂L
直至收敛,得到一组最优参数。
神经网络语言模型小结
只要词的表征足够好,就能具有比 n-gram 更好的泛化能力,从而很大程度地降低了数据稀疏带来的问题。不足之处是仅包含了有限的前文信息。
优点:(1) 长距离依赖,具有更强的约束性;(2) 避免了数据稀疏所带来的OOV问题;(3) 好的词表征能够提高模型泛化能力。
缺点:(1) 模型训练时间长;(2) 可解释性较差。
神经网络语言模型与 n-gram 模型相比,
1,相似的词具有相似的向量。对 n-gram 模型而言,如果语料中S1=“A dog is running in the room”出现了10000次,而S2=“A cat is running in the room”只出现了1次,p(S1)肯定会远大于p(S2)。而实际上,dog 和 cat 是相似的存在,神经网络语言模型所得到的词向量距离会比较近,表示两个词十分相似。
2,用向量表示的词自带平滑化功能(由p(w∣Context(w))∈(0,1)p(w|Context(w))∈(0,1)p(w∣Context(w))∈(0,1)不会为零),不再需要像 n-gram 那样进行额外处理了。
语言模型评价指标—困惑度
通常用困惑度作为语言模型的评价指标。
设存在文本序列W=(w1,w2,…,wN)W=(w_1,w_2,\ldots,w_N)W=(w1,w2,…,wN),则每个词的平均交叉熵为:
H(W)=−1NlogP(w1,w2,…,wN)H(W) = -\frac{1}{N}\log P(w_1,w_2,\ldots,w_N) H(W)=−N1logP(w1,w2,…,wN)
显然,交叉熵越小,得到的概率模型越接近真实分布,进一步我们定义困惑度为:
Preplexity(W)=2H(W)=1P(w1,w2,…,wN)NPreplexity(W) = 2^{H(W)} = \sqrt[N]{\frac{1}{ P(w_1,w_2,\ldots,w_N)}} Preplexity(W)=2H(W)=NP(w1,w2,…,wN)1
由公式可知:困惑度越小,说明所建模的语言模型越精确。
参考文章
A Neural Probabilistic Language Model
深入理解语言模型 Language Model
6.1语言模型
语言模型基础
NLP基础:n-gram语言模型和神经网络语言模型相关推荐
- NLP入门概览(3)—— 神经网络语言模型、词向量
在这一部分中,我们将在此基础上介绍神经网络语言模型以及词向量的相关知识.在介绍这些知识之前,我们首先对自然语言处理领域的整体架构进行一些简单的介绍. 1. 自然语言处理架构 首先,我们来看这样 ...
- NLP自然语言处理:神经网络语言模型(NNLM)
目录 一.传统语言模型 1.1 稀疏性 1.2 泛化能力差 二.神经网络语言模型 2.1 前馈神经网络模型(FFLM) 2.2 循环神经网络模型(RNNLM) 2.2.1 循环神经网络模型示例 2.2 ...
- 自然语言处理NLP(3)——神经网络语言模型、词向量
在上一部分中,我们了解到了统计语言模型,n-gram模型以及语料库的基本知识: 自然语言处理NLP(2)--统计语言模型.语料库 在这一部分中,我们将在此基础上介绍神经网络语言模型以及词向量的相关知识 ...
- 【NLP】神经网络语言模型(NNLM)
背景 语言模型也经常会在NLP中提出.在深度学习大行其道的今天基于神经网络的语言模型与传统定义的又有什么区别呢?语言模型在NLP中有什么意义呢?不妨沉下心,了解一下. 语言模型是一个单纯的.统一的.抽 ...
- NLP基础——语言模型(LM)
文章目录 NLP基础:语言模型(LM) 1. 模型评估(概率估计) 2. 平滑方法 3. LM在拼写纠正(Spell Correction)中的应用 NLP基础:语言模型(LM) 语言模型(LM,La ...
- 自然语言处理(NLP)-语言模型【用来判断一句话语法上是否通顺】:N-gram语言模型(基于语料库的统计结果)--> N-gram神经网络语言模型 【语言模型的评估(①:PPL困惑度;②:BPC)】
统计语言模型实际上是一个概率模型,所以常见的概率模型都可以用于求解这些参数 常见的概率模型有:N-gram 模型.决策树.最大熵模型.隐马尔可夫模型.条件随机场.神经网络等 目前常用于语言模型的是 N ...
- 神经网络语言模型详解
1 简介 语言模型是自然语言处理领域的基础问题,其在词性标注.句法分析.机器翻译.信息检索等任务中起到了重要作用.简而言之,统计语言模型表示为:在词序列中,给定一个词和上下文中所有词,这个序列出现的概 ...
- 用飞桨做自然语言处理:神经网络语言模型应用实例
允中 发自 凹非寺 量子位 报道 | 公众号 QbitAI 编者按: 语言模型的身影遍布在NLP研究中的各个角落,想要了解NLP领域,就不能不知道语言模型. 想要让模型能落地奔跑,就需借助深度学习框 ...
- 基于神经网络语言模型的中文新闻文本聚类算法
一.新闻文本集 其中 通过TF-IDF排序 中的词(由大到小),选择其中的 t 个词作为关键字,,是对应关键字的TF-IDF值. 二.神经网络语言模型 输入:该词的上下文中相邻的几个词向量(词袋模 ...
最新文章
- C++——《算法分析与设计》实验报告——二分搜索算法
- ConcurrentLinkedQueue的实现原理和源码分析
- 浅谈-tomcat中的项目之间的访问
- 第一个java程序的错误_我是一名java初学者,执行第一个java程序welcome.java出现了以下错误,这是为什么?...
- JavaScript之对象学习
- linux下bus、devices和platform的基础模型 【转】
- 游戏筑基开发之二进制文件操作的那点事儿(C语言)
- h264 java_Java解码H264格式视频流中的图片
- 北京地铁21号线_燕郊地铁M23号线是什么鬼?
- 如何用LaTeX写简历
- 2015-2020: 5年,不问归期,奋斗没有终点
- 视频通信中的码率控制算法
- Flash地址空间的数据读取——STM32
- 计算机接口接触不良,如何处理电脑耳机插口接触不良
- python 描边,吊打Pyecharts,这个新Python绘图库也可以这么漂亮!
- vivox27微信无法连接服务器,vivo X27微信拍照模糊怎么办?简单一个操作轻松解决...
- Windows系统复制文件到虚拟机Linux环境的解决
- 《东周列国志》第五十二回 公子宋尝鼋构逆 陈灵公衵服戏朝
- python opencv 直方图均衡_Python+OpenCV:全局直方图均衡化、局部直方图自适应均衡化、直方图比较(Python版)...
- bigemap软件功能
热门文章
- 全面解析python类的绑定方法与非绑定方法(转载+自己的消化与理解)
- pycharm的updating indices
- PHP随机输出视频API源码,php 32行代码简单实现抖音无水印视频api,附前台页面
- 音频的音量检测java实现_免费剪切和合并音频,小白必读
- eclipse环境lsp4e --- org.eclipse.lsp4e
- 常用的正则表达式---学习笔记(一)
- xampp中apache不能启动解决方法 (share)
- 1)phpmyadmin导入数据库大小限制修改
- PageOffice实现最简单的Java导出Word中的数据
- 我的Android进阶之旅------Android MediaPlayer播放网络音频的实例--网络mp3播放器