人工智能知识推理--大数据与深度学习之下,不应该被抛弃的 ...
admin
2023-10-17 17:42:11
0

一种基于汉语类自然语言的知识表示及逻辑推理方法研究

本文基于经典人工智能的一阶逻辑、产生式系统等思想,试图仍用经典的人工构建智能模式的方法,设计知识表示、逻辑推理以及机器学习为一体的综合系统,用于智能人机交互、智能机器人系统、自然语言交互等....(因为,在大数据与深度学习盛行的今天,经典的人工智能方法或许并不是毫无价值,在知识表示和逻辑推理等方面,或许经典的方法我们依旧没有尝试到机制,甚至远远没有,而深度学习或许很长一段时间之内,仍无法完美解决高效推理、高效学习、高效交互的智能系统问题....)

...................................


近年深度学习技术取得重大发展,甚至改变了整个人工智能领域的技术发展方向,深度学习通过构建大规模的神经网络,搜集海量的信息资源,经过训练后的神经网络可以在某些领域有很出色的表现,如语音识别、图像识别、自然语言处理等领域,该方法的特点是不再需要人为建立结构化的知识表示系统,知识是经过海量信息训练后直接融合在网络中,这使得经典的知识表示和逻辑推理等思想在人工智能领域的作用逐步弱化。

然而,深度学习终究不能解决人工智能的所有问题,以其在自然语言处理领域的表现为例,成功的应用主要是机器翻译和自动知识问答等领域,而机器翻译相当与对不同语言空间完成映射,知识问答相当与在问题空间和答案空间建立匹配模型,它们都不代表机器人真正理解了语言的含义,也无法进行深层的推理和思考。实际上,即使是经典的一阶逻辑、产生式系统等方法所具备的能力,仍是深度学习目前难以做到的,因为经典的规则推理系统能够动态学习规则,而且系统能在多项规则的关联作用下级联推理,挖掘信息的深层联系,虽然此类系统由于目前难以构建大规模的知识系统,限制了其表现水平,但其依旧是非常接近人类大脑思考机制的系统,所以仍是值得深入研究的问题。

本文方法最大的优点在于:系统用于知识表示、逻辑推理和语言交互所采用的是同一种载体—CQNL,当人类以该语言与机器人交互,并令其学习新知识时,只要符合特定的句法格式,该语句直接被记录进现有的语句库中即相当于完成了整个学习过程,当机器人对新的问题求解或执行新任务时,新录入的语句知识和原有的语句知识将无差别地被推理算法使用,且系统能自动解析出语句知识库中所包含的大量隐含逻辑信息,也就是说,一条合法的CQNL语句被输入的同时,也就被系统真正地“理解”了,这意味着系统具有非常强大的学习能力,而通过CQNL语句,同样可以对系统提出各种求解问题和下达命令,知识表示、逻辑推理和语言理解过程在本系统中被高度地统一了。最重要的是,本文提出的CQNL语法结构已经比较接近汉语自然语言形式,虽然句法类型比较单调,但经过文中的分析和验证,该语言系统已具备强大的知识表达能力,只要稍加训练,任何了解汉语的非专业人员均可以掌握该语言并且与系统进行交互,从而完成知识库的建立和命令的指定。


1知识系统构成

以汉语类自然语言(CQNL语言)为载体,实现了知识表示、逻辑推理、语言解析、智能规划等技术的集成,图1给出了CQNL知识系统构成,系统包括本元知识库、逻辑推理知识库和扩展知识库3部分:

本元知识库:本元知识是指系统内在认知的单词或逻辑,该部分知识是在代码级层面维护的,是永远不变、不可学习的,类似于传统推理算法中表示包含关系或逻辑关系的基本算符,在本系统中将对应各个关键的汉语单词,但本元知识不仅限于此,还包含了对一些特定句法结构、隐含逻辑的缺省认知。本元知识的选择对系统的学习能力有决定性影响,适当引入本元单词或逻辑可大大提高系统知识表示能力和学习能力,但由于本元知识无法再学习,因此,为了避免系统学习潜力,本元知识应尽量选取最顶层、最抽象的概念或最根本性的逻辑。


图1 CQNL知识系统构成

逻辑推理知识库:逻辑推理知识库是系统的核心,由CQNL语言组成,可动态学习和扩充,并作为推理和智能规划的知识基础,该部分是连接系统各环节的中枢,因此,逻辑推理知识库及CQNL语言的设计,对系统的各项性能指标有至关重要的作用。

系统知识均采用语句形式描述,推理过程主要依赖基于规则的推理以及基于本元知识中隐含逻辑的推理,从基于规则的推理过程看,系统有些类似于产生式系统,但不同的是,系统中规则知识及非规则类知识均有一系列可拆分的单词按照一定的句法格式组成,推理过程中可自动分类句型,提取子句,解析每个词组、单词、关键性连接词,并支持各种形式的匹配和置换,通过各单词的有效排列和重组,系统的知识表示能力和推理能力极大及增强,此外,部分本元知识库中的隐含逻辑引入,更加提升了系统的综合能力。

数据知识库:数据知识库是只系统知识表示和推理过程必要的数据文件、数据库,甚至是图片、声音、辅助算法库等资源,该部分知识由逻辑推理知识库连接和调配,可在CQNL语言中以单词、对象或属性等形式出现。与前两部分相比,该部分与系统整体耦合关系较小,可在设计逻辑推理知识库时留有兼容扩展数据知识库的接口,后续逐步完善即可。本文对数据知识库仅引入概念,暂不作深入讨论。

2 CQNL语言结构

2.1 CQNL单词

CQNL单词是组成CQNL语言的基本单元,包括本元关键词、定义单词和非标单词3部分:

1)本元关键词

本元关键词(后文简称“关键词”)只系统直接认知的单词,无需定义、不可学习,系统中包括“如果、那么、名词、种类名称、实例名词、是、是一个、是一种、的、和、个、被包含于、属性、属性单位、属性值、属性包含于、属性值为、属性单位为、相对称谓、相对称谓主体、某__、而且、或者、非、数值、大于、小于、等于、大于等于、小于等于、不等于、事件模板、发生事件”等单词,同时还包括:“(、)、{、}、;、+、-、*、/”等符号,主要用来引导推理规则、名词定义、属性定义等各类语句。

2)定义单词

定义单词是指通过本元关键词间接定义的单词,下面一一介绍可以用来定义单词的语句类型,及其对应的本元关键词用法:

(1)名词定义:

名词定义利用关键词“是一个”和“是一种”来定义,名词包括实例名词和种类名称两种,系统约定以“是一个”来定义的名词为实例名词,以“是一种”来定义的名词为种类名称,可以从“实例名词”、“种类名词”这两个顶级的本元关键词出发,按照类别的树形结构,依次向下定义各个名词,例如(以分号表示句子结尾,而不是换行):

生物 是一种 种类名词;植物 是一种 生物;

动物 是一种 生物;人类 是一种 动物;

树木 是一种 植物;男人 是一种 人类;

白杨树 是一种 树木; 李四 是一个 男人;

小白杨1 是一个 白杨树; ...

根据系统约定,当要把某个单词直接定义成种类名词时,应该也采用关键词“是一种”,所以上面例句中第一句采用“生物 是一种 种类名词”,而不是“生物 是一个 种类名称”,当定义好某个种类名词后,即可再次利用该名词定义其它名词,例如例句中的“植物 是一种 生物”,相当于把单词“植物”定义成了种类名称,而在“男人”这个种类名词被定义后,后续语句“李四 是一个 男人”,相当于将单词“李四”定义成了一个实例名词。当采用上述方式定义各种类名词和实例名词后,同时也相当于指定了名词类别间树型关系结构,例如上面的例句中相当于同时指明了“李四 是一个 人类”、“李四 是一个 生物”等一系列的隐含的含义。

(2)属性定义:

利用关键词“属性包含于”,为某个其它的单词定义属性,需要关联属性的单词应该主要集中在名词(但系统并不作强制限定),属性定义方式如下:

身高 属性包含于 人类; 体重 属性包含于 人类;

直径 属性包含于 树木; 寿命 属性包含于 生物;

颜色 属性包含于 植物; ...

当采用以上方式定义属性后,同时也指定了属性与对象之间的关联,例如语句“身高 属性包含于 人类”,相当于定义了单词“身高”是一个属性,并且是关于对象“人类”的属性,当指定属性关联后,可以通过词组(详见后文)的形式来访问特定属性,如“(李四 的 身高)”(注:因为“身高”已经指定为“人类”的属性,而李四又被定义为人类,故系统自动认定“身高”同时也是“李四”的合理属性)。

(3)数值项:

数值项单词包括数值常量和数值表达式,其中数值常量不需要定义,当系统检测到的某个分离单词中所包含的所有字符中均为数字、小数点或负号,则该单词自动被认定为数值常量,例如:

(小白杨1 的 直径) 是 0.25 米 的;

上句中以“的”字结尾,是系统对属性值赋值句型的约定形式(详见后文),此外,句中的单位“米”也是需要定义的,定义形式见下文第(5)小节。

