7-Answer 系列-语义解析模块(二)

在上一篇文章中我们介绍了语义解析模块中的分词和句法分析,句法分析输出的结果是语句的句法依存关系,而依据这个句法依存关系就能按照语义图算法构建查询语义图。

这一篇介绍语义图算法及其实现。

语义图算法简介

在北京大学徐坤的论文《面向知识库的中文自然语言问句的语义理解》中,提出了一种利用 Stanford Parser 的句法分析树构建查询语义图,从而获取用户自然语言表述的语义的方法,这种方法我称之为语义图算法。

在最终构建的语义图中,图的顶点代表着名词或命名实体,顶点之间的连线代表顶点之间的联系。

论文中提到,经过统计,发现问句的实体有将近 90% 左右概率是名词,而其中的关系有 80% 的概率是名词或者动词。因此基于这个统计我们可以认为语义图算法在自然语言理解的处理上有一定的准确性和实用性。

语义图算法详解

基于上述的统计,语义图算法的原理为:

分析问句中各个单词的词性,如果是名词,则构造名词性结点,并将名词性结点区分为两类,一类为上一步提到的实体词典中的命名实体,如 “周星驰、周杰伦、美人鱼” 等,另一类则是普通的名词性变量,如 “导演、母亲” 等。

根据词性找到名词性结点后,我们需要分析单词之间的依存关系,如果名词性结点之间存在修饰关系,如 “美人鱼的导演” 问句中,并存在 “美人鱼” 修饰 “导演” 这一关系,其中 “美人鱼” 可称为修饰词,而 “导演” 可称为被修饰词。在此基础上,如果被修饰词是名词性结点(而不是命名实体),我们并可构建一条从修饰词到被修饰词的边,并且边上的关系名称为被修饰词的名称(即例句中的“导演”一词)。

仍然以 “美人鱼的导演?” 为例,其构建的语义图如下图所示:

2018-09-05-7-Answer-pic-1.png

上述为对名词性结点的处理。

而对于词性为动词的单词,我们构造动词性结点,并且以动词为核心,根据依存句法分析的结果找出动词的主体动词的客体,也就是谓语的主语和宾语,然后构建出主体-动词-客体的有向图关系。

现在以 “美人鱼的导演是谁?” 为例,其中 “是” 为动词,再根据上一节中提到的依存句法分析的结果,很容易并能得出谓语 “是” 的主语为 “导演”,而宾语则是 “谁”,因此我们并可以获得图关系:导演-是-谁,最终结合之前的名词性结点的处理结果,我们构建查询语义图如下图所示:

2018-09-05-7-Answer-pic-2.png

其中 美人鱼-导演-导演 为名词性结点处理的结果,导演(主体)-是(谓语)-谁(客体)则是动词性结点处理的结果。

语义图算法实现

在论文《面向知识库的中文自然语言问句的语义理解》中已经给出了基于 Stanford Parser 句法解析树的语义图算法实现的伪码。但在 Answer 系统中依存句法分析采用 HanLP 的结果,所以过程稍微有点不同。

在 Answer 系统中语义图算法最终实现的主要步骤如下:

  1. 第一次遍历依存关系分析后输出的结果
  2. 找出其中的名词性词语,构建名词性结点,并加入到名词性结点集合中
  3. 找出其中的动词性词语,根据依存关系,找出谓语的主体和客体(如果是ADV,构建新词组,这一点是自己对语义图的一个还没有验证准确度的小优化)
  4. 结束遍历
  5. 第二次遍历依存关系分析后输出的结果
  6. 根据依存关系,建立名词性结点集合中修饰词和被修饰词之间的图关系
  7. 结束遍历

Answer 系统语义图算法的伪码如下:

1
2
3
4
5
6
7
8
9
10
for (CoNLLWord coNLLWord : coNLLsentence) {
if (this.isNounWord(coNLLWord.CPOSTAG))
添加结点到名词性结点集合中
if (this.isVerbWord(coNLLWord.POSTAG))
找出其主谓宾
如果是 ADV,则构建新词组(如 出生地方)
}
for (CoNLLWord word : coNLLsentence) {
遍历名词性结点集合,造出修饰关系的名词构建成图
}

算法实现过程如下图所示:

2018-09-05-7-Answer-pic-3.png

语义图算法的实现源码可见 查询语义图算法源码

下一篇

人类的自然语言极其复杂,并非构造出查询语义图之后,就能完成语义理解。例如将 “星爷的年龄?” 这条问句构建成语义图之后,仍然存在很多需要解决的问题,如句中的星爷指代着谁,是否是某一个实体的别名?如果问句为 “星爷的年纪?” 那我们该如何解析等等。

在构造出查询语义图之后,我们后续还需要解决同名实体和实体别名(实体消歧)问题,同时也需要进行谓语消歧的处理。

下一篇将介绍这些处理过程。

汪.