我们每天都在说话,每天都在用语言进行交流。语言文字对我们是如此的平常,以至于绝大多数人都不会注意到语言中一些非常难以解释的现象。昨天的汉语虚词研究课上,我们就谈到了这样一个有趣的问题:在表示“仅仅”的含义时,什么时候能够用“只”,什么时候能够用“光”?若不细想的话,大家或许会认为两者的用法完全一样。“我只吃苹果”可以说成“我光吃苹果”,“光有知识还不行”也可以说成是“只有知识还不行”。我们还可以举出更多的例子来,如“别光坐着”/“别只坐着”,“光说不做”/“只说不做”等等。凭借天生的归纳性思维,一个正常人有充分的理由猜想,在表示“仅仅”的含义时,“只”和“光”是通用的。而事实上,现代汉语词典中正是把“光”字解释为“只”。有趣的是,在我们质疑只找了四个例子是否足以说明二者等价时,殊不知这句质疑本身就成了一个反例:“只找了四个例子”不能换成“光找了四个例子”。类似地,“大会只来了748个人”也不能说“大会光来了748个人”。我们继续猜想,是不是“光”不能用在数量词前面呢?也不见得。当数量词不是实指而是虚指时,我们有时也能用“光”来修饰带有数量词的名词。例如,在表示“只吃几个苹果”、“只吃一些苹果”的意义时,“光吃两个苹果”的说法是很顺口的。另一些例子则表明,“光”的用法似乎与它所修饰的名词无关。“我只当到团长”不能说成是“我光当到团长”,但怪就怪在“我只认识团长”却又偏偏可以说成是“我光认识团长”。“当到团长”和“认识团长”有什么不同呢?仔细揣摩两者的意思,我们似乎体会到了一些微妙的差别:“当到团长”是一个阶段性的、进度性的、里程碑性的概念,它必须事先经过“当到连长”、“当到营长”等事件;但“认识团长”就不一样了,没有任何规定限制我们在“认识团长”之前必须“认识连长”。同样的,“找出四个例子”是以“找了三个例子”为前提的,“来了748个人”也不是一下子就能实现的。
问题算是想通了,但怎么来阐述它呢?在这个问题上,语言学陷入了一个困境。此时,引入数理逻辑语言对于解释这种语言现象出乎意料的方便。我们说,在副词“只”修饰的事件所处的“域”中如果存在蕴含关系,则这里的“只”不能用“光”来替代。例如,提起“吃两个苹果”,我们脑海中形成的事件集合一定是“吃一个苹果”、“吃两个苹果”、“吃三个苹果”等等,而后者必然蕴含前者,因此“只吃两个苹果”不能说成“光吃两个苹果”。类似的,“当到团长”必然推出“当到连长”,但有“认识团长”不见得有“认识连长”,因此两者与“只”和“光”的搭配情况是不同的。
有人或许会说,为什么不直接说这是由“事件发生有无必然的先后顺序”所引起的?事实上,不仅仅是事件先后顺序,在更抽象的领域里,上述理论同样起作用。例如,我们可以说“x只是一个有理数”,但绝不会说“x光是一个有理数”,原因就在于,“x是整数”、“x是有理数”、“x是实数”等事件是有蕴含关系的,虽然它们之间并没有时间先后的联系。
在研究语言学,特别是语义学时,数理逻辑符号能够如此有效地解决问题,以至于语言学家们完全借用了整个数理逻辑体系,开创了一个语言学分支叫做“形式语义学”。形式语义学不但把自然语言中的个体、行为、联结词、谓词进行符号化,还引入了一些新的符号来表示会话中一些更加复杂的情形。例如,“明天可能要下雨”是真的,但“昨天可能要下雨”就不见得为真了。但由于数理逻辑中没有“可能算子”,这种普遍的会话将得不到数理逻辑形式。至于一些的确存在真假但却很可能永远无法判定其真假的命题,如何确定其语义形式就更加困难了,例如“Goldbach猜想可能是真的”、“当初Fermat可能根本就没有证到Fermat大定理”。还有一种更特殊的情况:假如一个人说“微积分的创立完全有可能提前100年”,虽然与事实相悖,但从会话目的上看这句话确实为真。为了解决这些问题,形式语义学引入了模态算子,将命题的“真值”扩充为可能的、必然的、偶然的(可能但不必然的)三种,这种可能性通常解释为“所有逻辑上可能的平行世界中是否成立”。如果在某些世界中命题成立,我们称之为“可能的”;如果在所有的世界中命题均成立,我们称之为“必然的”;如果命题在我们所处的世界中碰巧为真,但在其它世界中不见得为真,这就被归为“偶然的”。模态算子有两个,□算子(必然算子)和◇算子(可能算子),它们之间存在关系□p↔¬◇¬p和◇p↔¬□¬p。另一些常用的公理有□p→p、□(p→q)→(□p→□q)、p→□◇p等等。有了这些符号,数理逻辑便可以用于解释各种会话场合中的语句。
利用形式语义学,自然语言中的含混和歧义能够被非常有效地消除,便于深入研究语义关系,也便于将其转化为计算机能够理解的语言。语言学家甚至借用数学中的公理化方法,构建了公理语义学体系,将语义推导的过程彻底地程序化。
学科之间的促进作用永远是相互作用的。上个世纪初,在语言学迅猛发展之时,语言学家借用并且发展了数理逻辑符号,促使数理逻辑模态算子的产生。但是,估计语言学家们再怎么也不会想到,随着计算机的发展,数学科学反过来解决了语言学中的一些大问题。
随着网络的高速发展,搜索引擎系统急需要开发出一套中文分词技术。如何用计算机将一句话中的词语切分出来?建立一个词典并不难,难就难在当划分方案不止一种时该如何取舍。上世纪末,不少人都在这个课题上做过尝试。一种比较好想的算法是,从前往后不断匹配最长的单词。很多场合下这种方案都是可行的,但算法的反例也有不少,例如“北京大学/生活/动/中心”显然错了,这句话其实应该划分为“北京/大学生/活动/中心”。还有人曾经提出过“最少词语切分方案”,即当一句话有多种切分方案时,取词语数最少的方案。这种方案的效果也不好,例如“我/也/考虑/过去/北京”显然不对,正确的应该是“我/也/考虑/过/去/北京”。
统计语言模型出奇简单地解决了这个问题。假设x_1, x_2, ..., x_n是一个分词结果,我们想要计算该序列是一个合法句子的概率P(x_1, x_2, ..., x_n),它相当于P(x_1)·P(x_2|x_1)·P(x_3|x_1,x_2)·……·P(x_n|x_1,x_2,…,x_n-1)。为了使问题变得更加简单,我们采用Markov假设,认为一个词出现的概率仅仅与它前面那个词有关。于是有P(x_1, x_2, ..., x_n) = P(x_1)·P(x_2|x_1)·P(x_3|x_2)·……·P(x_n|x_n-1),而每个P(x_i|x_i-1)的值(词语x_i出现在x_i-1之后的概率)都可以在分析了大量语料之后统计得出。接下来,我们只需要在众多切分方案中选择成句概率最高的那一个即可(这一最优化问题还可以利用动态规划进行加速)。
这一个模型异常简单,但实际效果出人意料的好。事实上,这一模型不但解决了分词问题,连语音识别、多音字注音、输入法智能成句输入等问题都一并解决了,识别准确率提升了一个数量级。
数学思维已经不止一次帮助人们设计语言文字的机器处理算法了。这里我们还可以再看看拓扑学在文字识别方面的贡献。OCR是一种能够把以图片方式储存的文字信息转换为文本的技术,它可以用于将打印稿成批地扫描并还原回文本文件。设计OCR系统的一大难点是,即使图形近似匹配算法能够非常准确地识别出文字,若每处理一字就要与字库中的上万个字一一匹配,其处理速度无论如何也不能投入实际应用。一种容易想到的权宜之计便是首先匹配字库中的常用字,若匹配成功则继续处理下一个字。这种办法并不能从根本上解决问题。另一种颇具启发性的想法便是将字库中的字形按照所占平面空间的多少进行排序分类。这可以在一定程度上缩小匹配检索的范围,速度有了一些提升。此时,拓扑学再一次显示出了它强大的力量。我们可以从拓扑不变量出发,寻找字形的本质特征,把字库中的每个字进行编码分类。例如,“估”字就是一个有两个连通分量、一个环、两个度为三的点、一个度为四的点组成;或者通俗地说,“估”字有两个相互分离的部份,有一个“洞”,有两个三叉路口,有一个四叉路口。我们就把“估”字编码为2121。对于一些模棱两可的字形,不妨允许它存在多个编码,同属于几个不同的组。识别文字时,我们只需要计算出该字的编码,然后尝试和字库中有相同编码的字形进行匹配即可。这种算法简洁、美观而有效,并且更加神奇的是,这种算法能够直接用于各种不同的字体,甚至当图片上的文字倾斜、颠倒、大小不一甚至扭曲时该算法仍然能够有效地分析出文字的结构。拓扑思想又一次向人们展示出了它那独特的魅力。