基于组块的自然语言理解解决方案
问题背景:
自然语言理解的一般流程:词法分析->句法分析->语义分析。
查询式自然语言问句一般为祁使句和疑问句,语句结构有一定规律可寻。词法分析是基础,句法和语义分析是关键。通过对大量问句的考察,发现可以从其中分出具有固定构成结构的组块,因此在句法分析过程中,通过不断的组块,来实现对语句结构的理解,并通过组块,获得语句的语义信息。
解决方案:
一.切词并标注词性
1.分词
利用中科院计算所开发的ICTCLAS分词算法,实现分词标注,将原词和它的词性,存入一个链表WordLink中。WordLink中每一个单元为Word。
Word结构:
中文字串 | 词性 | 属性 | 所在表格 | 所在表格对应字段 | 是否指示代词 | 指示内容 | 是否有聚集功能 | 聚集语义 | 是否有其他语义 | 其它语义 |
词表结构与Word结构大致相同
ID | 中文字串 | 词性 | 属性 | 所在表格 | 所在表格对应字段 | 是否指示代词 | 是否有聚集功能 | 聚集语义 | 是否有其他语义 | 其它语义 |
2.进一步区分词性
为了后面组块和语义分析的需要,需要更细粒度的词性划分。有些词性的识别可能是ICTCLAS分词系统所不能支持的,因此需要进一步分析。如动词分成系动词,查询动词(表查询的词,如查出,列出等等),一般动词等等,代词分出指示代词,疑问代词等等。这一步细分,需要借助特殊词库来完成。进一步细分后的结果,仍存入链表WordLink中。
3.消除指示代词
通过对上下文的分析,将指示代词换成它实际指示的名词或名词词组。主要是针对第三人称指示代词。一般采用就近原则。结果存入WordLink中。
二.句法分析
1.组块的定义
定义I:组块(chunk)是一种结构,是符合一定句法功能的非递归短语。每个组块都有一个核心词(head),组块围绕核心词展开,以核心词作为组块的开始或结束。非递 归 就 是说不存在组块之间的递归调用。本文中则不允许一个组块内包含其他组块的情况。也就是说,如果一个词序列可以构成某种类型的组块,那么它的内部即使有形成其他类型组块的可能性,也不会产生其他类型的组块。我们没有过多考虑组块是否可以最终连接成句,而是达到一个对句子进行组块划分的目的,得到各种类型的组块。组块之间不存在层次的问题,所有组块都位于同一个层次上,即组块是平等的关系。由于汉语的语法特点,对组块的定义与Abney也有一些不一致性,Abney的定义中组块的核心词作为组块的结束,核心词后的从属成分另起一个组块,而我们定义中,组块核心词也可以作为组块的开始。例如组块“拿到”的核心词是“拿”,“到”作为核心后面的从属部分。同时引入了绍功的组块类型,保证句中任何一个词都可以归入一种组块类型中去。组块之间不会出现交叉性。进行组块划分应该遵循以下的原则:
(I)组块的非递归定义。各种组块类型在构成上都是平等的,任一个组块都严格符合一
定的语法规则,且不能由其他类型的组块构成。
(2)组块之间不发生重叠,由于组块的定义都是由非终结符(即词性标注)组成,不存
在嵌套的现象,并且在发生歧义时遵守最长匹配原则,在能够构成大组块的情况下,屏
蔽小组块。因此组块之间不发生重叠。
(3)覆盖原则,我们在划分组块时,要保证句中每一个汉词都能够归入一个组块内,因
为我们定义了非组块的组块类型,对于一些词(如:连词和虚词),在不能被归并到其
他组块时,则归入到非组块类型的组块内。
在汉 语 中 定义的组块类型有名词组块、动词组块、形容词组块、副词组块、介词组
块、“的”字组块、“地”字组块、量词组块。组块是严格按照语法定义的,而不是按照
语义和功能进行定义,因此它与关系紧密的短语(根据搭配关系、语义一致性、互信息
等形成)是有区别的。因此组块可以看作是一种特殊的短语。这里我们定义的组块,也
是看作是构成语句的最小句法功能单位,不能包含其他的组块。
由于 组 块 是符合句法关系的,因此对于任一种组块类型都具有严格的定义,由一些
语法规则和描述来定义各种类型的组块。
2.组块的分类:
规定每个组块的核心成分是可能形成查询条件字段和查询目的字段的部分,多是名词。
第一类组块:
名词组块NP:最基本的名词短语,可以是单个名词,形容词+名词偏正名词短语,或者名词+连接词+名词+。。。并列名词短语,或者是名词+同位词 同位语名词短语。注意,无连接词连接的若干名词,认为每一个名词是一个名词组块。该类组块的核心部分是其中的名词。
形容词组块AP:副词+形容词。该类组块往往具有聚集含义,可以通过查词表获取。
第二类组块:
介宾组块JP:介词+名词。该类组块的核心部分是其中的名词。
疑问组块YP:单个疑问代词或者疑问代词+名词,对于后者,名词是核心部分。
比较组块BP:比较词+名词。这类组块中的比较词多代表一个语义符号,名词是个串值。
第三类组块:
主系表组块ZXBP:NP+系动词+NP,NP+AP,NP+JP,NP+BP
该类组块往往对应一个数据库的查询条件,有完整的语义,语义解析有基本规定的模式。
第四类组块:
“的”字组块DP:ZXBP|NP|AP|JP|BP|DP+”的”+NP
第五类组块:
完整组块WP:最大的组块,代表一个完整的问句的结果
查询动词符号记作SV
P-〉(SV)DP*NP*(YP)或者 (SV)NP*DP*(YP),*代表零个或多个,NP或DP是通过连接词或者标点符号连接的。它的语义分析模式是:如果含有YP,并且YP如果有核心成分,则其核心成分是整个句子的查询目的。否则,最后一个的NP或DP的核心成分是整个句子的查询目的。
3.组块的标注
对每 一 个 词进行组块标注后,能够充分表示各种类型的组块,因此组块的标注过程
是组块识别和划分工作的具体实现。例如:
查询学号为001的学生的姓名。
[P 查询[DP[DP[ZXBP [NP 学号]为[NP 001]]的[NP 学生]的[NP 姓名]]
每一个组块用[]括起,在[后注明组块类型。组块的嵌套关系用括号的嵌套来体现。
4.组块的流程
共分五层,每一层的产生式:
第一层:NP-〉n|adj+n|n+(link+n)*|n+np(同位词)
AP-〉adv+adj
第二层:JP-〉prep+n|prep+NP
YP-〉question pron+n| question pron+NP
BP-〉compare word+n| compare word+NP
第三层:ZXBP-〉NP+系动词+NP|NP+AP|NP+JP|NP+BP
第四层:DP->ZXBP|NP|AP|JP|BP|DP+”的”+NP
第五层:P->(SV)DP*NP*(YP)|(SV)NP*DP*(YP)
组块的流程就是在字串中插入组块边界和组块类型等句法标记。组块流程是根据人工书写的语法规则来进行的。组块系统包括多个层级,分析逐层进行。每一层的组块是在上一层组块的结果的基础上进行的。由上分析,共有五类组块。我们规定每一类组块构成一个层次,或者说该层只分析这一类的组块。因此,规则集合共有五个层次。最底层主要是产生NP,AP等较小的组块,然后依次向上一个层词,可能得到JP,ZXBP,DP,最高层得到一个完整的组块P,是一个句子的分析。在每一层的组块过程中,从左到右分析句子,根据词性或者属性信息看能否匹配该层允许出现的组块,一旦匹配成功,进行组块的标注。在模式匹配过程中,如果遇到冲突,则按最大匹配原则选择合适的模式。注意,在第四个层次,针对“的”字组块,可能需要地递归的分析,因为其产生式含有递归成分。
在形成第一个层次的组块的过程中,要同时生成并保存其核心词。核心词在语义分析过程可能需要传递,最终帮助生成查询条件和查询目的。
三.语义分析
这一步通过对组块结果的分析,形成参数表。这一步主要完成挖掘语义信息的任务。
算法所需数据结构:
堆栈:暂存组块开始符和组块类型
队列:暂存核心词
算法流程:
从左到右依次扫描组块结果字串,遇到[,将其和组块类型符号共同压栈。遇到]时。将栈定的[和组块类型符号弹出,[和]配对,然后根据组块类型符号,和该组块中各词的信息,确定能否生成一个完整参数,如果能生成,则将该完整参数填入参数表,填充这个参数各个字段的信息,其中主要是填充核心词和条件操作符(连接字段和串值的符号)和串值。完整参数是指可以生成一个查询条件或查询目的的参数。组块类型符号暗示了这类组块能否生成完整参数,如果能生成,组块类型符号还暗示了这类组块的语义生成模式,例如“的“字组块不能生成完整参数,它的核心词往往需要传给上一级组块进而处理;又例如,主系表组块可以生成一个完整参数,参数的核心词是作为“主”的那个成分的核心词,条件操作符是系动词,串值是作为“表”的那个成分的核心词。在不能生成完整参数的时候,一般伴随核心词的往上传递。
参数表上层分析和下层分析的界面,它的引入,是为了体现分层思想。
参数表结构:
参数字符串(核心词) |
参数属性(条件还是目的) |
条件连接符 |
串值 |
所在表格 |
所在表格中对应字段 |
特殊语义 |
__
其中特殊语义字段用来存储参数特定的语义信息。
例如:
针对[P 查询[DP[DP[ZXBP [NP 学号]为[NP 001]]的[NP 学生]的[NP 姓名]]
前面的[和组块类型依次压栈,一直到学号后面那个],将栈定的[和NP弹出,通过在词表中查询“学号”,发现其没有独立语义,则不能生成完整参数,在队列中保存核心词“学号”,继续扫描,[和NP压栈A,遇到],A栈定[和NP出栈,查表,001不具有独立语义,作为核心词存入队列,再次遇到],[和ZXBP出栈,ZXBP类型组块可以生成完整参数,从队列中取出核心词,依次写入参数的核心词和串值字段,参数属性字段填充“条件”用系词对应的符号填充条件连接符字段,通过查此表填充参数的其他字段,这样添加完一个参数,继续扫描,作同样处理。。。。。直到遇到最后一个],对于P型组块,生成查询目的参数,从队列中取出最后一个核心词,填入参数表,参数属性注为“目的”。
四.生成结果
这一步生成最后的结果SQL,通过对参数表的扫描,生成最后SQL.
算法流程:
扫描参数表中的每个参数,考察它的所在表格字段,计算出共涉及几张表。
如果是单表查询,转单表查询SQL生成模块。
如果是多表查询,转多表查询SQL生成模块。
多表查询的SQL生成过程中需要加入表与表连接条件,需要借助一张表来实现。
应用数据库表间连接字段表结构:
| 表1 | 表2 | 表3 | 。。。 |
表1 | 表1表2连接字段 | 。。。 | 。。。 | 。。。 |
表2 | 。。。 | 。。。 | 。。。 | 。。。 |
表3 | 。。。 | 。。。 | 。。 | 。。。 |
生成的sql是模板化的:
单表SQL模版:
select [字段]
From [表]
Where [条件集合]
多表SQL模版(采用连接式):
select [字段1],[字段2],[字段]3
From [表1], [表2], [表3]
Where [表1].[连接字段12] = [表2].[连接字段12] and
[表2].[连接字段23] = [表3].[连接字段23] and[条件集合]
五.可行性分析
在自然语言理解的众多方法中,组块是一种较常用的方法,它通过对词性的分析,把句子分成一个个意群,为对句子进一步的理解打下了基础。针对自然语言一般查询问句形式比较整齐简单,有一定规律可寻的特点,采取汉语组块的方法,不失为一种较好的解决方法。通过对大量(500多条)的问句的观察,我们手写了几条规则。这些规则,为组块提供了很好的依据。在组块匹配的过程中,关键是低层次组块的匹配,因为第一步理解错了,后面的组块肯定也是错的。在原子组块的匹配过程中,我们可以好好利用词表的功能。在词表存储一些有助于低层组块辨别的规则。由于固定词性成分的组块,往往只有独一无二的理解。所有我们不用担心组块语义的解析。另外,当组块匹配过程中出现冲突时,我们采有最大匹配原则。
参考文献:
1.李素建,汉语组块计算的若干研究,中科院计算所,2002年。
2.周美希,汉语语句组块及消歧的研究与实现,电子科技大学,2004年。
3.詹思瑜,《自然语言的计算机处理模型》,电子科技大学,2003。
4.高荣钊,句法结合语义的分析方法在机械产品设计领域中的应用,西安电子科大,2005