王佳琦,韩 军,孙启童
(北京航空航天大学 软件开发环境国家重点实验室,北京 100191)
自然语言处理包含众多的研究和应用领域,如机器翻译、人机对话、文本分类、信息检索等。不同的领域,对于语义的定义有所不同,也对语义提取的粒度及方式有着不同的需求。本文针对不同的语义提取场景,设计了不同的语义提取算法,将语句按照不同的语义模型进行提取。本文所提出的基于依存句法的中文语义模型及语义提取方法,对语义进行了结构化的表述,很好地区分了不同的语义提取场景,并在各个场景中取得了预期的效果。
国内对于语义模型的研究,主要有如下两种。基于词组本位语法的语义模型和基于依存句法树的语义模型。
基于词组本位语法的语义模型是由刘群[1]等人提出的,目的是实现一个汉英机器翻译系统。他们从配价语法、格语法和论元结构理论入手,在对这些理论进行了分析研究之后,构建出了这种通用的语义模型。1959年,法国语言学家Lucien T提出了配价语法[2-3]这一概念。配价语法以动词为中心,对不同的动词标以不同的价值,以此来描述不同实体之间的关系。所谓格语法[4],又被称为语法关系理论。“格”指的是不同词语,在不同语态环境中发生的变化,如常常被提起的“第三人称单数”,指的就是“格”的变化。所谓论元结构理论[5],则是注重于语句的语义处理,同时兼顾语句的语法处理。
基于依存句法树的语义模型,是直接使用依存句法分析[6]生成的树状结构作为语义模型。依存句法分析指的是,在分词和词性标注的基础上,识别语句中各个词语之间的依存关系。以“帮我买张从北京到上海的机票”为例,其依存句法树如图1所示。
图1 依存句法树示意图
近些年,哈尔滨工业大学在依存句法分析方面取得了突破性的进展。哈工大社会计算与信息检索研究中心花费数年搭建的中文自然语言处理平台LTP[7],同时兼具分词、词性标注、依存句法分析等功能。在Chinese Dependency Treebank(CDT)数据集[8]上,依存句法分析的准确率高达89.5%。
对于上述两种语义模型,都存在其各自的缺陷。基于词组本位语法的语义模型,其目的是实现汉英翻译系统,其对于语义提取的帮助,只能对单一场景下的单句有效,迁移性较差。基于依存句法树的语义模型,在假设依存句法分析正确的前提下,可以保证包含该语句的所有信息。但这样也会带来另一个问题,即语义模型所包含的信息太多,调用者难以分辨哪些是自己需要的,哪些是自己不需要的。同时,依存句法树的生成只依赖于自然语言处理工具,而其效果是由训练集和训练算法决定的,缺乏一定的泛化能力,对边缘数据的处理不够完善,对语义的描述存在一定的偏差。
语义特征指的是语言中构成意义的基本单位。1955年,Bloomfield提出了语义特征这一概念[9]。在汉语领域,朱德熙于1956年将语义特征用于分析汉语的语法研究[10]。
近些年,国内对于语义特征提取方法的研究,逐渐趋于统一。根据邵敬敏、周芍的研究[11],语义特征提取方法可以总结归纳为如下四种方法: 内省概括法、组合分析法、对立比较法和变换分析法。①内省分析法适用一个固定的语法结构,当想要了解其中某个词语的语义时,可以尝试将其替换为词性相同、含义相近的词语,然后对整个语句作出分析理解,进而概括总结该词语的语义。②组合分析法指的是,将两个或两个以上的词语进行组合后,可产生新的语义。新的语义一般与组合词的词性相关,不同的词性对应着不同的语义。同时,新的语义也会因为组合词所蕴含的意义太多,而呈现出复杂、多义的特点。③对立比较法,指的是针对一词多义这种现象,将该词的所有含义列举出来,然后分别举例,进行分组比较。④变化分析法一般适用于非正常语序的句子,可以将其转变成正常语序,然后通过分析得到语义特征。
语义特征的分析和提取,是直接建立在语言学基础上的,是自然语言最直接、最底层的分析方式[12]。由此可见,如何分析提取语义特征,对于研究语义提取方法有重要的指导作用。但是,上述方法更注重理论,并且均未定义语义模型。对于最终的语义表达结果,没有给出明确的定义。因此,上述方法并不能直接用作语义提取算法。
要构建语义模型,首先要定义何为语义。广义上来讲,语义指的是语言所蕴含的含义。不同的自然语言,基于不同的符号,这些符号起初不包含信息。人们对于相同的符号,有着相同的理解,此时这些符号便蕴含了信息。
语义模型的作用就是,从自然语言中提取信息,并对这些信息进行结构化的表述。因此,语义模型的构建,需围绕信息提取来展开。
精简语义提取场景,指的是用户在处理语句时,使用的语义数量相对较少,且语义均为普遍的社会常识,如目的地,出发地等。其特点是,数量较少的语义即可完成用户对语义提取的需求。
针对上述场景,本文提出了键值对语义模型。此模型使用key-value键值对的形式表示语义。其定义了所有语义项的key,并定义了其对应value所应满足的各种条件。例如,“目的地”是一种语义项的key,其value的定义是: 词性必须为ns,其在依存句法树中的父节点必须为“到”“至”等词语。对于例句“帮我买张从北京到上海的机票”,其键值对语义模型如图2所示。
图2 键值对语义模型示例
键值对语义模型依赖于汉语语法。本文从汉语词典中遍历了所有的汉语字词,将这些字词作为知识库的基本词汇,对它们的重要程度、语义本体、使用频率等属性进行总结。节选如表1所示。其中,“重要程度”值越小,该语义越重要;“使用频率”值越大,该语义出现频率越高。
表1 语义本体总结节选
本文对日常生活中经常使用的2 513个字词做了统计,针对字词的重要程度、使用频率对其进行划分,并将其映射到语义本体。其中,语义本体是一种key-value键值对。key的定义,主要是使用已有的、具有普适性的词语,去描绘其他使用频率较低的词语。例如,用“选择”作为“筛选”的语义本体,用“讨论”作为“商议”“商榷”的语义本体。其次,是使用意图明显的短语来描绘这些词语。例如,用“对人好”作为“善待”“善意”的语义本体,用“想便宜”作为“砍价”的语义本体。
键值对语义模型要求用户对不同的词语进行总结,存在大量的重复性劳动。同时,语义项中key的定义没有明确的规范,导致语义模型对于同一语义的描述缺乏标准。例如,在“从北京到上海”这个短语中,提取出的语义是“出发地: 北京,目的地: 上海”,而在“今天谁值日”这个句子中,提取出的语义是“询问: 谁”。其中,“出发地”“目的地”“询问”等key的定义,受主观因素影响,其本质是使用另一字符串来消除歧义。
随着语义的增多,键值对语义模型对于“键”的定义,有如下要求: (1)唯一性。在定义一个全新的“键”时,需对比所有已定义的“键”,避免产生歧义。(2)可读性。对于所有已定义的“键”,需配以相应的说明,阐述其具体含义。(3)扩展性。添加新键时,不与旧键产生冲突。这种对于“键”有较高要求的场景,本文将其定义为复杂语义提取场景。其特点是,该场景所需的语义较为复杂,对于“键”有唯一性、可读性、扩展性的需求。复杂语义提取场景是为了区分简单语义提取场景,指的是该语义模型中,含有更多的“键”,这些“键”是由后续开发者来定义的。而该语义模型的用户,只能使用已定义的语义,不能添加语义。
针对上述场景,本文提出了槽式语义模型。此模型对于“键”有了规范化的定义,可以表述任意语法特征。在语句中,根据汉语语言学的研究可知,句式和语义存在映射关系。因此,本文采用保留关键词的形式,对模型有如下定义: (1)保留汉语中的虚词,抽取实词; (2)对于被抽取的词,组织成数组的形式; (3)将被抽取后留下的空位,用“$+词性”的方式进行填充,得到的字符串作为“键”。对于例句“帮我买张从北京到上海的机票”,可以得到如图3所示的槽式语义模型。
图3 槽式语义模型示例
槽式语义模型,使用key-value键值对的形式表示语义。其中它的key是一个字符串,使用“$”作为一个槽(slot)的占位符,后面跟着的英文字母是这个slot应填入词的词性。value是一个二维数组,内层数组对应着各个slot所取出的值,外层数组是考虑到同一语句中,可能存在着多个相同的语义而设计的。
那么,对于语义模型的key来说,哪些字词该保留下来,哪些字词该换成slot,就成了至关重要的问题。在这个问题上,槽式语义模型给出了如下方案,即保留介词、关联词等结构性的虚词,将名词、代词等有着大量同属性的实词做为slot。语义模型的key值,使用“关键词+slot”的形式,实现了语义的唯一性、可读性及扩展性。只需将value中的值逐一填入slot中,就可得到语序正常、表意清晰的短语。后续开发者可以依据此规则,定义新的语义。
分词、词性标注及依存句法分析,包含了语句的全部信息。当语义提取对信息完备性有需求时,需要定义新的语义模型,来确保上述信息不会丢失。
针对上述场景,本文提出了树状语义模型。此模型定义了如表2所示的五种基本句式及三种修饰关系,用来描述语句所有的句法关系。
表2 树状语义模型句法表
此模型的特点是,保留语句中的大部分信息,对依存句法树进行重构,通过递归的方式,构建语义树。对于例句“我不知道他有没有去过故宫。”,其树状语义模型如图4所示。
图4 树状语义模型示例
同时,树状语义模型也可用于多粒度语义的提取。在图4中,例句的第一层是“s+v+o”的句式,对应的例句则是“我|不知道|他有没有去过故宫”。用户可以通过查询知识库的方式来分别获取s、v、o的具体含义。若知识库中包含该词语,则此时就已经完成了对语义的提取;若知识库不包含该词语,则需查询该节点下是否还有子节点,而它的子节点,也符合给定的句式。因此,用户只需对语义树进行遍历,并与知识库中的信息进行匹配,即可提取出语义信息。
自然语言是动态的,当语义提取对语义有新的要求时,需对语义进行扩充。此时,语义模型的扩展性会显得格外重要。本文将这种场景定义为扩展性语义提取场景。该场景允许用户设计并添加语义,与复杂语义提取场景有着本质的区别。
针对上述场景,本文提出了路径式语义模型。用户可以通过添加语义提取模板的方式,添加语义的提取规则,其示意图如图5所示。
图5 路径式语义模型示例
所谓路径,指的是在依存句法树中从根节点到叶子节点的路径。依存句法树示例如图1所示,对于这棵依存句法树,可以通过深度优先遍历,得到如表3所示的中间结果。
表3 依存句法树深度优先遍历结果
路径式语义模型,需要定义语义提取模板,然后将多个模板组合在一起。只有当语句满足所有的模板时,才会完成匹配。规定每个语义提取模板必须为奇数个元素,且奇数位元素形式为“词语+空格+词性”的形式,偶数位元素为依存句法关系。为了增加模板的灵活性,可以使用“$”符作为通配符。
路径式语义模型的存储结构如表4所示。
表4 路径式语义模型存储结构
Semantics为语义提取模板,只有满足模板,才可以说语句满足这一语义。Indexes为用户自定义要提取位置的索引。在用语义提取模板对语句进行比对后,如果语句满足所有的模板,就可以匹配出相应的值。但是,用户需要的不一定是所有的值,因此需要用户自己定义提取哪个索引对应的词。Formatting是预设字符串,用户可以将根据索引提取出来的词语填入该预设字符串中,得到用户自定义的语义。
基于关键词的语义提取算法使用了键值对语义模型和槽式语义模型,通过对词语的分类,首先确定语句中的关键词,然后对关键词的父节点、子节点、兄弟节点、祖先节点、子孙节点等进行逻辑判断,依次筛选出语句的语义项,组合生成最终的语义。
如图6所示,以语句“帮我买张从北京到上海的机票”为例,先使用自然语言处理工具对其进行分词、词性标注和依存句法分析,得到如图2所示的依存句法树。因为语句中存在“帮”和动宾短语,因此可以判断此语句是一个命令句。然后,确定关键词“帮”,其DBL边所指向的子节点是该命令的作用对象,此句中可定义为消费者,得到语义项“消费者: 我”;确定关键词“从”,其POB边所指向的子节点是“北京”,其词性为ns地点,得到语义项“出发地: 北京”;确定关键词“到”,其POB边所指向的子节点是“上海”,其词性为ns地点,得到语义项“目的地: 上海”。以此类推,得到最终的语义。
图6 基于关键词的语义提取算法示例
该算法的伪代码如表5所示。
表5 基于关键词的语义提取算法
树状语义提取算法是依据树状语义模型,对依存句法树进行整合,得到全新的树状结构的一种算法。树状语义模型包含“简单句”和“修饰关系”这两种句型结构,这两种结构又细分为“主语+谓语”“主语+谓语+宾语”“主语+谓语+补语”等句型结构。这里的句型结构并没有严格的规定,取决于用户对于句型的理解,用户也可以根据需求自定义句型结构。
如图7所示,以“我不知道他有没有去过故宫。”为例,介绍树状语义提取算法。首先构造依存句法树,然后使用层序遍历的方式遍历这棵树。这里以“主语+谓语+宾语”为例,当遍历到节点“知道 v”时,发现该节点的词性是动词,此时,已经找到了“谓语”,需要再找到“主语”和“宾语”。于是,递归遍历该节点的所有子节点,判断其子节点的arc值是否为“SBV”,是的话,则找到该动词的主语;同时判断其子节点的arc值是否为“VOB”,是的话,则找到该动词的宾语。找到“主语”“谓语”和“宾语”的节点之后,以这些节点分割句子,即可得到主语是“我”,谓语是“不知道”,宾语是“他有没有去过故宫”。递归时,“他有没有去过故宫”也会得到对应的结果,即主语是“他”,谓语是“有没有去过”,宾语是“故宫”。以此类推,得到最终结果。
图7 树状语义提取算法示意图
该算法的伪代码如表6所示。
表6 树状语义提取算法
可扩展的语义提取算法,是基于路径式语义模型而构建的,其示意图如图8所示。
图8 可扩展的语义提取算法示意图
图8以语句“帮我买张从北京到上海的机票”为例,先对依存句法树进行深度优先遍历,得到依存句法树的路径。然后,将路径分别与预设模板进行匹配,提取出目标信息。最后,将提取出的信息,填入到格式化字符串中,完成语义的提取。例如,路径“["帮 v", "VOB", "买 v", "VOB", "机票 n", "ATT", "张 q"]”,可以匹配模板“[["$ v", "VOB", "$ n"]]”,提取到语义“买机票”。
其扩展性主要表现在两个方面。首先,其没有针对某一个词语的复杂逻辑结构,而是由用户直接定义语义模板,用来对语句进行处理。当语句与所有模板都匹配成功时,则提取语义。其次,用户可以根据实际需求,控制语义提取的粒度。若用户对某个语义的准确率要求很高,那么只需设置多个语义模板,或者定义更长的语义模板,即可达到要求。若用户对某个语义的准确率要求不高,那么可以设置较短的语义模板。
该算法的伪代码如表7所示。
表7 可扩展的语义提取算法
本节以“怎么”“什么”“哪”“多少”“谁”这五个疑问代词为例,展示了如何通过语义模型及语义提取算法来提取语义。之后,使用北京语言大学提供的BCC语料库[12]进行实验,其中每个疑问代词对应的例句有1 000句,共5 000句例句。例句的实际含义为人工标注,各个实验的设计与结果如下文所述。
疑问代词“怎么”,在现代汉语词典中有五种含义,分别是“询问”“泛指”“虚指”“程度”“否定”。由于泛指和虚指对于语义提取来说,不具有明确的意义,而有些特殊语句可能包含两种以上的含义,如例句“大家怎么会没有意见呢?”,其中“怎么”的含义,既表示了询问,又表示了否定。因此,将泛指和虚指筛除后,将剩下的含义组合,给出了本文对于“怎么”的六种含义的分类,分别是“询问”“程度”“否定”“询问|程度”“询问|否定”“程度|否定”。
关于疑问代词“怎么”,本文仅通过对50条包含“怎么”的语句进行总结后,就可定义出20个语义提取模板,节选如表8所示。
表8 “怎么”语义提取模板节选
然后,本文使用表8所示的语义提取模板对BCC语料库中的1 000条包含“怎么”的语句,使用定义了20个语义提取模板的可扩展的语义提取算法进行了语义提取测试,结果节选如表9所示。
表9 “怎么”语义提取结果节选
由表8、表9可知,当语义提取模板设计过短时,可以与更多的语句进行匹配,得到更多的语义提取结果。这些结果并没有优先级的设定,会被填入一个二维数组中。这也印证了汉语的复杂性。例如,同一句话,既可以是询问,也可以是否定。对于这种情况,用户可以在设定格式化字符串时,传入不同的数字,代表不同的优先级,然后对得到的语义结果进行排序和取舍。
对于基于关键词的语义提取算法及树状语义提取算法,这两种算法不支持额外的配置,因此直接对实验数据集中的语句进行了语义提取实验。与使用了20个语义提取模板的可扩展的语义提取算法进行对比,其准确率如表10所示。
表10 三种语义提取算法准确率对比 (单位: %)
由表10可知,对于定义了20个语义提取模板的可扩展的语义提取算法,其准确率与基于关键词的语义提取算法各有优劣。这种情况主要由模板数量及质量决定。由4.3节实验可知,当模板数量逐渐增加时,可扩展的语义提取算法效果会越来越好。同时,当定义的模板适用于更多语句时,其提取效果会更好。对于树状提取算法,其准确率均处于80%以上,不符合正常语序的句子,如倒装句等,会造成树状语义提取出错。
针对语义提取方式的可行性与扩展性,本文通过扩充模板数量的方式,分别使用了10个、15个、20个、25个、30个语义提取模板,对“怎么”、“什么”、“哪”、“多少”、“谁”五种疑问代词进行了语义提取实验。实验所使用的数据取自北京语言大学的BCC语料库,每个疑问代词有1 000条语句。最终的结果如表11所示。
表11 语义提取准确率 (单位: %)
由表11数据可以绘制出如图9所示的模板数量对于语义提取效果影响折线图。
图9 模板数量对于语义提取效果影响折线图
由图9可知,随着模板配置数量的提升,各个疑问代词的语义提取准确率也逐渐升高,且总体上有放缓的趋势。从20个模板以后,折线都趋于平缓。这是因为,模板的数量已经足够大,足以正确提取90%左右的语句。而提取错误的语句,通常是一些边缘数据,针对这些边缘数据设计的语义提取模板,泛用性相对较低,因此折线会趋于平缓。
另外,图中不同折线的高度略有不同。“怎么”有六个类别,“什么”有四个类别,“哪”有三个类别,“多少”有六个类别,“谁”有两个类别。一般来说,类别多的疑问代词,语义提取效果会更好。但在30个模板时,“多少”的准确率超过了“怎么”,这是由于语义提取模板的设定和数据标注不准确导致的。语句中词语的含义无法量化,存在一定的主观误差。
本节采用包含“多少”的语句,共计1 000条,语料来自于北京语言大学提供的BCC语料库,类型为人工标注,该数据集的详细信息如表12所示。
表12 数据集详情表
该数据集有以下特点:
(1) 样本规模小;
(2) 数据分布不均匀;
(3) 不同含义的语句句法结构类似。
中文文本分类任务,现阶段的主流解决方案是深度学习。于是,本文与基于深度学习的中文文本分类算法TextCNN[13],TextRNN[14],FastText[15],TextRCNN[16],TextRNN_Att[17],DPCNN[18],Transformer[19]做了对比。训练集、验证集和测试集的比例为3∶1∶1,保证在各个集合中每一类所占的比例相同。使用上述方法,对本节给出的数据集进行训练测试,各模型的准确率如表13所示。
表13 文本分类算法准确率 (单位: %)
由表13可知,TextCNN,TextRNN,TextRCNN,DPCNN和Transformer的准确率均为85.94%。TextRNN准确率为86.72%,FastText准确率为85.16%。
以模型的最高准确率86.72%为基准,与不同模板数量对应的分类效果做对比,可得到如图10所示的折线图。
图10 语义提取算法与文本分类算法对比折线图
由图10可知,当模板数量少于25个时,各模型的准确率都高于语义提取算法。当模板数量达到25以上时,语义提取算法的准确率会超过上述模型,并仍保持了增长的趋势。
综上所述,当样本规模小,分布不均匀,且各个分类的区别不明显时,随着模板数量的增加,语义提取算法的准确率会越来越高,最终超过上述模型。因此,语义提取算法在处理上述数据时,有明显的优势。
本文主要通过对语言学理论体系的研究,总结归纳汉语的语法特点,使用自然语言处理工具的分词、词性标注及依存句法分析的结果,提出了基于依存句法的语义模型,提出了相应的语义提取算法。
本文充分地分析研究了汉语的语法特点,在此基础上,提出了四种不同的语义模型,分别是键值对语义模型、槽式语义模型、树状语义模型及路径式语义模型,这些模型分别适用于不同的语义提取场景,然后提出了对应的语义提取算法,分别是基于关键词的语义提取算法、树状语义提取算法及可扩展的语义提取算法。最后,使用BCC语料库的5 000条语句,进行了语义提取实验,验证了上述语义提取方法的可行性与优越性。
上述模型与算法,均适用于训练数据少的应用场景。用户只需总结特定场景中常见的语法特点,即可制定出相应的语义提取规则,从而完成对语义的提取。其次,对于跨场景的情况,存在大量的可重用的语义提取规则,可以直接用于不同场景下的语义提取。因此,该方法对于训练数据少的应用场景,有着更好的适用性,且弥补了传统算法可迁移性差等缺点。