(4)属性值定义:

此处介绍的属性值定义,指的是非数值型(文本型)属性值,对于数值类属性值,无需单独定义,直接按照第(3)小节例句的形式为属性赋值即可。对于文本型属性值,以关键词“属性值为”引出,定义格式如下:

红色 属性值为 颜色; 绿色 属性值为 颜色;

例句中,“A 属性值为 B”含义是“A 是 B 的 属性值(之一)”,之所以将属性值放在属性前面,是为了突出被定义的属性值(后文同理),属性值与属性间为多对一的对应关系;

(5)属性单位定义:

属性单位的定义以关键词“属性单位为”引出,具体方式如下:

千克 属性单位为 体重;米 属性单位为 直径;

米 属性单位为 身高;岁 属性单位为 寿命;

同理,“A 属性单位为 B”指的是“A 是 B 的 属性单位”,不同属性的属性单位可以是相同的,例如例句中的单位“米”即被定义为“直径”的单位,也被定义为“身高”的单位。

(6)相对称谓及相对称谓主体定义:

相对称谓用来描述两个独立对象间的相对关系,如“A 是 B 的 哥哥”、“C 是 D 的 领导”、“E 是 F 的 财产”等,而句中的“哥哥”、“领导”、“财产”就是相对称谓,而可以用相对称谓表示其相对关系的对象称为相对称谓主体,如上面句中的“A、B、C...”,多数情况下相对称谓主体应该集中在名词范围内,但系统也允许非名词作为相对称谓主体。相对称谓定直接利用关键词“是一种”(也可用“是一个”)定义,格式如下:

哥哥 是一种 相对称谓; 财物 是一种 相对称谓;

除直接定义外,还可间接定义:

亲戚称谓 是一种 相对称谓;

社交称谓 是一种 相对称谓;

哥哥 是一种 亲戚称谓; 姐姐 是一种 亲戚称谓;

朋友 是一种 社交称谓; 同事 是一种 社交称谓;

相对称谓主体定义格式如下:

人类 是一种 相对称谓主体;

城市 是一种 相对称谓主体;

当将某一个种类名词定义成相对称谓主体时,其所有子类将自动被认定为相对称谓主体,例如上面句子将“人类”定义为相对称谓主体,那么“男人”、“李四”等各对象均自动成为合法相对称谓主体。

3)“某字项”单词:

以关键词“某”和其它已定义单词组合,可以构成“某字项”,例如“某男人”、“某植物”、“某属性值”、“某相对称谓”等,“某字项”可与多种已知类型单词联用,主要用于规则语句的定义或问题提问,当一个句子中出现多个同类别的“某字项”单词,但又有不同指代时,可用“某**_N”的形式来表示,N表示在本条语句中的“某字项”单词的编号。

4)非标单词:

非标单词只的是CQNL语言中既不是关键词,又不是已定义的单词,相当于生词,CQNL语句中同样允许此类生词的出现,但推理过程对非标单词的支持仅限于直接匹配,而对其它单词,则支持更深层次的解析和处理。

2.2 CQNL词组

CQNL语句中,除了单词外,还允许出现CQNL词组,该词组按特定的语法条件构成,在推理过程中有着重要的作用。各词组必须以小括号或化括号括起,包括以下几类:

1)属性描述型词组:

描述已定义对象的特定属性,形式如下:

(李四 的 身高) ; (小白杨1 的 直径) ;

采用“对象”+“的”+“属性”的结构形式定义,此外,作为合法的词组,要求属性和对象之间必须已定义链接关系(见前文)。

2)修饰型词组:

修饰型词组是指在名词前冠以一个或多个修饰短语构成的词组,修饰可以是对对象的形容,也可以是对对象取值的限定。被修饰的单词一般应为种类名词,因为对于实例名词,其名称本身就相当于已经精确指出了特定目标,无需再根据修饰词限定其范围。修饰型词组定义格式如下:

(桌子1 上面 的 苹果) ;(颜色 绿色 的 树木) ;

(高大 的 男人) ;(直径 大于 0.3 米 的 树木) ;

系统还允许定义任意多项修饰的词组,如:

(桌子1 上面 的 新鲜 的 颜色 绿色 的 苹果) ;

需要说明的是,作为合理的词组,被修饰的单词与修饰词之间仍需定义其修饰关系,定义方式见下文。

3)相对称谓型词组:

利用上文给出的方式定义相对称谓和相对称谓主体后,即可使用相对称谓型词组,格式如下:

(李四 的 哥哥) ;(李四 的 财物) ;

4)混合型词组:

以上各词组类型可以混合搭配,构成混合型词组(为了区分,我们将上面几种词组类型称为单纯型词组),混合型词组格式如下:

((桌子1 上面 的 颜色 绿色 的 苹果) 的 重量) ;

(((李四 的 哥哥)的 领导) 的 身高) ;

作为混合型词组,各级括号的对应关系必须准确,通过各种修饰的组合,混合型词组能够表示非常宽泛的含义。

5)数值表达式:

数值表达式以花括号项的形式出现,内部可包括数学运算符及小括号等辅助符号,例如:

{10.0+20.5};{(12.5+16.8)*2.0};

此外,数值表达式内还可以包括属性值的文本表示形式,如:

{(李四 的 身高)*2.0 + 1.5};

{(((李四 的 领导) 的 身高)+(李四 的 身高))/2 };

2.3 CQNL语句

CQNL语句(简称语句)是构成语言的主体,系统包括多种句型格式,分类介绍如下:

2.3.1 定义句型:

包括名词、属性、属性单位、属性值、相对称谓、相对称谓主体等各类定义语句,各定义句型已在2.1节介绍。其中名词种类定义“是一个/是一种”是应用最多的,可将众多名词概念描述成概念树(见2.1节中的名词定义),此外,名词定义允许出现多对多的关系,用来表示概念的多种类别体系划分,如:

猫 是一种 猫科动物 ; 猫 是一种 哺乳动物 ;

猫科动物 是一种 动物 ;哺乳动物 是一种 动物 ;

2.3.2 包含关系句型:

用来描述两个概念间的包含关系,为规范化推理,统一用关键词“被包含于”引导,即如果要描述“A 包含 B”的关系,也统一写成“B 被包含于 A”,例如:

北京 被包含于 中国 ; 苹果A 被包含于 苹果集K ;

包含关系句型描述形式与上节介绍的名词种类定义句型接近,同样可以描述一个树型网络,并且允许多对多的描述关系,可用来描述地域、集合等概念的从属关系。应注意区分包含关系与种类定义句型间的区分,包含关系用来连接具有从属关系但又不是类别从属关系的概念,通常句子两端均为实例名词,而名词种类定义句型的两端至少有一个是种类名词。

2.3.3 相对称谓描述句型:

相对称谓描述句型用来描述对象间的相对关系,如:

李二 是 李四 的 哥哥;手表A1 是 李四 的 财物;

打印机1 是 电脑1 的 指定外设;

北京 是 中国 的 首都;

上面的“哥哥”、“财物”、“指定外设”等词是必须按照上文格式定义的相对称谓,而句中被描述相对关系的对象也需定义成相对称谓主体,从上面例句可见,此类句型可灵活描述人与人、人与物、物与物间的相对关系,当指定相对关系后,便可在其它句型中利用词组对具有相对称谓关系的对象互相间接指代。

2.3.4 广义定义句型

广义定义句型是指由“单词/词组+是/是一个/是一种+单词/词组”格式构成的句型,即句子的中间由关键词“是”、“是一个”或“是一种”连接,两端分别为单词或词组,按照单词对单词、单词对词组、词组对单词,可将其分为3类,关于词组对词组,由于变化过于复杂,无法完整解析,系统将其归结为非标句型(见下文)处理。在此类句型中,由“是一个/是一种”作为连词的句型中,一部分是与上文的定义句型有交叉的,即涵盖了名词定义的句型。广义定义句型一般在与规则和提问句型联用(见下文)时,才能充分体现其多变性和灵活性,而作为独立句型的情况,此处仅给出单词对单词句型的举例:

密码 是 abc ; 答案 是 35 ;

该句型可用于概念的等效代换和转义。而对于含有词组的广义定义句型,在独立句型中应减少使用,即使有,系统也将先对其进行预处理,将词组求解并化简,对于无法化简的情况,则按非标句型处理。

2.3.5 属性赋值句型

属性赋值句型是为各类对象的属性指定取值的过程,该句型在知识库中的使用频率将是非常高的,为方便推理过程,将其格式规范化为“词组+是+修饰子句+的”,句中的词组用来指定特定对象的特定属性,词组内部的对象依旧可以嵌套为混合型词组,修饰子句可以由一个或多个单词组成,同时约定属性赋值型语句必须以“的”字结尾。定义格式如下:

(苹果A1 的 颜色)是 绿色 的;

(苹果A1 的 重量)是 0.1 千克 的;

(李四 的 身高)是 1.75 米 的;

