资源描述
自然语言和计算机编程语言的比较
周锡令
2000年3月23日
2001/2/3修改
摘要:
计算机在处理编程语言方面的巨大成功 和 在自然语言处理方面的举步维艰 形成了巨大的反差。“比较”是观察和分析事物的有效方法,把自然语言和人工设计的语言进行一番比较也许能给我们一些工作上的启示。
作为信息传递的媒介,目前的计算机语言 和 自然语言 虽然在外表上有很大差异,但是在实质上的确有不少相通或者互相对应的地方。从最初的比较简单的计算机语言(例如初期的Basic)到后来越来越复杂的Fortran, C, C++,我们可以看到把自然语言中的一些机制逐步添加到计算给语言中的迹象。
计算机处理自然语言遇到重大困难,而人却能应付如裕,是因为人拥有知识(包括社会生活常识以及各种专业知识),并且具有应用这些知识来“解读”语句的能力。
自然语言是千百年以来为人际交流的目的而发展起来的。现在,人们越来越多地“上网”,计算机越来越成为这个语言社会中的一个重要的参与者。人们就会自觉、不自觉地根据计算机的“能力”去总结汉语的规律,反过来影响,甚至改造人们的语言习惯。
一方面,技术向自然语言的深层冲击,另一方面,自然语言向现代技术靠拢,这两方面的发展趋势会和起来,将会是解决“基于语义,基于理解的自然语言处理”这一战略任务的过程中的一个重要特征。
自然语言与编程语言之间的相似点
序言
经过几十年的全球性的努力,以机器翻译为代表的计算机自然语言处理工作始终没有达到人们预想的境界。于是我们竟不住要问:为什么电脑处理起“编程语言”来那样轻松自如,可以作好多非常复杂的事情;而在一句普通的自然语言面前却显得像一个大笨蛋呢?自然语言和编程语言的本质区别到底在哪里?
自然语言和编程语言显然有很多地方不同。但是作为“语言”,两者都面临语言使用这所需要的一些要求:
(1) 有强大的表达能力(能够把事情说清楚)
(2) 结构化。人的短时记忆容量不多,信息如果不分层次,无论听说还是阅读都会造成困难。
(3) 具有简洁、浓缩表达的机制(使听说双方都不觉得罗嗦)。
在这两种要求的驱动下,两种语言都会发展出一些机制,这些机制在两种语言中的表现可能大不相同,但是会存在某种对应关系。
在文科领域有所谓“比较文学”的行当。考虑到不同民族,不同文化发源地发展出来的文学作品既有各自的特色,又有互通的共性,可以对它们的异同加以比较。事实证明,从这种比较中,可以得到许多有益的启示。“比较”既然是观察和分析事物的有效方法,把自然形成的语言和人工设计的语言(计算机编程语言就是应用最为广泛的一种人工语言)进行一番比较也许能给我们一些工作上的启示。
语言的设计者
自然语言是在无数多人群之间的碰撞和交流之间产生、发展、筛选、淘汰之后形成的,好比是“市场经济”的产物。
计算机编程语言(以下简称“编程语言”)则是“计划经济”的产物。它所使用的词汇、规则都是事先由一位“上帝”(语言的设计者)策划好的。
词汇及其分类
“词”是自然语言中的基石,它们是具有语义的最小独立单位。
在编程语言中对应的东西就是token。Token是编译程序中的术语,它包括外形像英语单词的 Word,以及“=, +, -, *, /, ==,>, <, (, ), ……” 之类的符号。
从信息处理的角度来看,“词”和token都是“符号(Symbol)”,它们可以被我们“用来”映射到各种实体或者概念上去。根据一个符号所映射到各种实体或者概念的性质来把它们进行分类。
语言学家把自然语言中的词划分为许多类:名词、动词、形容词、副词、数词、连接词、感叹词、………。我们应该注意到,它们不是在同一级别上的。
名词 和 动词: 是最重要的。它们直接反映了我们对世界上形形色色的事物以及这些事物之间的相互作用。
形容词、副词、数词、则是第二级的。它们只对事物以及这些事物之间的相互作用起修饰作用。
剩下来的连接词、感叹词、………则是第三级的。它们主要起语法的作用。(用来提示语句内部的结构性信息,起连接作用、用来表述“词”与“词”之间的关系)
与之对应,在编程语言中,可以把token划分为:
l 命令:运算符、子程序名。它们对应于自然语言中的动词。动词的“价”则相当于编程语言中的命令、运算符、子程序所需要的“变元(arguments)”的个数。在编程语言中,有时某些“变元”可以省略不写,而用预先规定的“缺省值”代替。在自然语言中,也有类似的情况,但是缺省的东西要根据上下文来补充。
自然语言中存在一些“泛义动词”,例如汉语中的“打”,“搞”,“干”……,英语中的“get”,“take”等。它们的进一步的具体含义要由这些动词所涉及的对象来确定。例如:“打毛衣”中的“打”应理解为“编织”, “打篮球”中的“打”应理解为“玩”, “打开水”中的“打”应理解为“取得”,等等。
l 在面向对象的编程语言中,也有类似的“动态绑定(Dynamic Binding)”机制:一个函数名或者子程序名字的具体含义要在“运行时”依据所涉及对象在当时的指的类型来决定。
l 数据:常数、变量名。它们对应于自然语言中的名词。
l 其他:起连接作用、用来表述token 之间的关系的符号,例如if, then等等。它们对应于自然语言中的连接词、感叹词等等。
动词和名词之间的互换性
在自然语言中,有一个引人瞩目的现象,那就是“名词和动词之间的呼唤性”。这是因为,“词”或者token是用来表达“概念”的,而一个概念往往有多种侧面。所以自然语言中常常出现用同一个“符号”来表达不同的侧面的现象。举例来说:
“钉”本来是名词,但是可以转化,作为动词来使用:我把画钉在墙上。
“锁”本来是名词,但是可以转化,作为动词来使用:我用锁把门锁上。
古汉语中这样的例子更多。“叔”可以转化为“认……为叔叔”,“尘”可以当作“弄脏”,“污染”的意义来使用。
反过来,动词也往往可以转化为名词使用。比如,“偷”是动词。但是在“偷是不对的。”这句话中的“偷”却是一个名词,因为这句话也可以说成:“偷这种行为是不对的”
在计算机编程语言中,也有类似情况。在declaration(声明)中,函数、子程序名表现为“名词”,但是在执行语句中,他们就成了动词。例如在C语言中:
double x,y;
double sqrt(double); /* sqrt 在这里以名词的面貌出现*/
…………….
x = sqrt(y); /* sqrt 在这里以动词的面貌出现*/
词类的判断
从语法分析的角度看,对词或 token 进行分类的依据是它的语法功能。从语言使用者的角度看,则是他们的使用方式。因此如何对词或 token所属类别进行判断乃是一件至关重要的事情。
不管在自然语言中,还是在编程语言中,判断一个词或者 token 的类别的办法基本上是两种:词典 和 词本身所携带的形态标志。
词典中提供的信息
在编程语言中,为判断一个 token 的类别而提供的“词典”有两种:
1. 一种是语言中“先验地”规定好了的外部词典。例如关键字和一些保留字。
2. 另外一种是编程人员(用户)临时定义的内部词典,这就是程序中的 declaration.
在自然语言中,基本上只使用外部词典。(在某些文件 [特别是有关技术标准的文件] 中,有时也在文件的开头部分定义一个“术语”集合,但是很少涉及词性的问题)。
例如中,市面上提供的英语词典对其中所收罗的词的词性都给出了说明。与编程语言不同的地方是:有相当一部分词具有多种词性。例如:字符串“increase” 既可以当作名词来使用,又可以当作动词来使用。
奇怪的是,汉语词典基本上都没有给出词性方面的信息。其主要原因大概是由于汉语中大部分的词都允许以多种方式使用,也就是说具有不止一种词性。这种现象在古汉语中标显得尤为明显。汉语中的这种“传统”的来源可能如下:
汉语是象形文字,最方便给有形的对象起名字。所以至少在汉语中“名词”最优先地得到发展。在古汉语中,由于为抽象的动作设计象形字比较困难,所以往往就把名词直截了当地转化为动词使用:“老”指老年人,老年人应予以“尊重”,所以就把它当作现代汉语中的“尊重”这一动词来使用。“幼”指婴幼儿,婴幼儿需要“爱护”,所以就把它当作现代汉语中的“爱护”这一动词来使用。于是就出现了“老吾老以及人之老,幼吾幼以及人之幼”以及与之类似的“君君臣臣父父子子”这类令现代人费解的句子。
词类划分的形式标志
如果能够从词或 token的外形(形式上的)特征就能判断出他是属于哪一类,那么无论从“书写者撰写”的角度,还是从“阅读者理解”的角度,都能够大大减少出错的机会。
在某些编程语言(例如Visual Basic)中,如果一个变量没有在任何地方加以声明,也可以从变量名字的外形上看出它的类型。例如:名字以%结尾的变量是‘整数’, 名字以&结尾的变量是‘字符串’,名字以&结尾的变量是‘浮点数’等等。
英语中,在某种程度上也有类似的机制,例如:以tion, ing 结尾的基本上是名词。以-lize 结尾的基本上是名词。以-ful 结尾的基本上是形容词。以-ly 结尾的大概是副词。
汉语使用方块字,没有办法添加尾缀,所以没有这样的形态标志。因此大家认为,这一现象给汉语的计算机处理增加了困难。不过话不能说得太绝对。在某些情况下,汉语还是有“形态标志”的。例如,在名词的前面加“很”“还”之类一般用来修饰形容词的副词,就是在“形态”上指出:后面的这个名词已经转化为“形容词”了。例子如:“同学们说我穿这条裙子很青春。”,“我们排演的这套节目还是很生活的。”,“他比林彪还林彪。”。
作用域
编程语言的名字都有“作用域(scope)”问题。这一点在语言设计中都作了明确、毫不含糊的规定。程序被划分为模块、分程序,它们是作用域的天然边界。
自然语言中当然有类似要求。章节、段落的划分,引号(“ ”,‘ ’)的使用也是名字的作用域的天然边界。但是与编程语言相比,并没有硬性的规定,读者往往要利用生活常识依据“语义合理性”来进行判断。
指针
自然语言中的指代词(你、我、他、它等等)好比编程语言中的“指针(point)”。但是自然语言中从不明显地交待:从现在起,“他”表示“张三”,直到遇见新的声明为止。每一个具体的代词指向何方要根据句子域句子之间的前后语义来联系来判断。
在为了处理自然语言而为计算机编制词典的时候,一个十分重要的问题是:我们把自然语言中的“词”看成是一个“概念(concept)”还是只看成一个“符号(symbol)”。字面上的一个词可以对应多个概念,例如“编辑”既可以指一种工作、职业,又可以指以这种工作为职业的“人”。目前这方面似乎仍存在不同的看法,但是从计算机处理的角度看,当然是看成一个“符号”为宜。这样就出现了如何判断某一个“词(符号)”指向何种概念的问题。自然语言中使用最多、最具有生命力的词大多具有多个“义项”。从这个观点看,多义项词 更接近于编程语言中的指针。
语句类型
动作语句
自然语言中,像:
税收人员 向 大家 宣传 税收政策。”
我 吃了 一块蛋糕。”
都表示某一主体采取了某种动作,因而改变了世界。这种句子围绕着中心动词“宣传”,“吃”而展开。这种“动作语句”显然对应于编程语言中的“命令语句”(赋值语句,子程序调用,带有副作用的函数调用等。)
如果使用编程语言中的形式来书写上述两个句子,结果就是:
宣传(税收人员,大家,税收政策)
吃(我,一块蛋糕)
子程序“宣传”有三个变元,所以“宣传”是三价动词。子程序“吃”有两个变元,所以“吃”是二价动词。
描述语句
自然语言中,描述句以静态的方式描写周围的世界,某种事物的存在,或者它的属性。在汉语中,最常见的是以“是”为中心谓词的描写句,例如:
她 是 近视眼。(健康)
他 是 小孩。(年龄)
他 是 高个子。(身材)
他 是 工程师。(职业)
……
可见,中心谓词“是”把句子分成左右两个部分。右边部分叙述了左边部分的某种属性。至于具体是什么属性,完全要依靠读者的知识来判断。也许把“是”称为“系动词”就是因为它的功能只不过是把左右两部分联系起来,或者说,只是指出左右两部分有联系,至于什么样的联系,则语焉不详。
由于系动词只起“语法上分割、语义上联系”的作用,因此它往往可以被省略(这时可以认为中心谓词是“Φ” )。
这人 Φ 黄头发。
你 Φ 傻冒。
在英语中也有类似情况,特别是在要求句子简短有力的场合:
You baby!
You silly boy!
编程语言中,与描述句对应的东西是 declaration 以及 declaration 中的“初值语句”,例如:
int x = 3;
John.Hair.Color = Yellow;
疑问语句
“你进来好吗?”,“3加5等于几?”这类疑问句似乎在编程语言中找不到对应物。其实是有的,就是包括函数在内的“表达式”。
计算机程序在运行过程中遇到包括函数在内的“表达式”时,就要计算这个表达式的值,也就是向计算机硬件、程序库、操作系统询问计算结果。
语境的动态变化
目前我们所使用的计算机都是基于冯·诺意曼模型的机器。其中最具有特点的就是“赋值语句对环境所施加的改变”和随时用来记录不断改变着的环境的存储系统(寄存器、堆栈、内存、外存)。正是由于这一原因,多年以来所发展出来的、针对静态环境的数学证明方法在“程序正确性证明”的问题上失去了效力。
自然语言中的“动作语句”既然和编程语言中的“赋值语句”相当,它也必然会产生同样的难题。以当前水平的机器翻译软件为代表的自然语言处理软件都是“没有记忆”的,并不把所处理的语句对环境的影响记录下来。
如果自然语言处理软件有这种记忆机制,那么它在处理以下句子
1. 孙武 是 春秋时代的 军事家。
2. 他说:“……”。
的时候,就会在处理完第一句后,在“情景堆栈”中记住:
现在有了一个最新被提到的人物:春秋时代的 军事家 - 孙武
于是在处理第二句时,就知道句子中的“他”就是这个“孙武”,由于他是春秋时代的人,所以“说”要使用“过去式”。
当然,这个例子太简单了。“情景堆栈”应该怎样设计,尚有待于探讨。但是这个问题是计算机理解自然语言时避免不了的。
小结
从以上讨论可以看出两点:
1) 作为信息传递的媒介,目前的计算机语言 和 自然语言 虽然在外表上有很大差异,但是在实质上的确有不少相通或者互相对应的地方。
2) 从最初的比较简单的计算机语言(例如初期的Basic)到后来越来越复杂的Fortran, C, C++,我们可以看到把自然语言中的一些机制逐步添加到计算给语言中的迹象。
自然语言与编程语言之间的区别
这个问题之所以值得研究是因为这一研究有可能帮助我们搞清楚计算机在处理自然语言时所遇到的困难的本质 以及克服这些困难的途径。
语句结构分析时语义的介入必要性
以上我们讨论了自然语言与编程语言之间的相似之处,也顺便指出了两者之间的一些区别。但是上面所说的这些区别不一定都是本质性的、或者根本性的。两者之间本质性的区别表现在:自然语言处理在许多阶段的工作中都需要涉及语义,需要语言之外的生活常识、社会与自然科学知识的支持才能完成。以下是其中主要的几个方面。
汉语句子的分词和词性标注
分词虽然可以在大部分情况下利用辞典和匹配的方法得到正确的答案,但是有时也需要运用语言之外、语境方面的知识。“乒乓球拍卖完了”应该读成“乒乓球 拍卖 完了”还是“乒乓球拍 卖 完了”的问题就是一个典型的例子。
编程语言中的token,除了“指针”以外,基本上都只属于一种类别,没有任何含混之处。然而,自然语言中的词却可以有多种词性,汉语尤其如此。但是在一个具体的句子中,每一个词的词性确是唯一的,因此就存在着如何根据这个词的周围的环境来判断其词性,这就是词性标注问题。计算机可以从统计规律出发“胡蒙乱猜”,并且期望能够在大多数情况下得到正确的结果,但是像上面所举例子:“把收集到的数据记录在数据库记录中”就很难保证正确判断其中的两个“记录”的词性。
句子结构分析
我们都知道,句子从外表看只是一维的“字词流”,但它是有它的内部结构的。分析或者理解一个句子的时候,第一件事就是要从它的一维的字词流中提取句子的内部结构。正是在作这件事的时候,出现了自然语言和被称之为“形式语言”的编程语言的本质区别。
在对计算机编程语言进行语法分析的时候,由于语句中每一token均由确切的含义,语言的语法大多限定在上下文无关文法的范围之内,编译器只需要拥有语句中的“形式标记信息”和在语言内部预先定好的一些规则就可以完成任务,而且所得结果是唯一的,用不着利用与外部世界有关的知识。编译器在语法分析结束以后进入代码生成阶段时,才要涉及语义问题。
反之,在分析自然语言中的句子的时候,即便是分词、词性判断等标志性信息均已完备的情况下,也往往要借助“语义合理性”方面的判断。而“合理与否”则要依靠语言之外的生活常识、社会与自然科学知识。举例来说,
她 想 穿 将军 的 大衣。
她 想念 穿 大衣 的 将军。
着两句话的形式都是:“名 动 动 名 ‘的’ 名”的格式。但是内部结构完全不同。我们在阅读这两句话的时候,可以毫无困难地分别把它们理解为:
她 想穿 (将军 的)大衣。
她 想念 (穿 大衣 的)将军。
这是因为我们有“人可以穿大衣,但是大衣却不能‘穿’人”的常识。没有生活常识以及运用这种常识的能力的计算机,仅仅凭语言知识和语句中的形式标志显然是没有办法完成这种句子的结构分析的任务的。
上下文相关
自然语言中即使其最简单的“义项选择”问题,也往往要根据上下文、乃至整篇文章以外的知识(社会生活常识、自然科学与专业知识)来判断。
例1:汉语中,“踌躇”是“犹豫不决”的意思(如说“踌躇不前”)。但是如果后面紧跟着“志满”(踌躇志满),意思就来了一个一百八十度的大转弯,变成“从容自信”了。
例2:如上所述,汉语中的“打”字是一个泛义动词,在“打毛衣”,“打篮球”,“打水”三种说法中分别理解为“编织”,“玩”,“取得”。这一要求可以通过对“词语搭配关系”的考察来解决。
在计算机语言中,也有类似情况。例如用来打开文件的open 就是一个泛义动词,在打开某一具体文件时,到底要使用哪一个 application,则要看这个文件的类型是什么?例如,如果文件名的后缀是 .doc, 就使用 MS Winword, 如果文件名的后缀是 .txt, 就使用 Notepad.
然而, 在自然语言中,有时更复杂一点。例如:在以下这句话中:
渔民用竹篙打水,想把鱼赶进渔网中去。
“打”自由应理解为“击打”的意思。而在
渔民用木桶打水洗菜做饭。
中的“打”又依然应理解为“取得”的意思。换言之,一个泛意动词的语义不仅取决于它的宾语,有时还得看看“施主”和“工具”是什么?
叶圣陶先生在他所写的一篇文章《据理论而言》中也提到一个例子:
解放前“某大学招考新生,国文的作文题目是《防民之口甚于防川论》。很有些应试的同学解错了题目,做出来的文字牛头不对马嘴。”
之所以会这样,是因为“防民之口甚于防川”这句话可以有很多解释:
防民之口其困难甚于防川
防民之口其重要性甚于防川
防民之口其……甚于防川
防民之口其危险甚于防川
这些“应试的同学”大概都理解为前面两种。如果他们看到《古文观止》里收录的《国语》里的那篇“召公谏历王止谤”的文章中这两句话的下文:
防民之口,甚于防川。川壅而溃,伤人必多,民亦如之。
就知道应该按照相反的方向来理解了。
自然语言中这种“必须依靠文章以外的知识来解读 作为符号的“词”的指向”的要求, 给计算机处理自然语言的工作带来了重大困难。
自然语言的“简略性要求”
请观察以下这幅漫画:
虽然这只是寥寥几笔,离开相片或者真实的人像相去甚远,但是当今社会上大多数中国人都能一眼看出这就是 聂卫平。因为它抓住了 聂卫平 有别于其他人的特征。不过,能够做到这一点的人一定是预先看见过 聂卫平 的相片、录像或者他本人。换句话说,看得出这幅漫画画的是谁的这些人,必须在脑子里预先已经有了与聂卫平面貌有关的“知识”,这幅漫画不过是“勾起了”他们脑海中已有的印象而已。
类似地,人们讲话时的首要目标并不是要去描述和传递巨细无遗的情景,而只是在对方已有的知识背景之上做一些补充,使得对方把你的词句和它已有的知识加起来,能够凑成一幅完整的图景。超过这一要求时,别人就会觉得你罗嗦;过于简单则会使对方误会或者不知所云。从这一点看,自然语言理解过程得着一侧面和“猜谜语”是相通的。汉语历来有讲究“凝练”的传统,因此我们看到的汉语句子常常只是“海面上的冰山”。
最普遍的例子是“名词的串接”。例如:“傻瓜相机”这个词组可以有多种理解,看你省略的字眼是什么:“傻瓜发明的相机”,“傻瓜才使用的相机”,“为傻瓜而设计的相机”……。“鲁迅回忆录” 这个词组也可以有多种理解:“鲁迅自己撰写的回忆录”,“某某人撰写的关于鲁迅的回忆录”。“海鲜酱油” 可以理解为:“以海鲜为原料制成的酱油”,也可以理解为:“吃海鲜时使用的酱油”。读(听)者需要根据当时当地的语境和自己的生活经验和常识来选择其中的一种。
标语、标题中的字眼也是常见的“简略说话法”的例子。比如说:我们在出租车的座位上常常看见的:
停车等候请付押金
实际上是
停车等候 请 付押金
------------------------------------------------------------------------------------------------
如果乘客中途下车办事,要求司机 , 乘客预先向司机支 。
显然,只有把被省略的词语适当地补上之后,才谈得到句子结构的分析。
可是,除了为了避免罗嗦、使语言简洁的目的以外,还有一种情况是“有意模糊”。我们注意到,实际生活中,我们使用语言的方式可以分成两大类。
l 一种是力求精确、完整地传递信息。科学、法律方面的文献可以作为这一类的代表。
l 另一类是:有意不把话全部说明白,给读者留下想象的空间。
编程语言当然属于第一类,而文艺领域的文章大多属于第二类。文艺作品的作者在撰写他的文字时,一方面希望利用这些文字传递信息,但与此同时,还期望勾起读者的联想,希望读者利用自身的知识、处境、心情……进行补充。因此这种文章就要写得“含蓄、凝练”,给读者留有“再创造”的空间。读者的主动参与往往调动了他的浓厚兴趣。(这也是为什么比较含蓄的音乐作品、广播剧可以反复聆听;而一览无余电视剧很少有人看两遍的原因。)
语句分析的“终极”在哪里?
计算机语言的编译器在分析计算机程序中的语句时,最终总是要分析到语法规则中所规定的“终极符(terminator)”为止。
在自然语言中的情况比较复杂。汉语句子中的终极符显然不是汉字,但也不一定是“词”。在“他胸有成竹”这句含有成语的话中,“胸有成竹”应该是终极符,因为你不能再继续把它进一步分解了。再分解就真的变成“他的胸腔中有一根竹子”了。同样地,“大家奋力力救火”中的“救火”也是终极符,因为你一定不能再进一步把“救火”当作“动宾短语”去进一步分析。“救火”中的“救”与“火”不过是由“抢救生命与财产于烈火之中”这句话里提取出来的两个“特征字眼”而已。
英语没有汉语中的分词的麻烦,但是也有类似问题。许多介词短语是一个整体,不能继续分解。比如说,当讨论某人的家庭情况时,有人回答:“He is on the street.” 这“on the street”就应该整体地作为表示“无家可归”的一个词组来理解。
话又说回来,要是孩子的父亲问母亲:“孩子上哪儿去玩去了?”母亲若回答“He is on the street.”那就表示这孩子真的是在街上玩。可见,一个词组应不应该作为“终极符”,还得要看语境。这进一步增加了自然语言理解的复杂性。
规则与习惯
计算机编程语言中,只要是符合语法规则的句子就都是合法、并且可以使用的。但是在自然语言中,却要看‘习惯’。你虽然在离开家时可以说:“我用‘锁’把门‘锁’上”,但在回家时,却不能用类推的方式说:“我从兜里掏出‘钥匙’来‘钥匙’门”。因为(社会上)没有这种说法!(这大约是因为后面这种说法太‘绕口’)。反之,看起来虽然不大合乎语法,但是大家说惯了,却是允许的。
隐含与联想
我们可以把“自然语言”进一步划分为“技术语言”和“文化语言”两种。前者的例子如:技术资料,法律文件等。后者的例子如:诗词、小说等。两者的主要区别是,“文化语言”常常含有“言外之意”,并且引起或者要求读者(听者)发挥“联想”的主观能动性。这个要求显然离开当前计算机的水平更加遥远,所以在此不再展开讨论。
绕口与否 及 听觉特性
自然语言首先是为了“说和听”,其次才是为了“写和读”而发展起来的。这样一来,句子的顺不顺口,文章的“抑扬顿挫,音调铿锵,朗朗上口”就成了一种不可忽视的要求。有时候,为了满足这一要求,甚至会“以声害意”,以颠倒语序为代价。这种现象在诗歌中当然比较多(例如杜甫的“名岂文章著,官应老病休”),但是在口语中也有出现。鲁川教授就曾经指出:我们从来不说“制 电影片 厂”而是说成较为顺口的“电影 制片厂”,是因为“2+3”比“1+3+1”结构读起来更为顺口,虽然前者在语法上较为合理。由于同一原因,汉语中偏好使用长度为四个字的短语。(所以汉语中的成语绝大多数是四个字的,如果不够四个字,往往也要加进一两个虚字,凑成四个字。)可是,过去我们经常说的“百分之百”在说广东话的人群中遇到了困难,因为广东话中没有‘zhi’这个音。于是他们把“百分之百”改说成“百分百”。又由于改革开放以来,以广东省为代表的中国南方地区在经济发展上处于有影响的位置,使得电视台上的主持人和播音员也都改说“百分百”了。
反过来,计算机编程语言完全是为了“写下来供计算机执行或者供人阅读”的。所以不存在上述需要朗读而带来的“听觉性”问题。
视觉特性
汉语使用象形字,因而在“字”和“词”这一级就有视觉特性的问题。我们初中时就读过李煜的词《浪淘沙令》中的“帘外雨潺潺,春意阑珊。”后来看见老舍先生批评这种句子说:从来就不知道雨怎么个“阑珊”法,春意又怎么个“阑珊”法,觉得老舍先生讲得对。可是又觉得,虽然从来没有去词典上查过“潺潺”是什么意思,但是当初读李煜的词时并没有觉得费解。但讲不出道理。
最近看到王蒙在《道是词典还小说》这篇文章中解释了这个问题:
问题不在于“潺潺”本身的含义,对于我来说,“潺潺”的说服力在于字形中放在一堆的六个“子”字,它们立即使我想起了流水上的丝皱般的波纹。从上小学,我一读到“潺潺”二字就恍如看到了水波。
除了“字”和“词”这一级以外,自然语言在段落、章节的划分上也有“语义”上的含义,并且隐含着各种代词的“作用域(Scope)”划分。
计算机编程语言中,虽然在“段落”一级上应该力图在视觉上显示程序的嵌套结构。以利于“人”的阅读。但是这种做法对计算机好毫无意义。“作用域(Scope)”划分也应该有明确的declaration来规定,而不能是隐含的。
小结
传统的计算机语言 和 自然语言的上述差别是造成计算机处理自然语言遇到重大困难的主要原因。人之所以对自然语言应付如裕,是因为人拥有知识(包括社会生活常识以及各种专业知识),并且具有应用这些知识来“解读语句(猜测语义)”的能力。
事实上,即便是人,由于文化程度和专业领域的不同,如果他听(读)到语句在解读时所需要的知识超过了他的知识范围,也会产生理解上的困难。因此,人们在通过语言相互交流时,还需要遵从某种协议。
语言交流中的普适性协议
人与人之间通过语言进行交流时,人人都自觉或不自觉地遵守以下普遍使用的协议:
1. 发话一方首先要判断对方的语言能力,并据此选择可以使用的词语和句式。如果对方是小孩,使用的词语和句式就和对方是成人时不一样。
2. 其次要估计对方的知识水平、专业范围。不能使用对方无法理解的词语或概念。例如,如果对方是考古专家,你就不能和他深入地探讨其他专业领域的问题。
3. 发话方所进行的以上的两种估计不可能完全正确。因此,听(读)方要随时判断对方所说的句子是否在自己所能领悟的范围内。如果不是,就要要求对方解释或者换一种易懂的说法。
4. 发话方所说的话如果小有纰漏,听话方应该有能力纠正,“正确地加以理解”。
在人和计算机讲话时,出现了新的问题。一般来说,人(用户)没有和计算机通过自然语言讲话的经验,因此不知道怎样估计计算机的语言能力和知识水平。在这种情况下,就要研究如何让计算机主动向对方以适当的形式介绍自己的接受能力。这是一项具有挑战性质的任务。
上述协议中的第三点格外重要。传统的“全自动”机器翻译程序会忽略了这一要求,可以说是一个误区。
两栖语言-面向计算机的“受限(标注)汉语”
要求计算机拥有一般人所具有的知识以及 具有应用这些知识来“解读”自然语言的能力,目前还不现实。因为这种要求有点像希望对古代社会生活情况一无所知而又仅有小学语文水平的人去阅读处处引用“典故”的古籍那样。不过,语文老师早已想到了解决这个问题的方法:改写 和 添加注解。
这一思路当然也可以用来帮助“没有社会生活常识和语言水平很低的”计算机。这就是提出“面向计算机的受限(标注)汉语”这一概念的由来。
问题在于:谁来进行这种 改写 和 添加注解 的工作?答案是:开发“受限(标注)汉语写作器”,让计算机帮助“人”来作这件事。
北京信息工程学院在承担国家“九五”重点科技攻关项目“中文信息处理及产品开发”中的“受限汉语技术及其产品开发”专题工作所开发的“受限汉语写作器”最后产生出来的语言文本有两种表现形式:
l 给人看的文本。这种文本从外表上看和一般的文章没有什么差异。
l 给计算机看的文本。这是在上一种文本中添加了供计算机阅读的“标志”
这种带“标志”的文本 和 当前正在如火如荼地发展着的XML语言 有密切的联系。这些“标志”之除了每个语句中各个语言成分的“语义角色”和它们在“语法意义上所处的位置”。有关情况请参见有关资料,再此不予赘述。
可是,不管怎么说,改写 和 添加注解 终究是额外的工作,而“用计算机处理自然语言”的初衷本来就是为了节省人力。这两者岂不是“南辕北辙”吗?为此,我们应该从用户需求的角度来探讨一下。
两种用户需求
信息收集者
在互联网、信息爆炸时代,如何利用计算机从浩如烟海的以自然语言表达的文章中找出自己所关心的、对自己有价值的文章,是很多用户面临的问题。
由于计算机在自然语言理解方面尚未取得有价值的进展。因此用户只能在信息判断的准确性、详尽程度方面降低要求。
信息发布者
反过来说,信息发布者当然他所发布的信息能够以最大的精确性得到尽可能多的人群(包括不同国别的人群)的注意和理解。为此,他可以而且愿意付出一些代价,以“受限”和“标注”的方式发布自己的信息。
制定“受限(标注)汉语”规范的思路
我们这里所说的“受限(标注)汉语”是“面向计算机的受限(标注)汉语”。换言之,付出“简易”的代价之后,期望达到的目的是使“智能相当低的”当代计算机有能力加以处理;与此同时,在人类读者面前依然保持原来自然语言的风貌。
显然,“面向计算机的受限(标注)汉语”是否有实用价值,取决于:
l 我们能否为这种“受限(标注)汉语”设计出既有充分表达能力,又便于计算机处理的语言规范。
l 开发出一种足够好的帮助人们书写这种语言的工具---
大家知道,法律有两种表述形式:
l 案例法(Case Law),属于“大陆法系”,“罗马法系”
l 法典法,属于“英美法系”或“普通法系”。
自然语言的规范也有这样的两种。小孩学习自己国家的母语时肯定是根据“案例法”。中国人过去学习英语的传统办法是“法典法”。自从《英语900句》一书风行以后,很多人体会到了使用“案例法”学习外语的好处。
刚开始学习编写计算机程序的时候,我们多半是对照着程序语言手册上的规定一句一句地写(法典法)。对于年龄大、记忆力差的人,常常感到许多细节记不住,就希望找一个或者一段别人已经写好的程序拿来“修改”,觉得既省事,又少出错。(案例法)
那么我们制定受限(标注)汉语规范的时候,应该采取哪一种办法呢?
我们曾经想过,能不能定义一个汉语子集,使得这个子集内的语句像计算机编程语言那样满足某种上下文无关文法,这样一来,计算机处理编程语言的技术不是就可以用来处理这种受限(标注)汉语了吗?。(这就是一种“法典法”的道路。)
这条道路给我们带来的困难是:自然语言的内涵比编程语言要复杂得多,为它设计一个满足上下文无关文法的子集有“老虎吃天,无从下嘴”的感觉。更为重要的是,即使设计出了这样一套语法,一般人也一定无法使用。理由很简单,因为人们学习自己的母语时,不是走的这一条道路。觉得多数说汉语的人根本没有“汉语语法”的概念。
因此合理的办法是采用“案例法”。也就是在计算机中存储足够多的模板和例句然后引导用户“依葫芦画瓢”。这种办法用户容易接受,更为重要的是:由于模板是事先定义好的,它的内部结构,各部分之间的语义以及相互之间的联系也是预知的。因此用户在“选句填词”的过程中,无需用户费心,系统就可以自动产生大量的标志性信息。
但模板法也有困难。首先是如何进行引导?其次,自然语言(特别是汉语)语句中的一部分又可以以递归的方式展开为另外一个句子。对于“一级”语句,我们可以用模板引导的办法加以限制,但对于以递归的方式衍生出来的第二、第三级句子就没有办法再这样做。限于篇幅,这两个问题留在别的地方去讨论。
汉语规范 与 汉语.DTD
我们经常在报刊上看到希望使用“规范汉语”的呼吁。但是,怎样的汉语才算是规范,却没有一个客观的标准,于是产生了“你说我的语言不规范,我却认为很规范”的争论。考虑到语言的进化过程是不可阻挡的,而在进化过程中又同时进行着筛选、淘汰的过程,这个问题的解决恐怕还得依赖于技术发展的反作用、“技术标准”以及相应的标准的定期更新。
举例来说,长期以来,在我国人名、地名用字没有标准,没有范围,有些地区甚至可以自己造字。但是在信息处理用汉字国家标准 GB2312 颁布以后,许多家长再给自己的孩子取名的时候,都知道最好在 GB2312 所收罗的汉字集中选字,否则的话,在计算机中找不到孩子的名字将使孩子终生受累。
类似地,计算机中的“汉字库”,OCR软件,汉语拼音输入方法,教育部在小学推广的“笔划”输入法,天天在对广大的使用计算机的人群实施着规范化的培训。
由此推想,如果有了计算机能够接收和处理的汉语规范,并且得到实施,那将对鼓励人们使用规范化的语言起很大的推动作用。因为,如果你不遵从者以规范,不仅有一种客观的手段来判断你的“错误”,而且你写的文章计算机无法处理,因而你的思想就不容易通过网络得到迅速传播,也不易得到他人的广泛理解。
那么,我们所设想的这种“规范”的形式应该是怎样的呢?也许第一步最合适的形式是DTD文件。
前面说到,北京信息工程学院所开发的“受限汉语写作器”最后产生出来的给计算机看的文本中添加了供计算机阅读的“标志”。这种带“标志”的文本 和 当前正在如火如荼地发展着的XML语言 有密切的联系。这些“标志”之除了每个语句中各个语言成分的“语义角色”和它们在“语法意义
展开阅读全文