数学、文字和天然语言同样,都是信息的载体,它们之间本来有着自然的联系。算法
语言和数学的产生都是为了同一个目的——记录和传播信息。数据库
随着人类的进步和文明化的进展,须要表达的信息也愈来愈多,再也不是几种不一样的声音就能彻底覆盖的了,语言就此产生。安全
当语言愈来愈丰富,愈来愈抽象,语言描绘的共同语言,好比物体、数量、动做便抽象出来,造成了今天的词汇。服务器
当语言和词汇多到必定程度的时候,人类仅靠大脑已经记不住全部词汇了,高效记录信息的需求就产生了,这即是文字的起源。 在早期,象形文字的数量和记录一个文明须要的信息量是相关的。随着文明的进步,信息量的增长,埃及的象形文字便再也不随着文明的发展而增长了,由于没有人可以学会和记住那么多的文字,因而,概念的第一次归纳和归类就开始了。机器学习
在古埃及的象形文字中,读音相同的词可能用同一个符号记录。这种概念的聚类,在原理上与今天天然语言处理或者机器学习的聚类有很大的类似性。函数
不一样的文字系统在记录信息上的能力是等价的。工具
文字只是信息的载体,而非信息自己,不用文字,也能够用数字来存储一样意义的信息。这也是现代通讯的基础。学习
信息的冗余是信息安全的保障。测试
语言的数据,咱们称之为料,尤为是双语或者多语的对照语料对翻译相当重要,它是咱们从事机器翻译研究的基础。优化
既然文字是出如今远古“信息爆炸”致使人们的头脑装不下这些信息的时候,那么数字的出现则是在人们的财产多到须要数一数才搞清楚有多少的时候。
早起数字并无书写的形式,而是掰手指,这就是为何咱们今天使用十进制的缘由。(玛雅文明使用的是二十进制)
具备书写形式的数字和象形文字应该诞生于同一时期。
数字和其余文字同样,在早期只是承载信息的工具,并不具备任何抽象的含义。
描述数字最有效的是古印度人,他们发明了包括0在内的10个阿拉伯数字(这个0很重要,不然就须要许多描述进制的量词,如个十百千万等),就是今天全世界通用的数字。这种表示方法比中国和罗马的都抽象,可是使用方便。阿拉伯数字或者说印度数字的革命性不只在于它的简洁有效,并且标志着数字和文字的分离。这在客观上让天然语言的研究和数字在几千年里没有重复的轨迹,并且越走越远。
任何事物的规律是内在的,并不随它的载体而改变。天然语言的发展在冥冥之中,都受着信息科学规律的引导。
从象形文字到拼音文字(在人类第二个文明的中心古巴比伦诞生)是一个飞跃,由于人类在描述物体的方式上,从物体的外表到抽象的概念,同时不自觉地采用了对信息的编码。
犹太人在抄写圣经时,为避免错误,发明了一种相似于咱们今天计算机和通讯中校验码的方法。他们把每个希伯来字母对应于一个数字,这样每行文字加起来便获得一个特殊的数字,这个数字便成为了这一行的校验码。一样,对每一列也是这样处理。
最先提出机器智能设想的是计算机科学之父阿兰图灵(Alan Turing),1950年他在《思想》(Mind)杂志上提出了一种来验证机器是否有智能的方法:让人和机器进行交流,若是人没法判断本身交流的对象是人仍是机器时,就说明这个机器有智能了。这种方法被称为图灵测试(Turing Test)。
上个世纪70年代,基于统计的方法的核心模型是通讯系统加隐含马尔可夫模型。这个系统的输入和输出都是一维的符号序列,并且保持原有的次序。
天然语言处理的研究从单纯的句法分析和语义理解,变成了很是贴近应用的机器翻译、语音识别、文本到数据库自动生成、数据挖掘和知识的获取等等。
基于统计的天然语言处理方法,在数学模型上和通讯是相通的,甚至就是相同的。所以,在数学意义上天然语言处理又和语言的初衷——通讯联系在一块儿了。可是,科学家们认识到这个联系却花了几十年的时间。
天然语言从它产生开始,逐渐演变成一种上下文相关的信息表达和传递的方式,所以让计算机处理天然语言,一个基本的问题就是为天然语言这种上下文相关的特性创建数学模型。这个数学模型就是在天然语言处理中常说的统计语言模型,它是今天全部天然语言处理的基础,而且普遍应用于机器翻译、语音识别、印刷体或手写识别、拼写纠错、汉字输入和文献查询。
统计语言模型产生的初衷是为了解决语音识别问题。在语音识别中,计算机须要知道一个文字序列是否能构成一个你们理解并且有意义的句子,而后显示或者打印给使用者。 贾里尼克用一个简单的统计模型解决了上述问题:一个句子是否合理,就看看它的可能性大小如何。。至于可能性救用几率来衡量。
这个方法更普通而严格的描述是:假定S表示某一个有意义的句子,由一连串特定顺序排列的词w1,w2,...,wn组成,这里n是句子的长度。而S在文本中出现的可能性,也就是数学上所说的S的几率P(S)。既然S = w1,w2,...,wn,那么不妨把P(S)展开表示:P(S) = P(w1,w2,...,wn) 利用条件几率的公式,S这个序列出现的几率等于每个词出现的条件几率相乘,因而P(w1,w2,...,wn)可展开为:
P(w1,w2,...,wn) = P(w1)X P(w2|w1) X P(w3|w1,w2)...P(wn|w1,w2,..,w n-1)
其中P(w1)表示第一个词w1出现的几率;P(w2|w1)是在已知第一个词的前提下,第二个词出现的几率;以此类推。不难看出,到了词wn,它的出现几率取决于它前面的全部词。
从计算上看,第三个词的条件几率P(w3|w1,w2)已经很是难算了,到了最后一个词wn,条件几率P(wn|w1,w2,..,w n-1)的可能性太多了,没法估算。
19世纪到20世纪初,俄罗斯有个数学家叫马尔可夫,他给了个偷懒但还颇为有效的方法,也就是每当遇到这种状况时,就假设任意一个词wi出现的几率只同它前面的词wi-1有关,这样问题就变得简单了。这种假设在数学上称为马尔可夫假设。如今,S出现的几率就变得简单了:P(S) = P(w1) X P(w2|w1) X P(w3|w2) ...P(wi|wi-1)...P(wn|wn-1)
此公式对应的统计语言模型是二元模型(Bigram Model)。
而假设一个词由前面N-1个词决定的,对应的模型被成为N元模型。
接下来的问题就是如何估计条件几率P(wi|wi-1)。根据它的定义
P(wi|wi-1) = P(wi-1,wi)/P(wi-1)
而估计联合几率P(wi-1,wi)和边缘几率P(wi-1),只要数一数wi-1,wi这对词在统计的文本中先后相邻出现了多少次#(wi-1,wi),以及wi-1自己在一样的文本中出现了多少次#(wi-1),而后用两个数分别除以语料库的大小#,便可获得这些词或者二元组的相对频度。而根据大数定理,只要统计量足够,相对频度就等于几率,而P(wi|wi-1)就是这两个数的比值,因此P(wi|wi-1)约等于#(wi-1,wi) / #(wi-1)
高阶语言模型
上述的二元模型太过简化了,好比“美丽的花朵”,花朵其实和美丽有关。所以,更广泛的假设是某个词和前面若干个词有关。
假定文本中的每一个词wi和前面N-1个词有关,而与更前面的词无关,这样当前词wi的几率只取决于前面N-1个词P(w i-n+1,w i-n+2,...w i-1)。所以
P(wi|w1,w2,...,wi-1) = P(wi|w i-n+1,w i-n+2,...w i-1)
这种假设被称为N-1阶马尔可夫假设,对应的语言模型称为N元模型(N-Gram Model)。N = 2是二元模型,而N = 1的一元模型其实是一个上下文无关的模型,也就是假定当前词出现的几率与前面的词无关。而在实际应用中最多的是N = 3的三元模型,更高阶的模型就不多使用了。
N元模型的大小(或者说空间复杂度)几乎是N的指数函数,即O(|V|^N),这里|V|是一种语言词典的词汇量,通常在几万到几十万个。而使用N元模型的速度(或者说时间复杂度)也几乎是一个指数函数,即O(|V|^(n-1))。当N从1到2,再从2到3时,模型的效果上升显著。而当模型从3到4时,效果的提高就不是很显著了,而资源的耗费增长却很是快,因此,除非不是不惜资源为了作到极致,不多有人使用四元以上的模型。Google的罗塞塔翻译系统和语言搜索系统,使用的是四元模型,该模型存储于500台以上的Google服务器中。
然而,三元或者四元模型甚更高阶的模型也没法覆盖全部的语言现象。由于在天然语言中,上下文之间的相关性可能跨度很是大,甚至能够从一个段落跨到另外一个段落。所以,即便模型的阶数再提升,对这种状况也迫不得已,这就是马尔可夫假设的局限性。这时就须要采用其余一些长程的依赖性(Long Distance Dependency)来解决问题。
模型的训练、零几率问题和平滑方法
使用语言模型须要知道模型中全部条件几率,咱们称之为模型的参数。
经过对语料的统计,获得这些参数的过程称做模型的训练。
对于二元模型的模型训练方法,就是那两个数计算一下比值便可——P(wi|wi-1)约等于#(wi-1,wi) / #(wi-1),但问题是,若是同现的次数#(wi-1,wi)等于0怎么办。
若是用直接的比值计算几率,大部分条件几率会为0,这种模型咱们称之为“不平滑”。在实际应用中,统计语言模型的零几率问题是没法回避的,必须解决。
训练统计语言模型的艺术就在于解决好统计样本不足时的几率估计问题。
1953年古德(I.J.Good)在他的老板图灵(Alan Turing)的指导下,提出了在统计中相信可靠的统计数据,而对不可信的统计数据打折扣的一种几率估计方法,同时将折扣出来的那一部分几率给与未看见的时间(Unseen Events)。古德和图灵还给出了一个从新估算几率的公式,这个公式被称为古德-图灵估计(Good-Turing Estimate)。
古德-图灵估计的原理是这样的:对于没有看见的事件,咱们不能认为它发生的几率就是零,所以咱们从几率的总量中分配一个很小的比例给与这些没有看见的事件。这样一来,看见的那些事件的几率总和就要小于1了,所以,须要将全部看见的时间几率调小一点。至于小多少,要根据“越是不可信的统计折扣越多”的方法进行。
以统计词典中的几率为例,来讲明古德-图灵公式。
假定在语料库中出现r次的词有Nr个,特别的出现0次(未登陆词)出现的次数为N0个。语料库中词语的个数为N,显然
出现r次的词在词典中的相对频度为r/N。若是不作任何优化处理,就依这个相对频度做为这些词的几率估计。
加入当r很是小时,这么统计可能不可靠,所以出现r次的那些词在计算它们的几率时要使用一个更小一点的数,是dr,而不是r。古德-图灵估计按照下面的公式计算dr:
显然
这样出现r次的词的几率估计为dr/N。因而,对于频率超过必定阈值的词,它们的几率估计就是它们在语料库中的相对频度,对于频率小于这个阈值的词,它们的几率估计就小于它们的相对频度,出现次数越少的,折扣越多。对于未看见的词,也给予了一个比较小的几率。这样全部词的几率估计都很平滑了。
对于二元组(wi-1,wi)的条件几率估计P(wi|wi-1)也能够作一样的处理。因经过前一个词wi-1预测后一个词wi时,全部可能状况的条件总和应该为1,即
对于出现次数很是少的二元组(wi-1|wi),它们出现的次数须要按着古德-图灵的方法打折扣,这样意味着有一部分几率没有分配出去,留给了未登陆的二元组(wi-1wi)。基于这种思想,估计二元模型几率公式以下:
这种平滑的方法,最先由前IBM科学家卡茨(S.M.Katz)提出,故称为卡茨退避法(katz backoff)。相似地,对于三元模型,几率估计公式以下:
语料的选取问题
模型训练中另外一个重要的问题就是训练数据,或者说语料库的选取。若是训练语料和模型应用的领域相脱节,那么模型的效果一般要大打折扣。
训练数据一般是越多越好。毕竟在数据量多的时候几率模型的参数能够估计得比较准确。高阶的模型由于参数多,须要的训练数据也相应会多不少。遗憾的是,并不是全部的应用都能获得足够的训练数据。
在训练数据和应用数据一致而且训练量足够大的状况下,训练语料的噪音高低也会对模型的效果产生必定的影响,所以,在训练之前有时须要对训练数据进行预处理。通常状况下,少许的(没有模式的)随机噪音清除起来成本很是高,一般就不作处理了。可是对能找到模式的、量比较大的噪音仍是须要进行过滤的。
利用统计语言模型分词的方法,能够用几个数学公式简单归纳以下:假定一个句子S能够有几种分词方法,为了简单起见,假定有如下几种:
A1,A2,...Ak
B1,B2,...Bm
C1,C2,...Cn
其中,A1,A2...B1,B2...C1,C2...等等都是汉语的词,上述各类分词结构可能产生不一样数量的词串,k,m,n三个不一样的下标表示句子在不一样的分词时词的数目。那么最好的一种分词方法应该保证分完词后这个句子出现的几率最大。也就是说,若是A1,A2...Ak是最好的方法,那么其几率知足
P(A1,A2...Ak) > P(B1,B2,...Bm) 且 P(A1,A2...Ak) > P(C1,C2,..Cn)
若是穷举全部可能的分词方法并计算出每种可能性下句子的几率,那么计算量是至关大的,所以,能够把它当作是一个动态规划(Dynamic Programming)的问题,并利用维特比(Viterbi)算法快速地找到最佳分词。
通常来说,根据不一样应用,汉语分词的颗粒度大小应该不一样。好比在机器翻译中,颗粒度应该大一些,“北京大学”就不能被分红两个词。而在语音识别中,“北京大学”通常是被分红两个词。所以,不一样的应用应该有不一样的分词系统。
语言处理的许多数学方法是通用的,和具体的语言无关。
分词的一致性
在将统计语言模型用于分词之前,分词的准确率一般较低,能够提高的空间很是大。不一样的人切分的区别虽然会影响分词评测的准确性,可是好的方法和坏的方法仍是能够根据分词结果与人工切分的比较来衡量的。
当统计语言模型被普遍应用后,不一样的分词器产生的结构的差别要远远小于不一样人之间见解的差别,这时简单依靠与人工分词的结果比较来衡量分词器的准确性就毫无心义了。所幸的是,中文分词如今是一个已经解决了的问题了,提升的空间微乎其微了。只要采用统计语言模型,效果都差不到哪里去。
词的颗粒度和层次
人工分词产生不一致性的缘由主要在于人们对词的颗粒度的认识问题。
不一样的应用中,应有不一样的颗粒度。一个好的方法是让一个分词器同时支持不一样层次的词的切分。原理介绍以下:
首先须要一个基本的词表(包括像“清华”、“大学”这样没法再分的词),和一个复合词的词表(包含复合词以及它们由哪些基本词构成,包括像“清华大学:清华-大学”)。
接下来须要根据基本词表和复合词表各创建一个语言模型,好比L1和L2.而后根据基本词表和语言模型L1对句子进行分词,就获得了小颗粒度的分词结果。最后,在此基础上,再用复合词表和语言模型L2进行第二次分词。
分词的不一致性能够分为错误和颗粒度不一致两种,错误又分红两类,一类是越界型错误,好比把“北京大学生”分红“北京大学-生”。另外一类是覆盖型错误,好比把“贾里尼克”拆成了四个字。
对于某些应用,须要尽量地找到各类复合词,而不是将其切分。所以,须要花一些功夫作数据挖掘的工做,不断完善复合词的词典(它的增加速度比较快),这是近年来中文分词主要花精力的地方。