系统将对象的属性值分为数值类型和文本类型,描述时无需特殊指明,系统在推理解析过程根据属性值描述语句自动辨别类型,当属性值描述语句中存在单独的数值常量或数值表达式时,则被认为是数值类型属性,否则,认为是文本类型属性。对于数值型属性,修饰子句中可同时包含属性单位,单位名称需经过定义,对于文本型属性,其属性值应为独立单词,且经过定义,此外,对于数值类型属性,属性描述子句还可包含“大于”、“小于”等不等式关系描述关键词,例如:

(苹果A1 的 重量)是 大于 0.1 千克 的;

(苹果A2 的 重量)是 小于等于 0.2 千克 的;

上述对属性值约束范围的描述均是被推理函数本元认的(详见后文)。当属性类型为文本型时,也允许用多个单词来描述属性,如:

(苹果A1 的 位置状态)是 桌子B 上面 的;

但此时的属性描述短句“桌子B 上面”中的各单词变化情况较多,并不是严格的属性值类型,因此利用规则或问句指代该知识时会有一定约束,不能用“某属性值”指代。

2.3.6 修饰句型

修饰语句以“被修饰对象+是+修饰子句+的”的格式构成,被修饰对象为名词,修饰子句可以包括多个单词,其定义格式如下:

李四 是 容易冲动 的;苹果A1 是 鲜嫩可口 的;

苹果A1 是 桌子A 上面 的;

桌子A 是 N03房间 里面 的;

本届班长 是 老师 亲自 指定 的;

从例句看出修饰子句可以描述对象的特征、对象间的相对位置以及其它更复杂的关系,某些情况下,修饰句型描述的含义也可以被属性值描述句型代替,如上面例句中的前两句可以改成“(李四 的 脾气) 是 容易冲动 的”、“(苹果A1 的 口味) 是鲜嫩可口的”,但两种句型间是有区别的,属性值描述要求严谨性、单值性,但系统对属性值型知识描述也具有更强的理解能力,而修饰句型相对宽松灵活,但系统对其理解力度却不如属性值描述。

系统推理算法对修饰句型的解析多数基于对修饰子句的直接匹配,而不去深究组成子句内的各单词含义,修饰句型可用来描述其它句型所不能覆盖的知识面,可极大程度地拓宽句型灵活性,但考虑系统对其解析深度不足,因此在条件允许的情况下,应尽量优先选择其它标准句型,而不是修饰句型。当某对象被指定了修饰关系后,就可以用混合型词组来描述对象,如:

(鲜嫩可口 的 苹果); ((N03房间 里面 的 桌子) 上面 的 鲜嫩可口 的 苹果);

在系统预先输入前面修饰子句型知识的前提下,再用上面两个词组检索对象时,系统均能自动定位至对象“苹果A1”。

2.3.7 非标句型:

非标句型是只不属于任何其它已知类型的语句,系统依旧允许这样的句型出现,其实上面介绍的修饰句型中,其修饰子句部分就可以认为是非标的,而本节的非标句型是指整个语句都没有特定格式要求,系统对非标句型的理解程度最小,仅限于直接匹配层面的推理,而不支持各类隐含逻辑的处理,但更加灵活的句子形式仍使得非标句型是系统必不可少的补充。此外,通过规则的互相转义,可以将现有的标准句型以特定规则映射成多种非标句型,从而是交换语言更加接近自然语言形式,本节不再给出非标句型举例,详见后文推理算法中的论述。

2.3.8 基本规则句型

规则句型是系统中非常重要的一种句型,可以和前面的任意句型搭配使用,该句型是推理的关键,由关键词“如果”

和“那么”引导,基于规则语句的推理过程类似于产生式系统,但是通过和前面众多形式的句型搭配,并通过对“某字项”以及词组的支持,使得系统能够描述的逻辑规则非常丰富,这将极大程度地提高系统的知识表示和逻辑推理能力,但如果对规则句型的使用形式全无限制,将导致推理过程的难度是无法想象的。因此,须对规则句型的使用范围和原则作出适当限制,本节介绍的基本规则句型,是对使用条件限制较严格的,但也是最通用的,兼容系统中的任何推理算法,基本规则句型用来描述系统的全局规则库,具有海量性、系统性。

1)系统推理原则介绍

为更好地理解规则句型及其使用原则,此处首先简单介绍系统整体推理原则:

(1)封闭推理假设:系统采用封闭推理原则,即当某问题求解不到正确匹配的解时,则认为该问题的答案是否定的。

(2)逆向推理与正向推理:本文介绍的推理以逆向推理为主,因为如果规则库中存在大量的不同类型的规则,过多的正向将导致推理过程的盲目性,实际上在建立了完整的知识语句和规则语句形式后,系统后续很容易扩展为逆向推理与正向推理相结合的形式。

2)基本规则定义形式举例

下面分别列举规则句型与其他句型的联用情况:

与定义句型联用:

如果 某物体 是一个 苹果 那么 … ;

与相对称谓描述句型联用:

如果 李二 是 李四 的 哥哥 那么 … ;

如果 某人_1 是 某人_2 的 哥哥 那么 … ;

与广义定义句型联用:

如果 开机密码 是 某字符串 那么 … ;

如果 (房间里 的 人) 是 李四 那么 … ;

与属性赋值句型联用:

如果 (某人 的 性格) 是 温和 的 那么 … ;

如果 (某树木 的 直径) 是 大于 0.3 米 的 那么 … ;

与修饰句型联用:

如果 某物体 是 沉重 的 那么 … ;

如果 某苹果 是 桌子A 上面 的 那么 … ;

与非标句型联用:

如果 某人_1 不小心 撞 了 李四 一下 那么 … ;

以上例句中,仅以“如果”引导的子句为例,给出了与各句型的搭配方法,实际使用中,“那么”引导的从句一样可以搭配各种句型,而且推理过程中个,前后子句中的“某字项”自动按同名的进行匹配,例如:

如果 某水果 是 鲜嫩可口 的 那么 人类 是 喜欢 某水果的;

如果 (某苹果 的 颜色) 是 绿色 的 那么 某苹果 是 未成熟 的;

如果 某人_1 是 某人_2 的 领导 那么 某人_2 应该尊重 某人_1;

当句中同类别的“某字项”多于1个时,以“某+单词+_N”的形式区分,推理系统将自动按照同序号同类别的“某字项”进行匹配。在规则从句的如果子句中,允许出现逻辑连词“而且”、“或者”、“非”,从而构成复合逻辑子句,例如:

如果 某物体 是 某桌子 上面 的 而且 某桌子 是 某房间 里面 的 那么 某物体 是 某房间 里面 的;

如果 某工件 是 必须 的 而且 非 某工件 是 房间_A 里面 的 那么 无法施工;

如果 某人_1 是 某人_2 的 弟弟 而且 某人_2 是 某人_3 的 爸爸 那么 某人_1 是 某人_3 的 叔叔;

当如果子句存在逻辑连词时,系统将首先根据逻辑连词“而且”、“或者”对句子进行断句,分成一系列子句,对于每个子句,再优先检测句首的逻辑词“非”,如存在,则对其后面引导的子句求解结果自动取反。

3)基本规则的使用原则

本节将给出基本规则使用过程的约束和限制,限制条件的选择依据是为了在简化推理和保留规则灵活性间寻求更好的折中,本节并未针对所有限制条件给出详细解释,部分原因将在后文推理算法的介绍中有所体现。

(1)逻辑连词使用原则:规则语句可以用逻辑连词“而且”、“或者”、“非”构成复合句,但约定逻辑连词“而且”、“或者”应主要集中在条件从句中,而尽量避免在结果从句中使用,因为系统采用逆向推理为主,需首先匹配结果从句,然后再转化为对条件从句的求解,因此,当“那么”从句存在一个逻辑子句而条件从句存在多个逻辑子句时,逆向推理过程恰好构成树型搜索策略,减小了求解难度。此外,系统中应尽量用肯定逻辑,而减小对“非”逻辑的使用,因为系统采用封闭推理假设,容易将“不成立”和“不存在解”构成混淆,即使有不得不用“非”逻辑的情况时,也应谨慎,避免歧义。

(2)“某字项”的单词类型限制

基本规则中“某字项”可以与种类名词、属性值、相对称谓、相对称谓主体联用,但不能与属性联用,例如以下语句是合法的:

如果 (某苹果 的 颜色) 是 某属性值 的 那么 … ;

而以下语句是不合法的:

如果 (某苹果 的 某属性) 是 某属性值 的 那么 …;

(3)“某字项”与词组联用的约束

基本规则语句的“如果”子句中,“某字项”可作为属性引用词组的主语使用,如第(2)节中的例句1,此外,条件从句中的“某字项”要使用在修饰名词型词组或相对称谓型型词组中时,不能独立使用,但当句中存在多个逻辑子句,并且前面某有效逻辑子句中已经出现过某字项,则允许使用,如以下语句是不合法的:

如果 (某桌子 上面 的 苹果) 是 新鲜 的 那么 … ;

如果 ((某人 的 哥哥) 的 领导) 是 严肃 的 那么 … ;

而以下语句则是合法的:

如果 某桌子 是 房间A 里面 的 而且 (某桌子 上面 的 苹果) 是 新鲜 的 那么 … ;

