自然语言从它产生开始,逐渐演变成一种上下文相关的信息表达和传递的方式,因此让计算机处理自然语言,一个基本问题就是为自然语言这种上下文相关的特性建立数学模型。这个数学模型就是在自然语言处理中常说的统计语言模型,它是今天所有自然语言处理的基础,并且广泛应用于机器翻译、语音识别、印刷体或手写体识别、拼音纠错、汉字输入和文献查询。

如果 S 表示一连串特定顺序排列的词 w1, w2,…, wn ,
换句话说,S 可以表示某一个由一连串特定顺序排练的词而组成
的一个有意义的句子。现在,机器对语言的识别从某种角度来说,
就是想知道 S 在文本中出现的可能性,也就是数学上所说的 S 的
概率用 P(S) 来表示。利用条件概率的公式,S 这个序列出现的
概率等于每一个词出现的概率相乘,于是 P(S) 可展开为:
P(S) = P(w1)P(w2|w1)P(w3| w1 w2)…P(wn|w1 w2…wn-1)
其中 P (w1) 表示第一个词 w1 出现的概率;P (w2|w1) 是在
已知第一个词的前提下,第二个词出现的概率;以次类推。不难
看出,到了词 wn,它的出现概率取决于它前面所有词。从计算
上来看,各种可能性太多,无法实现。因此我们假定任意一个词
wi 的出现概率只同它前面的词 wi-1 有关(即马尔可夫假设),
于是问题就变得很简单了。现在,S 出现的概率就变为:
P(S) = P(w1)P(w2|w1)P(w3|w2)…P(wi|wi-1)…
(当然,也可以假设一个词又前面 N-1 个词决定,模型稍微复
杂些。)
接下来的问题就是如何估计 P (wi|wi-1)。现在有了大量机
读文本后,这个问题变得很简单,只要数一数这对词(wi-1,wi)
在统计的文本中出现了多少次,以及 wi-1 本身在同样的文本中
前后相邻出现了多少次,然后用两个数一除就可以了,P(wi|wi-1)
= P(wi-1,wi)/ P (wi-1)。
ued赫塔菲官方 ,也许很多人不相信用这么简单的数学模型能解决复杂的语音
识别、机器翻译等问题。其实不光是常人,就连很多语言学家都
曾质疑过这种方法的有效性,但事实证明,统计语言模型比任何
已知的借助某种规则的解决方法都有效。比如在 Google 的中英
文自动翻译中,用的最重要的就是这个统计语言模型。去年美国
标准局(NIST) 对所有的机器翻译系统进行了评测,Google 的系
统是不仅是全世界最好的,而且高出所有基于规则的系统很多。
现在,读者也许已经能感受到数学的美妙之处了,它把一些
复杂的问题变得如此的简单。当然,真正实现一个好的统计语言
模型还有许多细节问题需要解决。贾里尼克和他的同事的贡献在
于提出了统计语言模型,而且很漂亮地解决了所有的细节问题。
十几年后,李开复用统计语言模型把 997 词语音识别的问题简
化成了一个 20 词的识别问题,实现了有史以来第一次大词汇量
非特定人连续语音的识别。

摘要 : [自然语言处理] [基于规则] [基于统计] [统计语言模型] [马尔科夫] [分词]

统计语言模型产生的初衷是为了解决语音识别问题。在语音识别中,计算机需要知道一个文字序列是否能构成一个大家理解而且有意义的句子,然后显示或者打印给使用者。

自然语言处理--基于规则

人类对于自然语言的处理在最开始的时候走了一大段的弯路,甚至耗尽了无数人的一生,那就是基于规则的处理方式;
很自然的人们想到了让计算机实现人类学习语言的方式来处理自然语言,让机器来理解自然语言,然后处理,也就是说计算机需要做到以下两点:

  • 分析语句
  • 获取语义

之所以当时的研究方向如此有以下几个原因:

  • 让计算机做跟人做一样的事这个要求在人看来,第一想法就是像人一样学习理解自然语言;
  • 当时的学术界在传统语言研究上非常系统以及成熟;
  • 语法规则,词性,构词法等这些规则更容易转换成代码;

自然语言处理:研究--应用依赖关系图:

  1. 应用层 [语音识别] [机器翻译] [自动问答] [自动摘要]
  2. 认知层 [自然语言理解]
  3. 基础层 [句法分析] [语义分析]

上个世纪70年代以前,科学家们试图判断这个文字序列是否合乎文法、含义是否正确等,上节所讲,这条路走不通。但是贾里尼克换了一个角度,用一个简单的统计模型很漂亮的搞定了这个问题。

例子

基于规则如何理解下面这句话:
徐志摩喜欢林徽因

  • 句子 -> 主语谓语句号;
  • 主语 -> 名词;
  • 谓语 -> 动词 / 名词短语;
  • 名词短语 -> 名词;
  • 名词 -> 徐志摩;
  • 动词 -> 喜欢;
  • 名词 -> 林徽因;
  • 句号 -> .;

