前面我们已经提到,20世纪50到70年代自然语言处理(NLP)的研究方法是通过句法分析 和 语义分析 这种基于规则的方式来处理NLP 问题,目的是想让计算机模拟像人一样思考的方式,让计算机理解自然语言。 但是经过二十多年的探索研究表明,基于规则的方式处理极简单的句子还行,但是稍微复杂一些的数据复杂度呈指数级增大,基于规则的自然语言处理方式无法应用到实际问题中。
而自然语言从它产生开始,逐渐演变成一种上下文相关的信息表达和传递的方式,因此,让计算机去处理自然语言,一个基本的问题就是为自然语言这种上下文相关的特性建立数学模型。 这个模型就是NLP 的基础,统计语言模型(Statistical Language Model)。
假设 S 表示一个句子,由一连串特定顺序排序的词序列 w1,w2,⋯,wn 组成,这里 n 是指句子的长度。现在,我们想知道 S 在文中出现的可能性,也就是求数学中的概率 P(S) 。由于 S=w1,w2,⋯,wn ,可得
上式中,前两项还较容易算,后面项涉及的变量太多,无法估算。 该如何处理呢?
19世纪到20世纪初,俄国数学家马尔科夫(Andrey Markov)提出了一个偷懒但十分有效的方法,即每次遇到这种情况时,就假设任意一个词 wi 出现的概率只与它的前面的词 wi−1 有关,该假设就是马尔科夫假设。于是上面的问题就变得很简单了, S 出现的概率就可表示为
那么,如何估计条件概率 P(wi|wi−1) 呢? 根据它的定义有
假设现有一语料库(Corpus), 只要数一数 wi−1 , wi 这对词在语料库中前后相邻出现多少次 C(wi−1,wi) , 以及 wi−1 本身才同样的文本中出现了多少次 C(wi−1) ,然后用这两个数分别除以语料库的大小 C ,即可得到这些词与二元组的相对频度:
然后由大数定理可知,只要统计量足够,相对频度就等于概率,即
因此,可得条件概率
利用这一简单的数学模型,NLP 中的机器翻译,语音识别等问题就都可以解决了。
在上一节中提到的建模和模型训练方法,似乎非常简单,但是,如果在训练中同时出现的次数 C(wi−1,wi) 怎么办。是否意味着条件概率 P(wi|wi−1)=0 ? 反之,如果 C(wi−1,wi) 和 C(wi−1) 都只出现了一次,能否得出 P(wi|wi−1)=1 这样非常绝对的结论?
这就涉及到统计的可靠性问题了,在下篇文章中,我们将介绍零概率问题和平滑方法。