如果 (某人 的 年龄) 是 大于 20 岁 的 而且 ((某人 的 哥哥) 的 领导) 是 严肃 的 那么 … ;

有些情况下,我们并不希望前面的逻辑子句引入任何附加限制,那么可以直接利用重言句来引导,如:

如果 某桌子 是一个 桌子 而且 (某桌子 上面 的 苹果) 是 新鲜 的 那么 … ;

如果 某人 是一个 人类 而且 ((某人 的 哥哥) 的 领导) 是 严肃 的 那么 … ;

以上介绍的都是在“如果”子句中的使用方式,而在“那么”从句中个,对词组中的“某字项”限制更加严格,仅允许在属性短语中出现,例如下句是合法的:

如果 某红富士苹果 是 成熟 的 那么 (某红富士苹果 的 颜色) 是 红色 的;

而以下句型则是不合法的:

如果 某水果盘 是 不干净 的 那么 (某水果盘 里面 的 水果) 是 不干净 的;

但是却可以改写成如下合法句型:

如果 某水果盘 是 不干净 的 而且 某水果 是 某水果盘 里面 的 那么 某水果 是 不干净 的;

从上面例句中看出,虽然基本规则句中对词组中的“某字项”有限制,但是却可以通过各种句子变型来表达同样的含义,虽然增加了句子长度,但是却方便了推理过程,当然这些限制不是绝对的,而是与本文采取的推理策略有关,随着推理机制的继续优化和完善,规则的使用限制也将会逐步减少。

2.3.9 属性值间接运算规则

许多情况下,我们想描述不同对象属性的属性值间的间接运算关系,从而根据部分已知条件,间接推算出其他隐含的各项数据,本节的属性值间接运算规则语句就用来描述此类知识。之所以未把该规则统一归于基本规则中,是考虑到属性值相互引用时需要用到数值表达式、词组的混合使用,而且属性值间的间易出现嵌套循环引用关系,系统将此类规则单独分类,在推理函数中也为其设计单独的逻辑分支,进行针对性处理,避免了规则间过于复杂的耦合关系。该句型由关键词“如果数值属性”引导,句型描述格式如下:

如果数值属性 (李四 的 年龄) 是 某数值 岁 的 那么 (李二 的 年龄) 是 {某数值+2} 岁 的;

如果数值属性 (某集合 的 数量) 是 某数值_1 个 的 而且 (某集合 的 单体重量) 是 某数值_2 千克 的 那么 (某集合 的 总体重量) 是 {某数值_1*某数值_2} 千克 的;

花括号内的数值表达式计算公式目前可以使用加、减、乘、除等各项运算符号,如进一步完善推理算法,可支持更复杂的数学运算,该规则句型的引入使得系统能够有效表示数学运算型知识,与其它句型表示的逻辑型知识配合,将能表示更加广泛的知识范围。

2.3.10 事件描述语句

事件型知识仅在系统中的高层推理部分(见下文)被用到,主要用于智能任务规划。前面各知识句型多为静态知识,而本节给出的事件描述可用来描述一个动态过程,事件可以是一个或一系列动作引发,系统主要描述事件的启动条件、执行过程和执行后果,事件描述知识语句包括对事件模板的描述和对事件实例的描述:

1)事件模板

事件模板由关键词“事件模板”引导,按下列复合结构句型定义:

事件模板 [事件名称] [事件描述语句] 如果 [事件触发条件] 那么 [事件引发结果];

其中事件触发条件可以包含多个逻辑子句,由关键词“而且”或“或者”连接,事件引发结果也可包含多个子句,只能由“而且”连接(为了保证结果的唯一性)。例如,我们可以用事件模板来描述机器人的某项能力:

事件模板 RA_桌间移物 机器人_RA 移动 某物体 从 某桌子_1 到 某桌子_2 \

如果 (某物体 的 位置状态) 是 某桌子_1 上面 的 而且 (某桌子_1 的 高度) 是 小于 1.3 米 的 而且 (某桌子_2 的 高度) 是 小于 1.3 米 的 而且 (某物体 的重量) 是 小于 5 千克 的 \

那么 (某物体 的 位置状态) 是 某桌子_2 上面 的;

该事件模板的名称叫做“桌间移动物体”,用来表示机器人_RA的一项能力,能够将某物体从一个桌子上移动到另一个桌子上,但是考虑到机器人的能力上限,该物体的重量不能超过5千克,而且两个桌子的高度都不能超过1.3米,事件执行后的结果就是物体的位置从桌子1的上面变成了桌子2的上面。需要注意的是,在描述事件发生前后对象的状态变化时,应该用属性描述的格式,如例句中的属性“位置状态”,而不是直接用修饰语句,因为针对属性,系统求解时会自动保证其取值的唯一性,并且自动选用最新输入的知识语句求解属性状态。

2)事件实例

当某个事件模板启动条件被满足,而且已经被执行时,就代表该事件真实发生了,事件实例语句由关键词“发生事件”引导,一个事件模板可以衍生出任意多个事件实例,例如对应上面列举的世界模板,可以发生以下实例事件:

发生事件 桌间移动物体 机器人A 移动 水杯1 从 白电脑桌 到 红试验桌;

发生事件 桌间移动物体 机器人A 移动 工具箱 从 红试验桌 到 绘图桌;

3 CQNL本元认知逻辑

本元认知逻辑是系统本元知识中对逻辑的自动认知部分,该部分逻辑不需要任何规则语句的支持,由推理算法自动解析和处理,可以理解为隐含形式的规则,不可学习或修改。系统将固定的、显而易见的或难以用规则语句描述的逻辑设计成本元逻辑,由于直接得到了底层算法的支持,使得本元逻辑推理比基于显式规则语句的推理过程具有更高的推理效率。本元认知逻辑分类如下:

1)单词类型的自动解析

系统中已定义的单词类型包括种类名词、实例名词、属性、属性值、属性单位、数值、相对称谓、相对称谓主体等类型,其中种类名词和实例名词又共同属于名词类型,部分单词类型会有交叉,例如多数相对称谓主体型单词同时又是名词类型。当采用上文介绍的各定义语句定义单词时,系统将会自动解析单词类型,供推理过程使用。

2)“是一个/是一种”逻辑处理

(1)间接从属关系的自动认知

当采用“是一个”句型和“是一种”句型定义各个概念的从属关系时,系统将自动进行间接从属关系认知,即“A 是一个/是一种 B”以及“B 是一个/是一种 C”知识同时出现时,系统将自动认知“A 是一个/是一种 C”,系统可处理任意多级间接从属关系。

(2)种类名词与实例名词的自动区分

当采用“A 是一个 B”句型定义单词A时,A将被认定为实例名词,当采用“A 是一种 B”句型定义单词A时,A将被认定为种类名词。

(3)单词类型匹配

当采用“A 是一个/是一种 B”句型作为规划描述或问题描述的子句时,如果A是一个已定义单词,B是一个单词类型名称,而且B恰是A的单词类型,那么该子句逻辑自动成立。当A是实例名词或种类名词时,语句“A 是一个/是一种 名词”同样成立,此外,不论A为任何单词类型,语句“A 是一个/是一种 单词”成立,即系统隐含约定了“单词”为所有单词类型的顶级类型。

3)“某字项”的自动匹配

规则语句和提问语句中的利用“某字项”来指代一类单词,当使用“某B”或“某B_N”指代时,系统自动提取有效词根B,且对于任何满足“A 是一个/是一种 B”的单词A均可作为该“某字项”的有效匹配词,需要注意的是,此处所指的“A 是一个/是一种 B”,同样包含了上节介绍的对“是一个/是一种”句型的本元隐含逻辑处理,也就是说只要满足B和A满足间接从属关系,或者B恰为A的单词类型时,均可实现“某字型”的有效指代,同理,“某单词”作为顶级指代单词,可指代任意类型单词。

4)包含关系自动认知

由“被包含于”引导的包含关系句型支持间接包含关系的自动认知,即“A被包含于 B”以及“B 被包含于 C”知识同时出现时,系统将自动认知“A 被包含于 C”,系统可处理任意多级间接包含关系。

5)属性的隐含逻辑处理

(1)属性值的自动分类

系统将对象的属性分为数值类型和文本类型两类,不需显式定义,在为属性指定属性值时,如属性描述子句为数值项加属性单位构成时,则被认为是数值类型,否则认为是文本类型,如采用“(A 的 属性B) 是 0.5 千克 的”句型为属性赋值时,则属性B自动被认为是数值类型,此外,用花括号项表示的数值表达式代替句中的数值常量时,同样被自动认定为数值类型属性。

(2)属性值的缺省处理

当某对象的属性值没有对应的描述时,系统会自动根据概念从属关系向上追溯,直到最顶层的概念,一旦发现对应的属性描述,则直接作为该对象的属性值,例如在系统中输入以下知识:

(水果 的 营养价值) 是 丰富 的;

(苹果 的 重量) 是 小于 0.5 千克 的;

苹果 是一种 水果; 苹果A 是一个 苹果;

