编程语言由某个个人或组织发明并且负责维护。以 C++ 为例,它的发明者是 Bjarne Stroustrup,它现在由 C++ 标准委员会维护。从 C++ 98 到 C++ 03,再到 C++ 11 和 C++ 14,语言标准的变化是以年为单位的迁越过程,且新版本大致做到了对旧版本的前向兼容,只有少数废弃掉的特性。
20 世纪 80 年代之前的主流方法都是规则系统,由专家手工编写领域相关的规则集。那时候计算机和计算机语言刚刚发明,从事编程的都是精英学者。他们雄心勃勃,认为只要通过编程就能赋予计算机智能。代表性工作有 MIT AI 实验室的 BASEBALL 以及 Sun 公司(2009 年被甲骨文公司收购)的 LUNAR,分别专门回答北美棒球赛事的问题和阿波罗探月带回来的岩石样本问题。这一时期还有很多类似的问答系统,都是主要依赖手写规则的专家系统。以BASEBALL 为例,其中的词性标注模块是这样判断 score 的词性的:“如果句子中不含其他动词,则 score 是一个动词,否则是名词。”接着该系统依靠词性上的规则合并名词短语、介词短语以及副词短语。语法模块则根据“若最后一个动词是主要动词并位于 to be 之后”之类的规则判断被动句、主语和谓语。然后该系统利用词典上的规则来将这些信息转化为“属性名 = 属性值”或“属性名 = ?”的键值对,用来表示知识库中的文档以及问句。最后利用类似“若除了问号之外所有属性名都匹配,则输出该文档中问句所求的属性”的规则匹配问句与答案。如此僵硬严格的规则导致该系统只能处理固定的问句,无法处理与或非逻辑、比较级与时间段。于是,这些规则系统被称为“玩具”。为了方便表述这样的规则逻辑,1972 年人们还特意发明了 Prolog(Programming in Logic)语言来构建知识库以及专家系统。
纯粹的规则系统已经日渐式微,除了一些简单的任务外,专家系统已经落伍了。20 世纪 70年代,美国工程院院士贾里尼克在 IBM 实验室开发语音识别系统时,曾经评论道:“我每开除一名语言学家,我的语音识别系统的准确率就提高一点。”① 这句广为流传的快人快语未免有些刻薄,但公正地讲,随着机器学习的日渐成熟,领域专家的作用越来越小了。
① 原话是“Every time I fire a linguist, the performance of the speech recognizer goes up”。
实际工程中,语言学知识的作用有两方面:一是帮助我们设计更简洁、高效的特征模板,二是在语料库建设中发挥作用。事实上,实际运行的系统在预处理和后处理的部分依然会用到一些手写规则。当然,也存在一些特殊案例更方便用规则特殊处理。