贾里尼克的出发点很简单:一个句子是否合理,就看它的可能性大小如何。至于可能性就用概率来衡量,假设第一个句子出现的概率大致是10^-20,第二个句子出现的概率是10^-25,第三个句子出现的概率是10^-70.因此,第一个句子出现的可能性最大。更普遍而严格的描述是:

局限

  1. 规则数量不可控:基于规则的处理方法会将一个句子拆分成一棵语法分析树,而当句子变得复杂时,这颗树会迅速变得很大,以至于当我们需要使用规则覆盖20%的语句时,就至少需要几万条规则,而且如果我们想要覆盖其他语句,甚至会达到每一条语句都需要增加一个规则去适应,更麻烦的是这些规则有可能是互相矛盾的,那么为了解决这个矛盾还需要添加其他附加条件到规则中;
  1. 词义,上下文相关性:即便能够给出使用所有语句的规则,计算机也很难准确分析每句话,这是因为在语言的发展过程中,逐步发展出了语义以及上下文相关性,而计算机的程序语言被设计成上下文无关性,相对于自然语言来说更加简单(上下文无关的计算复杂度是语句长度的2次方,而上下文相关的计算复杂度则是语句长度的6次方,因此在语句长度增加后,基于规则的处理开始寸步难行);

假设S表示某一个有意义的句子,由一连串特定顺序排列的词w1,w2,...,wn组成,这里n是句子的长度。想知道S在文本中出现的可能性,也就是数学上所说的S的概率P。都知道这个几乎是不可能的,因此需要有个模型来估算。既然S=w1,w2,...,wn,那么不妨把P展开表示:P=P(w1,w2,...,wn),利用条件概率的公式,S这个序列出现的概率等于每一个词出现的条件概率相乘,于是P(w1,w2,...,wn)=P*P*P...P(wn|w1,w2,...,wn-1),其中P表示第一个词w1出现的概率,P是在已知第一个词的前提下,第二个词出现的概率,以此类推,词wn的出现概率取决于它前面的所有词。

自然语言处理--基于统计

最初使用基于统计的方法来进行自然语言处理并没有想要处理所有问题,而只是想要解决语音识别问题,也确实将语音识别的准确度提升到90%,将识别单词数提高到了几万个,但是仍存在几个问题使得自然语言处理仍处于规则与统计对立的状态:

  • 没有足够强大的模型:当时的核心模型是通信系统+隐含马尔可夫模型,这种方式在处理输入输出都是一维符号序列时效果很好,这也是语音识别和词性分析获得成功的原因,但是在后面的句法分析(输入一个句子,输出二维的语法分析树)和机器翻译(虽然输入输出都是一维,但是顺序有很大变化)就不再适用了;
  • 没有足够的统计数据;

当然这一切都在计算机的计算能力以及统计数据量的不断增多后得到了解决,基于统计的自然语言处理方法在数学模型上和通信是相通甚至就是相同的,因此在数学意义上自然语言处理和语言的初衷--通信联系在一起了;

19世纪到20世纪初,俄国数学家马尔可夫将这种情况进行化简:假设任意一个词wi出现的概率只同它前面的词wi-1有关,因此这个问题就简单了,可以化简为

统计语言模型--针对自然语言上下文相关这种特性

例如以下三句话:

  • 我打算在17年每个星期写一些游戏相关的文章;
  • 打算我在每个星期写一些文章游戏相关的17年;
  • 打我在算每星期个一些文章写17年相关的游戏;

两种方式分析句子是否合理:

  • 基于规则的角度来看:
    • 第一个句子:合乎语法规则和语义规则;
    • 第二个句子:不合乎语法规则,但是语义还在;
    • 第三个句子:既不符合语法也没有语义;
      当然这种方法已经证实是走不通的;
  • 基于统计的角度来看:
    贾里尼克用一个简单的统计模型很漂亮的解决了这个问题,一个句子是否合理,只需要看它的可能性的大小就行,而可能性可以用概率来衡量;

P*P*P...P...P,这个公式对应的统计语言模型是二元模型。

计算一个语句出现的概率:

