基于知识图谱的子图检索——KBQA的一种实现

基于知识图谱的子图检索——KBQA的一种实现

本文是对论文《Answering Natural Language Questions by Subgraph Matching over Knowledge Graphs》的一些个人解读,如有错误,多谢指正。

介绍

  • KBQA

    即基于知识图谱的问答系统,一般的实现为:

    1. 将已有的知识转化为结构化的数据,一般为RDF格式的数据,即三元组, 形成知识图谱,如下图:
      基于知识图谱的子图检索——KBQA的一种实现_第1张图片
    2. 将需要理解的query转化为SPARQL语言,使用SPARQL语言来检索知识图谱,SPARQL使用起来类似于sql语言,但是更加复杂,这里不对其做过多讲解。如下图:
      基于知识图谱的子图检索——KBQA的一种实现_第2张图片

那么这里就有两个和很明显的问题需要解决:

  1. 如何将query转化为SPARQL?
  2. 转化后的SPARQL检索出多个结果后,哪个才是最好的?

对于第二个问题很好解决,取匹配度最高的即可,所以此篇论文讨论的重点套路的问题在于第一个问题。
从query到SPARQL的过程,涉及到了query理解,就很容易出现歧义问题,主要包含两个方面:

  1. 短语链接,如何将query中不同的短语链接到正确的实体/关系/属性上
  2. 组合问题,提取出的实体/关系/属性,不同的组合方式,会产生不同的理解,这就是歧义问题。

正是因为歧义问题的存在,所以大多数的query到SPARQL的实现,是采用模板匹配的方式,事先写好不同query的模板和SPQRQL,用来匹配用于话术,但是这一工作是很繁琐的。
因此,这篇论文提出了子图检索的方法,来实现知识图谱的检索见下图:
基于知识图谱的子图检索——KBQA的一种实现_第3张图片

这种方法不需要事先建立模板,首先通过语义依存关系建立query图,然后将query图到图谱中的图中去检索,来找到最佳的匹配,即是答案。同时解决了歧义问题和评分问题,本方法对复杂问题分析非常有效。

方法

对于query图的建立,论文提出了两种方法:

  1. 关系优先方法
  2. 节点优先方法

关系优先方法(Relation-First FRAMEWORK,RFF)

基于知识图谱的子图检索——KBQA的一种实现_第4张图片
离线工作:

建立关系词典,即关系-关系指称的词典,类似于:
基于知识图谱的子图检索——KBQA的一种实现_第5张图片
其实就是一个大词典

在线工作:

- 建立关系语法图(Semantic Query Graph)

首先通过Stanford Parser 构建query的依存关系树Y

因为已经建立了关系词典,所以在语法树Y中的每一个节点(词)wi,找到包含wi的关系指称,然后使用深度优先遍历,遍历Y中所有以wi为根的子树,如果该子树和关系指称词典中的所有的字都匹配,即认为找到了一个关系指称。

找到关系指称后,就需要寻找与该关系对应的主语和宾语,论文根据统计分析,基于依存关系树中边的词性,统计出了subject-like边和object-like边:
在这里插入图片描述
然后分析关系指称与句法依存树,若在依存子树y中有点w是可以被匹配为类/实体,则认为这个w是关系指称的一个主语;否则,观察w与它的子节点中,是否被 subject-like 的边相连,若是的话,这个子节点就是这个关系指称的主语。同理,若 w 与子节点被 object-like 的边相连,那么关系指称的宾语就是这个子节点。如果经过这种规则处理,找不到对应的主语/宾语,那么就需要应用一些高阶规则。如下图:
基于知识图谱的子图检索——KBQA的一种实现_第6张图片

已知的关系指称为“budget of”与“direct by”,由于“file”是匹配于实体或类,且“of”与子节点“film”之间以object-like的边pobj相连,所以“film”是关系指称“budget of”的宾语。此外,虽然“is”与“budget”由subject-like的边相连,但是“is”并不是一个可以匹配到实体/类的节点,所以“is”不是“budget of”的主语。根据前面所述,与“budget of”最相近的wh-词是“what”,那么它就是“budget of”的主语。

- 子图检索

通过上面的步骤,即得到了query图 Qs,然后通过Qs到知识图谱的图中去匹配就完事了。
Qs中每一条边都有匹配的候选谓词,每一个节点都有对应的候选实体,通过已经建立的词典,可以得到匹配的分数,全部匹配完成后,取分数最高的即可。

节点优先方法

基于知识图谱的子图检索——KBQA的一种实现_第7张图片
离线工作:

建立节点词典

在线工作:

节点的识别

通过已经建立的节点词典,在query中识别节点,节点的识别很简单,trie树,或者AC自动机,都可以。

比如对于例句“What is thebudget of the film directed by Paul Anderson and starred by a Chinese actor?”可以识别出“what”、“film”、“Paul Anderson”、“Chinese”、“actor”

关系的填充(即节点的组合)

有了节点之后,一对节点之间肯定有不同的路径相连,所以这里形成的图是一个超级语义查询图Qu(super semantic query graph),而 Qs 是其一个子图,虽然也是通过依存关系来建立这个图,但是这个图比RFF鲁棒性更高。

在依存关系图中,如果两个节点之间有边相连并且没有其他节点,则这两个节点之间的边就被认为是关系
基于知识图谱的子图检索——KBQA的一种实现_第8张图片

如上图:点“film”与点“Paul Anderson”、“actor”之间都没有其余节点存在,所以“film”与“Paul Anderson”存在关系,关系指称为“directed by”;“film”与“actor”存在关系,关系指称为“directedstarred by”,由此得到了节点间的关系指称。当两个节点之间的指称没有label时,如“Chinese”和“actor”,那么若两个节点都为实体/类,那么在知识图谱中将这两个节点间的关系填入;若其中一个节点为通配符,则在知识图谱中定位另外一个节点,取与其连接频数最高的那些谓词作为候选关系填入。

子图检索

有了Qu,Qu中包含所有的节点,而不同的节点组合,即出现了不同的Qs,将Qs与图谱去匹配,寻找最优匹配。可以采用动态规划的方法。

首先,选择候选集最小的节点作为开始节点,然后将Qu中与该节点相连的边加入形成Q,判断Q是否能够和图谱匹配,如果匹配,则继续加入边和节点,如果不匹配,则删掉这个边进行回溯,直到 Q 是 Qu 的包含了 Qu 所有节点的子图,则找到了一个查询子图。

实验

CFF比RFF要好,而且总体效果也还不错,此处不再赘述。具体实验结果可以参看参考文档2

参考文档

  1. 《Answering Natural Language Questions by Subgraph Matching over Knowledge Graphs》
  2. https://blog.csdn.net/TgqDT3gGaMdkHasLZv/article/details/80823385

你可能感兴趣的:(基于知识图谱的子图检索——KBQA的一种实现)