面向语言的程序设计在中文信息处理中的应用

2023-01-02

1 引言

自然语言处理与理解, 隶属于人工智能研究领域, 是以计算机能够自主处理、理解人类自然语言为目的的一项研究, 其研究理论与方法, 大致可分为“基于规则的理性主义”和“基于统计的经验主义”两种。前者历史悠久, 但因人类自然语言语法规则的多样性、模糊性, 及其语言机制的复杂形成过程, 其研究成果, 至今为止, 并未取得突破性的进展。后者以实用主义之精神, 建立了大规模语料库, 并随着计算机硬件技术、数据库和网络技术的发展, 在许多领域实现了有价值的应用。但总体而言, 做为代表自然语言处理技术的研究水平的典型应用——机器翻译, 迄今为止, 并未达到人们可接受的准确率, 要想完全实现机器的全自动翻译, 在将来可预见的时间内, 尚难实现。

笔者提出的myLang亦遵循实用主义之精神, 但有别于“基于语料库的统计经验主义”方法, 虽然可以规为“基于规则的理性主义”之列, 但与传统理性主义企图百分百地完美的解决问题不同, m y L a n g不描述自然语言中所有的语法规则, 而是追去一种残缺之美, 试图在一个受限的语言环境下, 定义自己的一门领域语言, 实现特定领域的规则主义。

2 程序语言理论

计算机程序设计语言, 经历了从机器语言、汇编语言到高级语言的发展历程, 代码的可读性依次提高, 表达形式与人类自然语言也逐渐接近。程序设计方法学也经历了从面向过程的程序设计, 到现今大行其道的面向对象程序设计, 其思维方式亦越发接近人类习惯。

但是, 计算机程序设计语言与人类的自然语言有本质上的区别, 按乔姆斯基的文法理论, 程序设计语言通常只满足2型文法, 即上下文无关文法, 而自然语言则是0型文法, 即无限制文法。文法级别越高, 其描述语言的范围越窄, 规则越容易形式化描述, 当然, 其语言分析的自动化实现也越容易, 效率越高。与程序设计语言不同, 自然语言的语法规则几乎是无穷的, 且必须依靠上下文来消除歧义, 所以, 其计算机的自动化处理难以实现。然而, 如果我们将自然语言限制在某一特定语境, 并对语言元素稍加规定, 对其表达形式加以限制, 它亦可以满足1型文法 (即上下文相关文法) , 甚至2型文法, 此时, 这一特定的自然语言子集就是一个受限语言, 同时, 满足此一文法的语言是可以比较容易被计算机自动处理的领域专用语言。最常见的领域专用语言是用于关系型数据库查询的结构化查询语言 (SQL) 。

传统上, 一门计算机语言的实现, 或者说, 此语言的处理理解程序——编译器——的构造, 是专业难度极高、工作量极大的一项工程。所以, 若想将领域专用语言有效地用于工程实践, 譬如, 用于中文信息处理, 必须设法降低此项工作的难度与复杂度, 为此, 我们需要找到一种方便的记法 (Notation) 。与其说, 我们在创建一门新的语言, 不如说我们在创建一种新的记法。一种好的记法, 可以更方便地向计算机表达我们的思想, 缩小“人的表达”与“机器的形式化描述”之间的差异。

正则表达式 (Regular Expression) , 其原意为描述各种文本模式的一种记法, 因为其强大的符号表达能力, 我们对其稍加扩展, 即可成为一个威力强大的符号描述和处理工具。

一个正则表达式本身就是一个字符序列, 它定义了一集能与之匹配的字符串。大部分字符只是简单地与它们本身相匹配, 除了一些称为元字符 (Meta-Character) 的特殊字符, 它们分别表示重复、成组、选择或位置。如表1所示。

3 myLang元语言的实现思路

借助于正则表达式的强大描述能力, 并加以扩充, 我们可以设计一种元语言 (即定义语言的语言) , 暂且称之为M y L a n g。

M y L a n g需具备两大基本功能:

(1) 定义一门新语言语法的能力。即规定被定义的语言 (设为L语言) 中, 什么样的记法是合乎语法的, 什么样的记法是非法的。

(2) 解释此L语言的能力。即能够“读懂”符合L语言语法的文本串。

