6-Answer 系列-语义解析模块(一)

在之前的文章中已经介绍了系统的本体构建模块和本体查询模块,也就是说现在我们已经拥有一个本体库,并且封装了对本体库的基本操作。

接下来要解决的问题就是该如何解析用户的问题语义并构造出针对用户问题语义的查询语句,而这便是语义解析模块的任务,语义解析模块也是整个系统的重点和关键点。

这一篇开始介绍语义解析模块。

简单回顾

实际上在 Answer 系列的第二篇文章 1-Answer 系列-简介 中已经用最简单的方式介绍了语义解析的基本步骤。其中前 3 步:分词、依存句法分析、构建查询语义图就是语义解析模块的功能。

在阅读本文下面的内容之前可以再简单过一遍 1-Answer 系列-简介,重新在脑中建立其基本的原理。

分词

来看一段英文

Are you OK ? —— 饶舌歌手雷雷

再来看一段中文

明天会下雨吗?

我们可以看到英文的词与词之间是天然划分的,以空格为分隔符,计算机可以很容易的划分出一个个单词。

而中文行文却需要我们在阅读时自行切分并理解,因为中文并没有一个形式上的自然分隔符来做词语的切分。

而对于一个计算机系统而言,处理中文自然语言的第一个步骤便是对中文进行分词,即将中文文本按照一定的方法切分出词序列,这一过程即为分词。

分词作为大部分自然语言和语义理解相关工作的第一步,是后续处理的基础。在 Answer 系统中,分词的效果和正确率会直接影响最终的结果。

中文分词具有很大的难度和研究价值,所以一度是国内自然语言处理领域的研究热点。研究至今,已有各种行之有效的算法,相应的方法和工具都已经比较成熟。主要的方法大体可以分为以下三类:基于词典的分词、基于统计的分词、以及混合分词。

例如中科院的 NLPIR (原名称为ICTCLAS),其分词精度达到 98% 以上。Answer 最初采用过 NLPIR,但是感觉在开源方面做的不是很友好。最终是选择了一款包含了分词、命名实体识别、依存句法分析等 NLP 功能的开源 NLP 工具包——HanLP。

HanLP 由国人开发,在中文分词上提供了不同原理的实现,如最短路分词、N-最短路分词、CRF分词、索引分词、极速词典分词等,同时也支持用户自定义词典。

HanLP 使用 Java 语言开发,使用起来非常方便。只需调用如下代码,就可实现分词:

1
2
3
// question: 要进行分词的中文文本
// termList: 返回的词组列表
List<Term> termList = HanLP.segment(question);

源码以及更为具体的介绍请查阅:HanLP GitHub

命名实体识别

命名实体识别(Named Entity Recognition,英文简称 NER),指的是从文本内容中识别出具有特别含义的实体,例如人名、地名等。和普通名词不同,它们具有一定的特殊含义,而通常在一些具体应用中正确识别这些具有特殊含义的实体具有重要意义。

目前命名实体识别技术可以粗略分为基于规则和基于统计两类方法。

基于规则的命名实体识别具有准确率高,易于解释和理解等优点,但也存在可移植性差,人工参与程度高等缺点。

基于统计的识别方法则建立在统计模型之上,利用一系列的统计理论和数学模型来进行命名实体识别。基于此方法给出的结果将更加客观、灵活性好、易于移植,但给出的结果可能难以解释和理解,并且依赖于大规模的语料训练,语料库的质量将会影响最终的识别效果。

在 Answer 系统中,命名实体识别主要依赖于一个称为 Answer_Dict 的实体词典,这个词典曾经在 4-Answer 系列-本体构建模块(三) 中有过介绍。

词典在本体半自动构建的过程中生成,其中的每一个词条相当于一个实体,并且其中包含了实体类型这一关键信息。

所以 Answer 的命名实体识别过程非常简单,只是将分词得到的词组与 Answer_Dict 中的词条进行匹配。

小栗子