那么当利用问句求解苹果A的颜色或重量时,由于搜索不到直接针对苹果A的对应属性描述,系统将自动向上层概念追溯,并利用苹果及水果的共性属性描述给出解答。

(3)属性值的不等式关系自动求解

对于数值类型的属性,在描述属性或提问属性时,不仅可用等式关系,还可用不等式关系,系统求解过程将自动判定,并给出正确结果,例如在系统中输入以下知识:

(苹果A 的 重量) 是 0.3千克 的;

当对系统提问,求解“(苹果A 的 重量) 是 大于 0.2 千克 的”,系统将求出命题成立,而当求解“(苹果A 的 重量) 是 大于 某0.4 千克 的”时,系统将求出命题不成立,当求解“(苹果A 的 重量) 是 某数值 千克 的”,将得出答案0.3,而当系统输入以下知识:

(苹果A 的 重量) 是 大于 0.3千克 的;

当对系统提问,求解“(苹果A 的 重量) 是 大于 0.2 千克 的”,系统将求出命题成立,当求解“(苹果A 的 重量) 是 大于 某0.4 千克 的”时,系统将求出命题不成立,当求解“(苹果A 的 重量) 是 某数值 千克 的”,将得不到答案,因为系统仅可从等式关系递推不等式关系,反之则无法递推。

(4)属性值的单值性

系统约定属性值具有单值性,当同一属性存在多项描述时,系统自动按最新输入的知识语句求解(每条知识语句都自动记录的输入时间)。但对于数值类型的属性,当存在多条不等式约束时,允许上界和下界并存,推理算法自动获取最新的上界和最新的下界描述作为属性值求解依据。

6)修饰句型的隐含逻辑处理

(1)属性值自动转义

当规则句型的条件从句或着提问句型与修饰句型联用时,而修饰句型的修饰子句又恰为主语对象的某个文本类型属性对应的属性值时,推理算法将自动转调属性求解,例如在系统中输入以下知识:

(桌子A 的 位置状态) 是 房间里面 的;

并且系统中存在如下规则语句:

如果 桌子A 是 房间里面 的 那么 ...;

当推理过程遭遇该规则时,条件将被触发,该隐含规则的引入使系统在规则表示及提问过程中适当化简语句,更接近自然语言形式。但该逻辑反过来并不成立,即以修饰句型来描述知识,系统无法为其自动链接到属性值求解上,因为指代不明确。

(2)修饰句型缺省处理

与属性值的缺省处理机制相同,修饰句型也支持缺省处理,系统会自动根据概念从属关系向上追溯,直到最顶层的概念,一旦发现对应的修饰句型,则返回成功,句型使用原理与属性值求解情况类似,此处不再举例。

(3)修饰句型的多值性

修饰句型可以由多个同类的语句共同修饰同一个对象,例如:

苹果A 是 鲜嫩可口 的;苹果A 是 美味 的;

苹果A 是 优质 的; ...

即可以用任意多个修饰短句修饰某对象,而各修饰语句中可以有含义相近的情况,这与属性描述的单值性约束是有明显区别的,实际构建知识库时,可利用修饰句型和属性描述句型的两种不同特点间的互补性,有效选择知识句型,提高系统知识表示和推理能力。

7)词组自动解析

前面已介绍,系统支持灵活多变的词组结构,系统推理过程将根据词组中主词与修饰词间的词性和相互关系,自动解析并求解词组含义,例如:

(天空 的 颜色);(弯弯 的 小河);(窗子 外面 的 风铃);(体魄 强健 的 战士);(李四 的 战友);

例句中第1个词组表示对象与属性的关系,第2、3个词组表示修饰关系,第4个词组表示利用属性值修饰的关系(假设“体魄”已被定义为“战士”的属性),第5个词组表示相对称谓关系,实际知识表示中,还可以出现个类词组的任意嵌套组合,只要小括号的层次关系正确、连接词“的”的位置使用合理、各属性及相对称谓等词性被有效定义,系统就能自动逐级解析词组内容,提取主语及修饰部分,并根据主语及修饰子句的词性及相对关系自动求解词组的最终指代(详见推理算法)。

8)“是”句型与“是一个/是一种”句型的通换处理

有些情况下,某些句型的语法即适合关使用键词“是”,又适合使用关键词“是一个/是一种”,例如“羚羊 是一种 动物”,也可以表示成“羚羊 是 动物”,因此系统引入隐含逻辑处理,在提问语句中,由“是”或“是一个/是一种”引导的句型中,当关键词两端均为独立的单词或独立的词组时,推理过程可通换使用,该逻辑仍是为了提高系统在提问交互过程中的灵活性,但提问句型外,其它知识语句仍需按前文介绍的格式进行定义。

4 推理算法设计

多种表示句型、“某字项”、词组以及各类规则语句的综合使用,使得系统的推理算法具有很高的难度,为提高可实现性,系统对推理算法进行分层设计(如图2),包括辅助算法库、底层推理算法库、中层推理算法库和高层推理算法库,其中辅助算法库实现知识语句的预处理以及句子结构的初步解析,底层推理实现本元认知逻辑的处理,中层推理实现基于规则的推理,并实现“某字项”的解析,高层推理实现正、逆向混合推理、句型转义推理、任务规划等推理内容,高层推理之上则是人机接口,实现知识学习、规则学习、问题提问等交互操作。



图2 推理算法结构

4.1 知识库结构设计

4.1.1 单词及语句

CQNL知识库主体知识均采用语句格式描述,每条语句由多个单词构成,因此,欲构建知识库,需先给出单词和语句的结构形式:

4.1.1 语句表示结构

语句结构包括语句主体、语句生效时间和虚构标志:

1)语句主体:即描述语句的字符串,句子中各单词以空格隔开,除单词外,还可包含括号、花括号、分号、数学运算符等符号;

2)语句的生效时间:为每条语句指定了一个唯一的时刻,精确至毫秒,当系统推理过程搜索某问题的答案或某对象属性的取值时,可能会遇到多解或矛盾的情况,此时推理算法将依据知识来源的语句的时刻新旧进行取舍;

3)语句的虚构标志:虚构标志属性用任务规划算法,算法推理过程需动态将一些可能发生的情况加入知识库中,统一参与推理,因此,需将新加入的知识语句设为虚构模式,用以与原知识库中的真实知识进行区分。

4.1.2单词库、框架及索引表

虽然CQNL知识语句定义了完整的句型分类和语法格式,并可依此推出单词类型,但推理过程中有可能会大量用到单词类型判别,如果每次都搜索知识库语句重新判定,耗时较大,因此,系统在知识库结构中引入单词库,单词库中的单词采用上节介绍的单词结构表示,具有单词类型项,系统会自动筛选知识库中的相关定义语句,判断各单词词性,并装载于单词类型项中,后续推理过程可反复查询使用,提高推理效率。

除单词类型外,一些基本的逻辑,如“是一个/是一种”表示的类别从属关系、“被包含于”表示的包含关系,这些基本逻辑在推理过程中被使用的频率非常高,为了提高推理效率,系统引入基于框架的表示形式,将单词类型、类别从属和包含关系等最基本的逻辑作为框架的槽,并将框架结构与单词库关联,且为单词库中的任何一个单词都对应该通用的框架结构,如图3所示,框架的单词类型槽直接装载对应的类型字符串,支撑推理过程快速检索,“是一个/是一种”槽和“被包含于”槽的槽值直接装载着单词表中其它单词的索引,利用不断检索单词表中各单词的级联索引关系,推理算法能够快速求解概念类别从属及包含关系子问题,此外,系统对框架的槽结构采用动态槽链表结构设计,即每个框架对象可链接任意多个槽,只要合理指明各个槽的名称和槽值描述即可,该描述结构恰可支撑系统对类别从属关系和包含关系实现多对多(见2.3.1)连接形式的需求,同时,动态可变的槽链表结构,也使得系统具有更高的升级潜力,可扩充添加其它类型的槽,当某单词不需要框架中某个槽时,动态槽链表可直接省略相应数据项,从而节省内存空间。



图3 知识库的综合索引表及框架表示

从框架知识表示的原理出发,我们当然可以为每个单词定义更多的槽,例如用来表示某个对象的各种属性,但系统面向通用设计,对象类型、对象属性均是可动态学习的知识,不同对象的属性很难预知,更难以统一,因此在框架的槽结构中暂未引入表示各属性的槽,属性推理过程仍靠动态解析知识语句获取。当然,在将该系统应用于某一特定领域,用来表示某一类知识时,如果可提取该领域的共性属性,则可扩展至系统的槽结构中,实现快速推理。

基于单词库结构,不仅实现了框架型知识表示,还为每个单词建立了一个语句索引链表,分别链接至语句知识库中每一个出现过该单词的知识语句,这样在推理过程中,根据将要搜索的知识语句的部分限定单词,可在海量知识语句中快速定位搜索范围,并匹配最终结果,极大程度地提高了知识检索速度。