第一个功能的实现, 计算机业界已有现成的技术与经验。最流行和通用的, 莫过于词法分析工具L e x和语法分析工具Y a c c。Yacc功能强大, 然而其相应的yacc文件 (通常以.y为后缀) 语法过于复杂, 且此工具的目标只是为了生成L语言的词法、语法分析程序, 要完成L语言的处理任务, 还有生成目标语言、代码优化等步骤。

为此, 针对汉语是连续的字符串这一特点, 笔者提出一种以“正则表达式”为基础, 以一个正则表达式来描述X语言中的一个合法的句子, 并做如下扩充:

(1) 因一个正则式只能独立地描述一个合法的文本串, 需要增加对上下文相关信息的记忆功能。例如:针对形如“9:0 0 a m”的正则式, 可能会会出现在多个句子中间, 于是, 可以将其定义为一个类似于“短语”的概念, 使其可以在多处复用。

(2) 增加数据持有 (Hold) 的功能, 即类似“变量”的概念。其目的和作用在M y L a n g的第二大基本功能中体现。

MyLang语言的第二大功能:“读懂”L语言文本。这是一个比“编译L语言程序”宽松得多的定义。传统的编译器将源语言程序翻译成目标语言程序, 即可执行的指令串。我们大可不必如此, 首先, 我们可以将L语言翻译 (转换) 成另一门成熟的高级语言 (设为D语言) , 再借助于现有的成熟的编译技术将其编译成可执行程序;其次, 并非所有的语言文本都需要是可执行的程序, 譬如句子“查找学生表中年龄大于24岁的所有学生的姓名”, 经处理后, 只需得到

tables={学生}

shows={姓名}

conditions={fields[年龄]>24}

这样的属性对, 即可认为, 已经“读懂”了此语句, 后续工作可以借助于已有平台 (如SQL查询接口) 去完成。

那又如何得到这样的属性对呢?这其实就是一个将“正则式定义”与一个具体的句子相匹配的过程。类似于L I S P语言中列表 (A x C) 于 (A B C) 的匹配, 其结果是变量x的值等于B。对于一个符合规则的句子, 运用合一算法, 总是能找到一个范围最广的匹配 (称最广合一, Most General Unifier) 。

(上图摘自太平洋电脑城http://www.pconline.com.cn/product)

4 应用举例

数据库查询的自然语言接口是MyLang最广泛的一个应用领域, 譬如天气查询语句

“广州市明天的天气预报?”,

可定义成形如

“{city}市{date}的天气预报”,

通过匹配, 获得

date={明天}

city={广州}

即可实现汉语查询接口。

电脑城选配机查询是一个更复杂的应用, 现有的查询接口如下图所示:

其界面过于繁琐和僵硬, 可运用MyLang技术提供类似如下自然语言查询接口。

“我需要一台笔记本电脑, 内存512m以上, 带无线网卡, 硬盘至少40G, 价格不超过8000元。”

通过匹配每一个子句 (逗号格开) , 可获得如下属性对:

Type=笔记本

5 后记

要完全实现一个通用型的M y L a n g, 目前尚有许多工作未完成。但是, 此种方式可以为“中文自然语言”处理提供一个比较有效的实现途径, 笔者亦将更进一步寻求构建一个可用的MyLang集成开发环境。本文权当抛砖引玉。

摘要:软件工程中的“领域专用语言”, 与自然语言处理中的“受限语言”, 是从两个不同的研究领域, 走向了同一个目的地, 所谓殊途同归。本文在面向语言的程序设计方法学的指导下, 提出了一种元语言 (Meta-Language) 的设计:myLang, 试图实现两者的有效结合, 为中文信息处理提出了一种可操作性强的新实现途径。

关键词:面向语言的程序设计,领域专用语言,自然语言处理,myLang

参考文献

[1] 刘群, 等译. (美) James Allen.自然语言理解[M].北京:电子工业出版社, 2005

[2] 徐波, 陆汝钤等. 类自然语言理解和知识获取[M].中文信息处理若干重要问题.北京:科学出版社, 2003:229-245.

[3] 邢公畹, 等译. (美) Noam Chomsky. 句法结构[M].北京:中国社会科学出版社, 1979.

[4] 裘宗燕, 译. (美) Brian W. Kernighan, Rob Pike. 程序设计实践[M].北京:机械工业出版社, 2000:169-194.

上一篇:试论学生英语口语能力培养的方法下一篇:低渗透气井不稳定试井解释压力异常现象分析