以 “美人鱼的导演是谁?” 为例,假设分词后结果为“美人鱼”、“的”、“导演”、“是”、“谁”、“?”。且词典中的词条有:
UUID | 实体名 | 歧义说明 | URL | 是否本名 | 类型
:-: | :-: | :-: | :-: | :-: | :-:
xxxxx | 美人鱼 | 2016年周星驰执导3D喜剧电影 | xxxxx | 1 | -2
xxxxx | 美人鱼 | 周杰伦创作歌曲 | xxxxx | 1 | -3
xxxxx | 美人鱼 | 人鱼生物 | xxxxx | 1 | -1
xxxxx | 美人鱼 | 林俊杰演唱歌曲 | xxxxx | 1 | -3

那么问句中的词组 “美人鱼” 则可以在词典中找到四种匹配,记录这几种匹配的所有信息,即此时 “美人鱼” 可以有四种解释,此时算是完成了初步命名实体识别。即识别出了 “美人鱼” 是具有特殊含义的实体,且具有以上几种不同含义。

补充:如何进一步进行实体识别?即根据语句的语义排除其他解释?即明白问句 “美人鱼的导演是谁?” 中的 “美人鱼” 指的应该是电影或音乐而不是生物?

这个涉及到后续处理,这里先讲一个基本原理:假设这四种解释都是对的,和语句中的其它词语继续组合,构成语义图并构建查询语句到本体库中查询,本体库中没有查询结果则代表当前解释是错误的,即假设不成立。如果存在查询结果,则认为当前解释是合理的。

以栗子来讲,便是假设 “美人鱼” 是一种人鱼生物是成立的,然后让其顺利的进行后续处理(构建语义图、构建查询语句等),然后去本体库查询,此时并会发现本体库中 “美人鱼(人鱼生物)” 这一实体压根就没有 “导演” 这一属性,此时证明问句 “美人鱼的导演是谁?”中的 “美人鱼” 不能识别为一种人鱼生物。

依存句法分析

1-Answer 系列-简介 一文中我们简单介绍过依存句法分析的概念:

依存句法是关于自然语言在语法层面上的一种解析,它将指出一个句子中各个词语之间的依存关系。

如“我爱编程”中,“我”和“爱”之间就存在主谓关系(SBV),其中“我”为主体,“爱”为谓语。而“爱”和“编程”之间存在动宾关系(VOB),其中“爱”为谓语动词,“编程”为宾语客体。

再如例句“美人鱼的导演是谁?”中就存在”美人鱼“和”导演“之间的修饰关系(ATT),其中“美人鱼”修饰“导演”。

依存句法分析的结果将作为下一步语义图算法的重要输入,所以依存句法分析的准确度要得到保障。在最初的版本中,Answer 使用 Stanford Parser 来进行依存句法分析,但是发现其中文的句法分析准确度不高。所以最终选择了 HanLP 的依存句法分析。

在 HanLP 中实现了很多种不同的依存句法分析,如 CRF、MaxEnt、基于神经网络的高性能依存句法分析器等。Answer 选择神经网络实现的高性能依存句法分析器进行依存句法分析。

HanLP 依存句法分析器的输入为 HanLP 的分词结果 List, 输出为 CoNLLSentence(其中含有 CoNLLWord[]),其中 CoNLLWord 为 HanLP 中定义的对象,其中的字段包括当前单词的 ID、单词名称、词性(粗粒度和细粒度)、所依赖的单词的 ID、依赖关系等。代码如下所示:

1
CoNLLSentence coNLLsentence = grammarParserService.dependencyParser(terms);

如果以 “美人鱼的导演是谁?” 为例句,则经过 HanLP 的依存句法分析函数之后,其输出如下所示:

2018-08-21-6-Answer-pic-1.png

其中第一列为ID,表示其在原来句子中的位置,第四列和第五列分别表示词语的粗粒度词性和细粒度词性。

现以第一句为例,其表达的句法依存关系为,ID为 1 的 “美人鱼” 依赖于 ID 为 3 的 “导演”,同时依赖关系为 ATT,也就是意味着 “美人鱼” 和 “导演” 之间存在修饰关系,并且是 “美人鱼” 修饰了 “导演”。

有了上图所示的这种句法依存关系,我们就可以按照语义图算法构建查询语义图。

下一篇

下一篇开始介绍语义图算法的原理和实现。

汪.