本系统采用的以语句为主体的知识表示形式,虽具有便于理解、交互和学习等优点,但推理过程需要不断在各类语间中进行检索和匹配,容易降低推理速度,而本节给出的知识库结构设计,借助单词表、框架、语句索引表等手段,恰恰有效补充了系统推理效率方面的不足。需要说明的是,无论是单词库、框架还是索引表,均是知识表示的辅助手段,其中包含的所有信息均来源于语句知识库,系统提供给用户的交互界面仅限于语句层面,单词库、框架及索引表均由系统在推理过程自动建立并维护。

4.2 辅助算法

辅助算法用来实现句子字符串的查找、比较、预处理等操作,由于系统包含算法较多,因此对于实现过程较简单的算法进行简略介绍。

4.2.1 语句基本操作辅助算法

1)算法4.2.1:字符子串查找算法

系统中包含多个字符子串查找算法(统一指代),目的均是在知识语句中查找一段感兴趣的字符子串,但细节功能各有不同,包括一般查找、括号项之外查找、括号项和引号项之外查找等模式,其中在括号或者引号外查找,是指将语句中包含的括号项或引号项作为整体考虑,而不进入其内部匹配,例如以下语句:

(桂林 的 风景) 是 迷人 的;

在语句中以括号之外的模式寻找子串“迷人”,能够成功,但查找子串“桂林”将失败。本部分算法实现:略。

2)算法4.2.2:单词的串类型检测

根据入口单词,检测其串类型,此处的串类型并不是前文介绍的单词类型,而是直接根据单词字符串特点,将其分为文本类型、数值类型和其它类型,当构成单词的所有字符单元均为汉字、字符、数字和下划线等元素构成时,将被检测为文本类型,当各元素均为数字、小数点或负号(仅限于首字符)时,将被检测为数值类型,当各单元中出现上述内容以外的其它字符时,将被检测为其他类型。

算法实现步骤如下(为描述方便,算法中将汉字、字符、数字和下划线称为合法字符,其余字符称为非法字符):

(1)提取首字符元素(当遇到汉字等双字节单元时,则整体读取),如为合法字符或者为负号,则继续,否则返回为其他类型;

(2)遍历后续字符元素(仍自动认读双字节单元),检测各字符元素,遇到小数点以外的非法字符则返回为其它类型,否则记录本字符元素类型,继续;

(3)检测到单词结尾时,统计各字符元素类型,如首字符元素为负号或数字,且后续元素均为数字或小数点,则返回为数值类型,如首字符为数字或负号,但后续元素存在数字或小数点外的其它字符,则返回为其它类型,如首字符元素及后续各元素均为合法字符类型,且首字符不为数字,则返回为文本类型。

经检测后,单词的串类型检测结果如表4.1所示。

表4.1 单词的串类型检测结果

单词的串类型单词举例文本类型天空; _草地;某牛羊_1;小2哥;数值类型12.43; 100; -38.27;其它类型+;-;&A;他&她; #35;3)算法4.2.3:获取语句中下一个有效单词

根据入口的语句字符串,提取句首的第一个有效AI单词,当首个单词为文本类型或数值类型时,则返回整体单词(单词的截断以首次遇到空格或不合理字符为准),否则,仅返回第一个字符。该算法实现原理与算法4.2.2相近(算法略),基于该算法获取以下语句中的首单词:

桌子 前方 有一个 椅子; 12 + 24;

(红色 的 玫瑰花); {(机器人RA 的 重量)};

将分别得到“桌子”、“12”、“(”和“{”;

4)算法4.2.4:拆解语句中的单词列表

该算法将入口的知识语句全部拆解,拆成一系列的单词列表并返回,并支持对小括号项、花括号项整体解读的设置入口,任何一个入口标志被置位则表示该括号项整体作为一个单词项处理,否则则拆开处理。算法实现如下:

(1)建立初始单词列表,个数设置为0;

(2)调用算法4.2.3,获取当前子句的下一个单词;

(3)如果下一单词为“(”且入口的小括号整体读取标志被置位,则向后检索对应的回括号“)”位置,然后将整个小括号项整体插入单词列表,语句起始位置偏移至回括号后一个字符;如下一单词为“{” 且入口的花括号整体读取标志被置位,寻找对应的“}”,采用同样处理策略;否则,直接将算法4.2.3获得的单词插入单词列表,语句初始位置移动到该单词的后一个字符;

(4)如果已经检测至语句结尾,则返回,否则,将起始点移位后产生的新的字符子串作为句子入口,转(2)。

在以上算法的步骤(3)中,寻找小括号或花括号的对应回括号时,需要考虑到括号的嵌套使用,下面以小括号的回括号搜索过程为例,给出该搜索子算法:

(1)遇到句首为“(”时,启动算法,定义括号深度变量,初值设置为1,搜索起始位置为括号后第1个字符;

(2)如当前子句的下一个单词为“(”,则括号深度加1,搜索位置后移一个字符,继续搜索,如下一单词为“)”则括号深度减1,搜索位置后移一个字符,继续搜索,如为其它单词,深度不变,继续搜素;

(3)当首次检测到括号深度变量为0时,搜索成功,返回最后的回括号位置,当检测到句子结尾,且括号深度不为0时,搜索失败,入口为非法语句。

将该算法用于小括号及花括号的匹配搜索过程,嵌入单词拆解算法的步骤中,即可实现完整的单词拆解,利用该算法对以下语句进行拆解:

(大明 的 体重) 是 {(二明 的 体重)*1.2} 千克 的;

在设置不同的括号整体读取标志后,得到结果如下表:

表4.2 语句的单词列表拆解

入口设置拆解后单词列表无整体读取(;大明;的;体重;);是;{;(;二明;的;体重;*;1.2;);千克;的;小括号

整体读取(大明 的 体重); 是;{;(二明 的 体重);*; 1.2;};千克;的;花括号

整体读取(;大明;的;体重;);是;{(二明 的 体重)*1.2};千克;的;全部整体读取(大明 的 体重);是;{(二明 的 体重)*1.2}; 千克; 的;5)算法4.2.5:同级括号深度内字符子串查找

该算法可根据入口知识语句,以及指定的起始查找位置,在与起始位置同一级的括号深度内检索特定的字符子串,需借助算法4.2.3,在括号深度检测的机制上,与算法4.2.4中的处理方式接近(算法略),该算法主要用于辅助其它推理算法中对词组的解析过程,例如对下面语句:

(小李 和 (王阿姨 的 朋友) 的 邻居) 从前 认识;

当调用该算法在语句中搜素“的”,且搜索位置为单词“小李”之后时,算法将自动搜索到单词“邻居”前面的“的”的位置。

6)算法4.2.6:语句化简

该算法用于在推理前对语句算法进行化简和归一化处理,步骤如下:

(1)寻找分号位置,从分号后截断,保留分号前子句(不包括分号),作为主句;

(2)去除子句的外层括号;

(3)去除单词的独立括号;

(4)去除子句的前后导空格。

以上各步仅给出了目标描述,略去了详细实现过程,表4.3以某语句为例,给出了各步化简后的结果,表格中的“&_&”符号并非真实存在,仅代表句子中含有前后导空格,在第(2)步化简括号处理过程中,仅当第一步处理后的结果子句中的外层括号括起了整个语句时,才会去除外层括号,而如果将语句改成“( (红色) 的 玫瑰花 ) 很漂亮;”,则在第(2)步处理时将不会触发外括号化简操作。本节的化简操作并不仅仅是针对原始语句进行的,而是考虑到推理过程中经过语句的转型、置换等操作,常会出现多余的括号或空格,因此,各推理子函数中常需调用该算法,实现对子句的归一化处理。

表4.3 语句化简过程示意

原始语句( (红色) 的 玫瑰花 ); ***第(1)步化简后( (红色) 的 玫瑰花 )第(2)步化简后 &_&(红色) 的 玫瑰花 &_&第(3)步化简后&_& 红色 的 玫瑰花 &_&第(4)步化简后红色 的 玫瑰花7)算法4.2.7:语句格式化比较

将两个入口的语句(模板语句和匹配语句)进行逐个单词比较,并判断是否匹配,并允许入口的模板语句中用“?”来通配指代任意一个有效单词,或用“&*”通配指代任意子句,所有的通配指代项均会在出口字符串列表中返回,算法实现如下:

(1)建立初始出口单词列表,个数为0;

(2)依次调用算法4.2.3,分别获取入口模板语句和匹配语句的下一个单词;

(3)如下一模板语句单词为“?”,则直接将模板语句起始位置移至问号之后,将匹配语句起始位置移至下一单词,并将匹配语句的当前单词加入出口单词列表;如下一模板语句单词为“&”,则再次获取其下一字符,两字符连接后如为“&*”,则将匹配语句中剩余子句整体作为一个单词项,放入出口单词列表,算法返回匹配成功;如下一模板语句单词和匹配语句单词相同,则各自将语句起始位置移动到当前单词后,算法继续,如不同,则返回匹配失败;

(4)如模板语句与匹配语句已经同时达到句尾,则返回匹配成功,如仅有一句达到句尾,则返回匹配失败,如均为达到句尾,则以新的起始位置构建子句,转(2)。

基于该算法,对以下两个子句进行匹配:

模板语句:(? 的 叫声) 是 ? 的;

