【Natural Language Processing】语言模型(Language Modeling)
来源:互联网 发布:数据监控 编辑:程序博客网 时间:2024/05/16 03:08
一、语言模型简介
语言模型用于对特定序列的一系列词汇的出现概率进行计算。一个长度为m的词汇序列{
其中
上面的P(S)即为语言模型。
1.1 语言模型的应用
①机器翻译:P(high winds tonite) > P(large winds tonite);
②拼写纠错:P(about fifteen minutes from) > P(about fifteen minuets from);
③语音识别:P(I saw a van) >> P(eyes awe of an);
自动文摘、问答系统、etc.!etc.!
二、Markov Assumption与N-gram
假设我们基于上述模型进行计算,那么将会出现指数幂种可能句子,也无法有足够的数据老训练模型,这个时候马尔科夫假设(Markov Assumption)就闪亮登场了,其假设当前出现的单词仅仅与前一个或k个单词有关,即:
Or
理论上k取得越大那么模型的效果就会越好,但是如果取得过大又会出现原来的问题,在实际应用中,k的值一般取2或者3,即分别为2-gram(Bigram model)和3-gram(Trigram model)。
最终每个单词到来的概率计算公式为:
相应的语言模型变为:
三、建立语言模型
一般地,通过最大似然估计(Maximum Likelihood Estimate)来建立语言模型,即:
假设存在训练语料为:
< s> I am Sam < /s>
< s> Sam I am < /s>
< s> I do not like green eggs and ham < /s>
那么通过计算可得:
如果存在一个更大的语料,通过同样的计算方法得到如下信息:
最终句子< s> I want english food < /s>的概率为:
P(< s> I want english food < /s>)
= P(I|< s>)× P(want|I)× P(english|want) × P(food|english) × P(< /s>|food)
=0 .000031
我们可以发现计算得到的数值通常很小,避免数据溢出、提高性能,通常会使用取log后使用加法运算替代乘法运算,即为:
四、平滑技术
数据平滑是对频率为0的n元对进行估计,典型的平滑算法有加法平滑、Good-Turing平滑、Katz平滑、插值平滑,etc.
4.1 Add-one(Laplace) Smoothing
加一平滑法,又称拉普拉斯定律,其保证每个n-gram在训练语料中至少出现1次,以bigram为例子,计算方法如下:
4.2 Good-Turing Smoothing
该方法首先我们假设在统计元组的过程中,发生c次N元组类别的数目为
一个例子:
训练集合: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;
现在用古德-图灵算法进行平滑处理,如下:
首先计算,各发生c次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。
4.3 Interpolation Smoothing
前面两种平滑技术,对于未出现的n-gramd都进行了一样的处理,其中肯定存在不合理之处,对于线性插值平滑技术,其基本思想是将高阶模型和低阶模型作线性组合,利用低元n-gram模型对高元n-gram模型进行线性插值。因为在没有足够的数据对高元n-gram模型进行概率估计时,低元n-gram模型通常可以提供有用的信息。
对于三种数据:Training data、Held-out data和Test data;
然后,根据Training data构造初始的语言模型,并确定初始的λs(如均为1);
最后,基于EM算法迭代地优化λs,使得Held-out data概率(如下式)最大化。
4.4 Stupid Backoff
五、评价方法
语言模型的评价方法在理论上可以使用困惑度/混乱度(preplexity),其基本思想是给测试集赋予较高概率值的语言模型较好,计算公式如下:
观察上述公式可得困惑度越小,句子概率越大,则说明训练得到的语言模型越好。以上即为传统中的传统的语言模型做法。
参考文献:
①斯坦福大学自然语言处理课件
②N元语法模型的数据稀疏问题解决方法之一:Good-Turing平滑
- 【Natural Language Processing】语言模型(Language Modeling)
- 语言模型 Language Modeling
- NLP:Natural Language Processing
- Natural Language Processing Knowledge
- Natural Language Processing
- 语言模型(Language Modeling)”
- 【Natural Language Processing】语言模型训练工具Srilm的安装及使用简介
- Natural Language Processing On Coursera
- 20+ Natural Language Processing APIs
- Natural Language Processing (nlp) 路线图
- 【Natural Language Processing】跨语言情感分析(NLP&CC 2013)
- 语言模型(Language Modeling)与统计语言模型
- Natural Language Processing With Python (3)
- 自然语言处理(Natural language processing) 1
- Natural Language Processing With Python (2)
- Natural Language Processing With Python (1)
- 【Natural Language Processing】seq2seq学习笔记
- 斯坦福大学自然语言处理第四课“语言模型(Language Modeling)”
- ThreadLocal使用、场景、原理
- 【TCP】TCP拥塞控制小记
- 双向数据绑定---AngularJS的基本原理学习
- [自动驾驶]Build a Traffic Sign Recognition Program
- 40个Java多线程问题总结
- 【Natural Language Processing】语言模型(Language Modeling)
- 谷歌浏览器插件推荐
- 643. Maximum Average Subarray I
- altium designer使用小技巧总结
- java中缀表达式转后缀表达式
- 颜色矩阵常用效果
- 训练总结 9.24
- C/C++ 之 结构体(1)定义和赋值
- 老司机谈谈双一流