S表示语句,该语句由w1,w2...wn等N个组成;
P(S)表示语句S出现的概率;
既然不可能把上千年人们说过的话都统计出来,那么我们就需要一个用于估算的模型;
P(S)=P(w1,w2...wn)
利用条件概率公式:S这个序列出现的概率等于每个词出现的条件概率相乘,于是可以展开为:
P(w1,w2...wn)=P(w1)*P(w2|w1)*P(w3|w1,w2)...P(wn|w1,w2...wn-1)
其中P(w1)表示第一个词出现的概率,P(w2|w1)表示在第一个词出现的前提下,第二个词出现的概率,以此类推,可以看到,第n个词出现的概率取决于他前面的所有词;
从计算量上来讲,P(w1)很容易可以得到(在某一个语言字典中查找一个词的出现概率),P(w2|w1)也可以接受, 但是P(w3|w1,w2)就比较麻烦了,因为这需要计算三个不同的词的出现概率,而P(wn|w1,w2...wn-1)的计算量在n比较大时可能性就已经多到无法估算了,此时就需要使用马尔科夫假设;
马尔科夫假设:
每当遇到上述情况时,就假设任意一个词wi出现的概率只同它前面的最接近的一个单词相关,于是公式由:
P(w1)*P(w2|w1)*P(w3|w1,w2)...P(wn|w1,w2...wn-1)
变为:
P(w1)*P(w2|w1)*P(w3|w2)...P(wn|wn-1)
这种新的公式对应的统计语言模型是二元(每个词出现的概率需要考虑的词的个数)模型,接下来的问题就转为估算条件概率P(wi|wi-1),根据定义有:
P(wi|wi-1)=P(wi-1,wi)/P(wi-1)
P(wi-1,wi):即在某个语料库(Corpus)中,出现wi-1,wi并且是前后相邻关系的次数除以语料库的大小;
P(wi-1):即在同样的语料库中,出现单词wi-1的此处除以语料库的大小;
这些词或者二元组的相对频度(#表示语料库的大小):
f(wi-1,wi)=#(wi-1,wi)/#
f(wi-1)=#(wi-1)/#
而根据大数定理,只要统计量足够大,也就是语料库够大,那么相对频度就等于概率;
P(wi-1,wi)=f(wi-1,wi)
P(wi-1)=f(wi-1)
因此有:
P(wi|wi-1)=f(wi-1,wi)/f(wi-1)=#(wi-1,wi)/#(wi-1)

接下来假设如何估计条件概率P,它的定义为P=P/P,而估计联合概率P和边缘概率P,现在变得很简单。因为有了大量机读文本,也就是专业人士将的语科库,主要数一数wi-1,wi这对词在统计的文本中前后相邻出现了多少次#,以及wi-1本身在同样的文本中出现了多少次#,然后用两个数分别除以语料库的大小#,就可以得到这些词或者二元组的相对频率:

统计语言模型的工程诀窍

f=#/#; f=#/#.

高阶语言模型

我们知道大部分情况下一个词都是与自身之前多个词有相关性的而不仅仅是最接近的那一个,因此更普遍的假设是假设某个词和前面n个词有关,这被称为n阶马尔科夫假设,对应的语言模型为n+1元模型,n为2就是上一小节的公式,当n为1时,表示与上下文无关,目前使用最多的是2阶马尔科夫假设,对应3元模型,这是因为从1元到2元到3元,效果的提升很大,而从3元到4元效果提升不大,但是对资源的消耗却急剧增加,当然,实际上不管是几阶的的模型都不可能覆盖所有语言现象,这是因为上下文之间的相关性可能跨度非常大,甚至是隔段落相关的,这个也是马尔科夫假设的局限性;

根据大数定理,主要统计量足够,相对频率就等于概率,即P约等于f,

模型训练,零概率问题和平滑办法

当我们在进行训练时,例如二元模型,出现wi和wi-1都为0,或者都为1的情况时,由于出现的此处不够多,也就不满足于大数定理,那么就不能简单的得出0或者1这样的概率直接使用,那么我们该如何估算概率?
古德--图灵估计:

  • 方式:在统计中相信可靠的统计数据,而对不可信的统计数据打折扣的一个概率估计方法,同时将折扣出来的那一小部分概率给予未看见的事件;
  • 原理:对于没有看到的事件,我们不能直接认为它出现的概率为0,因此我们从概率的总量中,分配一个很小的比例给这些没有看见的事件,这样一来,看见的事件的总概率就小于1了,因此需要将所有看见的事件的概率下调一点,至于下调多少,根据"越是不可信的统计折扣越多"的方法;
  • 实际:在实际处理中,会设置一个阈值,当出现次数小于这个阈值时,会下调概率给未出现的事件,而当大于这个阈值时则不会进行下调,这样出现次数多的词,它的概率估计就是它们的相对频度,而出现次数少的,概率就会略小于它的相对频度,而对于未看见的词也给予了一个比较小的概率,这样所有词的概率估计就都平滑了--卡兹退避法;

P约等于#/#。而P就是这两个数的比值,再考虑到上面的两个概率有相同的分母,就可以约掉,因此P就约等于#/#。

语料的选取问题

语料的选择取决了应用的领域,例如搜索引擎的语料选择则应该更多从网页中或者网络流量中获取,这样场景本身对应的话效果会更好;

把复杂的问题是不是变的很简单,有点让人难以置信,用这样简单的数学模型就能解决复杂的语音识别、机器翻译等问题,而用复杂的文法规则和人工智能却做不到。其实不光是普通人, 就连很多语言学家都曾至于过这种方法的有效性,但事实证明,统计语言模型比任何已知的借助某种规则的解决方法更有效。

分词

在一些亚洲语言,例如中文,日文,韩文和泰文中,每个字的意思是没有太大意义的,这个时候理解句子意思首先就需要做分词处理,同样可以通过统计模型来实现;

Thanks Doctor JunWu;

选自吴军的《数学之美》,自己也是边学习边分享,有些理解不到位的地方,请见谅,欢迎大家指出不足,我会不断进步的。

ued赫塔菲官方 1