匹配语句:(百灵鸟 的 叫声) 是 动听 的;

匹配后返回成功,且返回单词列表“百灵鸟”和“动听”,当利用算法对以下两个子句进行匹配:

模板语句:本次会议 的 目的 是 &*;

匹配语句:本次会议 的 目的 是 学习 雷锋精神;

匹配后返回成功,并返回单词项“学习 雷锋精神”。

4.2.2 知识库操作辅助算法

1)算法4.2.8:插入单词至单词表

向知识库的单词表中插入特定单词,知识库的单词表按照单词的字符串间比较结果进行有序存储,以便于快速检索,单词插入过程采用二分法检测插入位置,算法略。

2)算法4.2.9:单词表中检索单词

在有序存储的单词表中,利用二分法快速查找特定是否存在,如存在,则返回单词位置索引,算法略。

3)算法4.2.10:知识库中插入知识语句

将知识语句插入至知识库的句子集中,同时更新相关的单词表、语句索引表及框架等内容,实现步骤如下:

(1)将语句插入知识库句子集;

(2)调用算法4.2.4,将语句拆解成单词列表(同时拆解各括号项),然后遍历该句包含的所有单词,进行简单预处理并进行有效性检验,有效单词利用算法4.2.9检测单词是否在单词表中已存在,如不存在,则在单词表中插入该单词;

(3)继续遍历语句中包含的各个单词,针对各单词,检索其在单词表中的索引,并依次遍历各单词对应的语句索引链表,在链表中增加对本语句位置的索引;

算法中第(2)步中对拆解后的单词预处理,是指对“某字项”单词自动去除“某”字及后缀标号,提取有效词根作为插入词,有效性检验是指仅允许插入有效单词,而对数值常量、符号等内容不进行操作。

4)算法4.2.11:知识库中删除知识语句

在知识库中删除某知识语句,同时清除单词表中相关的句子链接,但针对语句中的各单词,不再将其从单词表清除(因为单词可能是由其它知识语句中引入的),算法略。

5)算法4.2.12:更新框架槽值

系统框架结构的槽包括单词类型槽、“是一个”槽、“是一种”槽和“被包含于”槽,其中单词类型检测算法涉及到某些其它推理算法的调用,将放在后文介绍,本节仅实现其它三种槽的槽值更新。下面以“是一个”槽的槽值更新过程为例,给出算法实现过程(其余槽值更新过程同理):

(1)对于入口给定的某知识语句,首先检测语句是否是“A 是一个 B”的句型,调用语句格式化比较算法4.2.7,并设定模板句格式为“? 是一个 ?”,当入口语句与模板句型匹配成功,则算法继续,否则返回失败;

(2)利用上步语句匹配中,两个问号处获得的匹配单词,分别作为主索引词和槽值单词;

(3)利用主索引词为入口,调用算法4.2.9,查找单词在知识库的单词表中的位置,然后在单词对应的槽链表中插入节点,节点对应的槽名称为“是一个”,节点对应的槽值为上步获得的槽值单词。

以上算法仅针对一条特定的知识语句,检测并更新知识库中相应的槽值,实际应用过程中,遍历知识库中各语句,对满足句型匹配条件的语句依次进行更新槽值处理,即可建立起完整的框架知识结构。

6)算法4.2.13:格式化语句检索

该算法针对入口的某模板语句,检索知识库,返回所有满足匹配条件的语句列表,该算法将利用知识库的单词表对句子的索引机制,快速查找需要的语句。因为知识库单词表中每个单词均对包含该单词的所有知识语句进行了链接索引,因此只要求取入口语句各单词对应的索引句子集合的交集,即可确定需要查找的语句集,算法实现如下:

(1)调用算法4.2.4,将入口语句拆解成单词列表,并去掉“某字项”单词;

(2)利用拆解后的单词列表,依次调用算法4.2.9,查找单词在知识库的单词表中的位置,并去除查找失败的单词,仅保留单词表中查找成功的有效单词,构成查询单词列表;

(3)遍历查询单词列表,查询各单词对应的语句索引链表,并选择链接项最少的单词所对应的语句索引链表,作为主遍历索引表(选择最小链接项的索引表是为了缩小搜索范围,提高搜索速度);

(4)遍历上步选中的主遍历索引表链接的句子,依次检测各句子是否被查询单词列表中的所有单词链接,只有当某语句被所有列表中单词链接时,才能作为候选匹配语句。此外,在检测的过程中,还要同时确保查询单词列表在表中的排序与在待匹配语句中的排序一致,为此,在知识库的单词表对应的语句索引链表中引入了单词序号变量,记录了单词在语句中的位置序号,算法在检测某语句是否被查询单词列表中所有单词链接时,将不断动态更新最新链接单词在语句中的序号变量,检测下一单词的链接关系时,必须保证其在语句中的序号大于上一单词的序号才视为有效。匹配成功的语句,均加入到待返回的语句列表中。

(5)返回所有符合条件的语句列表集合。

算法在第(1)步构建单词列表时,去掉了“某字项”,表示针对“某字项”单词不作交集约束,被找语句的对应位置上可以是任意单词,甚至没有单词。

该算法是支撑上层推理算法的一个非常有用的算法,推理过程中,可通过已经掌握的若干主要单词,利用该算法在知识库中快速获取感兴趣的语句集合,提供的已知单词越多,算法定位越准确,搜到的句子集约小,然后在该子集内可继续进行其它各项精确匹配和处理操作,这样就避免了对知识库中海量知识语句进行逐句筛选,极大提高了推理效率。下面举例说明该算法的推理结果,假设知识库中存在以下知识语句:

桌子A 是 方形 的; 桌子B 是 圆形的;

桌子A 是 白色 的; 桌子B 是 白色 的;

(桌子A 的 高度) 是 1.1 米 的;

(桌子B 的 高度) 是 1.2 米 的;

然后利用该算法对知识库进行检索,当设定入口模板语句为“桌子A 方形”时,算法将所有符合“** 桌子 ** 方形 **”的句型全部检出,也就是被检索语句只要包含了模板中给定的单词,而且各单词出现的先后顺序与模板给定的句子中的顺序相同即可,而各关键词间包括一个或多个其它连接词时,依旧被视为成功匹配,那么“桌子A 方形”模板语句检索,将返回上述第1个例句,而利用模板语句“是 白色 的”检索,将得到第3、4条例句,当利用模板语句“高度 是 的”检索,将得到第5、6条例句。

检索算法中允许出现“某字项”单词,但算法将自动剔除“某字型”后再进行检索,因此,某字型单词在模板句子中并无任何实际约束,仅用于句子过渡,是句法更完整,例如用“某桌子 的 高度 是”检索时,将得到第5、6条例句,而换成“某椅子 的 高度 是”进行检索时,仍会得到同样的结果,该算法返回结果相当于一个粗略的匹配集合,至于返回的句子集是否与需要的含义准确匹配的问题,将由更上层的推理算法进一步筛选确认。

此外,由上面介绍看出,该算法的匹配方式与算法4.2.7相比,对模板句式要求更宽松,该算法仅需指定句中的部分单词,而对括号等各类辅助符号均可忽略。

4.3 底层推理算法

底层推理算法实现基于知识库的初步推理,推理过程主要考虑对本元认知逻辑的处理,而不考虑基于规则的间接推理,大多数底层推理算法不支持提问句型中带有“某字项”的情况,各算法实现如下:

1)算法4.3.1:“是一个/种”型问题底层求解

该算法用于求解“A 是一个/种 B”句型的问题,算法之所以称为“底层求解”,是为了区分于后续上层推理算法中,要继续介绍的属性值更高层求解算法(后文凡算法名称中带有“底层”的,均是此原因,不再介绍)。该算法对问题语句不支持包含“某字项”的情况,该算法即可以作为独立的问题求解算法,直接求解问题语句,也可在推理算法中作为其它推理算法的子环节使用,其实本系统的推理树中,除了最顶层的推理算法外,其它推理算法均具有这样的特点(即同时可独立推理或被其它推理算法转调),后面将不再一一说明。该算法实现如下:

(1)首先对单词A和单词B进行直接字符串比较,如相同,则返回成立,否则继续;

(2)调用算法4.2.2对单词A进行串类型检测,如果A为数值类型,而且单词B的字符串内容为“数值”,则返回成立,否则继续;

(3)通过知识库的框架槽值,检测单词A的类型,如果单词A的类型恰好与单词B相同,则返回成立,否则继续;

(4)检测单词B,如为字符串“单词”,且单词A为有效单词,则返回成立,否则继续;

(5)开始利用知识库中知识,检测单词A和B是否具有间接类别从属关系:首先构建open表和closed表,分别存储当前待访问的节点和已经访问过的节点,并先将单词A插入open表和closed表;

(6)从open表中取出首节点,利用算法4.2.9查找其在知识库单词表的位置,并遍历该单词对应的框架槽值列表,当遇到“是一个”或“是一种”槽时,如果且槽值与单词B相同,则算法返回成立,否则检测该槽值单词是否在closed表中存在,如不存在,则将槽值单词同时插入到open表和closed表,重复该过程,直到完成框架槽值列表的遍历;

(7)重复步骤(6),一旦找到与单词B的成功匹配,则返回成立,当open表已经为空且未找到成功匹配时,算法返回失败。

该算法考虑了对多种隐含逻辑的处理,包括单词A和B直接相同的情况、单词为数值常量的情况、单词B为单词A的类型描述的情况等,最重要的是借助知识库的框架机制,快速推理单词A和B是否具有间接类别从属关系,由算法的(5)到(7)步实现。此外,算法中对“是一个”和“是一种”的情况是统一处理的,但有些情况(如为了检测某单词是种类名词还是实例名词)需要加以区分,为此,可在算法的第(6)步中检测算法首次遇到的是“是一个”槽还是“是一种”槽,并依据此返回不同的标志即可。

2)算法4.3.2:“被包含于”型问题底层求解

该算法用于求解“A 被包含于 B”句型的问题,求解原理与算法4.3.1相同,只是没有其中前面几步的隐含逻辑处理,仅采用算法中(5)到(7)步的过程,只是将对“是一个/种”槽的匹配过程改成对“被包含于”槽的匹配过程即可,该算法实现过程略。

3)算法4.3.3:单词类型检测

按照上文介绍的单词类型定义规则,检测单词类型,算法实现如下:

(1)首先调用算法4.2.9检测单词在知识库中单词表的位置,并检测该单词对应的单词类型的槽是否已经填充了有效值,如果有,则直接返回该类型,否则算法继续;

(2)调用算法4.2.2,进行单词的串类型检测,如果是非法单词类型,则直接返回为非法类型,如果为数值类型,则返回为数值常量类型,如果为文本类型,则算法继续;

(3)设被检测单词为A,构建问题子句“A 是一个名词”调用算法4.3.1,如匹配成功,则再次确认返回值类型,返回为实例名词或种类名词,否则继续;

(4)构建问题子句“A 是一个相对称谓”调用算法4.3.1,如匹配成功,则返回为相对称谓类型,否则继续;

(5)检测是否为属性类型:构建模板语句“A 属性包含于”作为入口,调用算法4.2.13—格式化语句检索算法,该算法将会自动将满足“** A ** 属性包含于 **”格式的句子集全部检出,然后再利用算法4.2.7,对已检索出的句子集进行一一匹配测试,并设定匹配模板语句为“A 属性包含于 &*”,一旦找到有成功匹配的语句,则返回为属性类型,否则继续;

(6)按照第(5)步的方法,继续检测单词是否为属性值类型、属性单位类型,只要将上面步骤中的关键词“属性包含于”依次换成“属性值为”和“属性单位为”即可,如匹配成功,则返回相应类型,否则继续;

(7)当以上类型匹配均未成功时,则返回为非标类型(即未知类型)。

单词类型检测算法应尽量离线完成,一般在载入新的知识库并进行初始化时,遍历知识库单词表中的单词,检测其单词类型的框架槽值,如尚未赋值,则调用该算法检测出相应的类型并填充,这样在后续推理过程中,可直接访问框架槽值(见本节算法的第(1)步)来快速获得类型,但是当系统在人机交互过程中录入了新的单词或知识语句,应根据新增知识,定期对相关单词类型进行更新。

4)算法4.3.4:语句格式化比较

上文已介绍了语句格式化比较算法4.2.7,该算法同样用于格式化比较,但该算法位于整个算法体系结构的更上层,通过其它底层算法的支持,该算法具有更强的功能,最主要是体现在对“某字项”的支持,算法入口为模板语句、待匹配语句和“某字项”匹配模式,其中“某字项”匹配模式分为单向匹配模式和双向匹配模式(含义见算法实现),算法出口为“某字项”单词列表和匹配单词列表,算法实现如下:

(1)调用算法4.2.6,分别对入口的模板语句和待匹配语句进行归一化处理;

(2)调用算法4.2.3,分别获取入口模板语句和匹配语句的下一个单词;

(3)如下一模板语句单词为“&”,则再次获取其下一字符,两字符连接后如为“&*”,则将待匹配语句中剩余子句整体作为一个单词项,插入出口的匹配单词列表,同时将字符串“&*”插入出口的“某字项”单词列表,算法返回匹配成功;

(4)如果入口的“某字项”匹配模式为双向模式,则采用镜向模式再次执行算法(3)的步骤,即检测待匹配语句中下一单词是否为“&*”,成功后,将模板语句中剩余子句插入出口的“某字项”单词列表,而将“&*”插入出口的匹配单词列表,算法返回成功;

(5)检测当前获取的模板语句单词和待匹配语句单词,如果仅有模板语句单词为“某字项”,则提取该“某字项”单词的有效词根(去除某字以及后面的数字后缀),然后以当前待匹配语句单词、“是一个”、模板语句的“某字项”词根连接成问题语句,调用算法4.3.1的“是一个/种”问题求解,如求解失败,则算法整体返回失败,如求解成功,则将待匹配语句单词插入到出口的匹配单词列表,并将模板语句的“某字项”单词插入到出口的“某字项”单词列表,算法继续;

(6)如果入口的“某字项”匹配模式为双向模式,则检测当前模板语句单词和待匹配语句单词,当仅有待匹配语句单词为“某字项”或两单词均为“某字项”时,则采用镜向模式再次执行算法(5)的步骤;

(7)当两个当前单词均不是某字型,则直接检测两单词是否相同,不相同则返回匹配失败,否则继续;

(8)如两个语句均为到达结尾,则转步骤(2);

(9)如仅有某一个语句到达结尾,而另一语句还有剩余字符,则返回匹配失败;

(10)当两语句同时到达结尾时,最后对出口的“某字项”单词列表和匹配单词列表进行检测,要求相同的“某字项”单词必须对应相同的匹配单词,而不同的“某字项”单词也必须对应不同的匹配单词,符合条件则返回匹配成功,否则返回匹配失败;

该算法对上层推理算法有重要支撑作用,现举例说明算法功能:

对于以下入口语句:

模板语句:(某桌子 的 重量)是 某数值 千克 的;

待匹配语句:(桌子A 的 重量)是 25 千克 的;

匹配结果成功(假设“桌子A”等名词均已被正确定义类别,下文同理),并返回某字项单词列表为“某桌子”、“某数值”;返回匹配单词列表为“桌子A”、“25”。

对于以下入口语句:

模板语句:某桌子 与 椅子B 是 配套 的;

待匹配语句:桌子A 与 某椅子;

当入口的“某字项”匹配模式设置为单项模式,则匹配失败,如设置为双向模式则匹配成功,并返回某字项单词列表为“某桌子”、“椅子B”;返回匹配单词列表为“桌子A”、“某椅子”。

对于以下入口模板语句:

模板语句:某人_1 是 某人_2 的 同学 而且 某人_2 是 某人_3 的 领导;

当采用以下待匹配语句时:

待匹配语句:小张 是 小李 的 同学 而且 小李 是 小王 的 领导;

则匹配成功,且返回某字项单词列表为“某人_1”、“某人_2”、“某人_3”;返回匹配单词列表为“小张”、“小李”、“小王”。而对于同样的模板语句,采用下面待匹配语句时:

待匹配语句:小张 是 小李 的 同学 而且 小李 是 小张 的 领导;

则匹配失败,因为此时“某人_1”和“某人_3”两个不同的“某字项”对应了相同的匹配单词“小张”,不满足算法第(10)步的合理性检测。

5)算法4.3.5:类型树向上追溯求解

知识库中利用“是一个/种”句型,定义了各个概念的从属关系,本算法求解某入口单词的上层概念,以及上层的上层概念,直到最顶层概念,算法实现如下:

(1)设入口单词为A,首先构建open表和closed表,分别存储当前待访问的节点和已经访问过的节点,并将单词A插入open表和closed表;

(2)从open表中取出首节点,利用算法4.2.9查找其在知识库单词表的位置,并遍历该单词对应的框架槽值列表,当遇到“是一个”或“是一种”槽时,则检测该槽值单词是否在closed表中存在,如不存在,则将槽值单词同时插入到open表和closed表;

(3)重复步骤(2),直到open表为空,此时将closed中所有单词构成列表返回。

6)算法4.3.6:类型树向下追溯求解

该算法与上一算法相对应,但求解的是入口单词的向下追溯结果。但该算法无法借用框架槽值求解(因为知识库中的框架仅对类别的向上从属关系进行了描述),算法实现过程如下:

(1)设入口单词为B,首先构建两个closed表:closed1表和closed2表,表1用于存储从属于类型B的实例名词,表2用于存储从属于类型B的种类名词;

(2)检测满足从属于B的实例名词:调用算法4.2.13,传递入口模板语句为“是一个 B”,将符合“** 是一个 ** B **”格式的语句集检出,并遍历集合,一一调用算法4.3.4进行精确匹配,设定匹配模板入口句型为“某实例名词 是一个B”,对于匹配成功的语句,如果不存在于现有的closed1表,则将其插入closed1表;

(3)继续向下层类别追溯:调用算法4.2.13,传递入口模板语句为“

相关内容