KB-QA:基于语义解析的方法

本篇总结几乎全部来自 https://zhuanlan.zhihu.com/p/25759682,只是为了便于自己阅读理解,自己敲了一遍方便自己阅读,这个系列写的很好,推荐大家阅读原文。

我们从传统方法之一的语义解析(有时也被称为语义分析)开始,以一个经典的语义解析baseline方法为例,介绍语义解析如何进行KB-QA。该方法来自斯坦福Berant J, Chou A, Frostig R, et al. 的Semantic Parsing on Freebase from Question-Answer Pairs,文章发表于2013年的EMNLP会议。

什么是知识库

“姚明是中国人”,“奥巴马是美国总统”,这种类似的语句就是一条条知识,而大量的这种知识汇集在一起,就是知识库。我们平时能查到的百度百科,维基百科等等里面拥有着大量的知识,可是这些知识的组件形式都是自然语言,都是非结构化的,适合人们阅读而不适合计算机来进行查询处理。为了方便计算机来进行理解和处理,我们需要结构化的,简洁化的方式来表示知识,这就是三元组(triple)

“奥巴马出生在火奴鲁鲁。”这条知识用三元组来表示就是(BarackObama, PlaceOfBirth, Honolulu)。

我们可以把三元组简单的理解为(实体entity,实体关系relation,实体entity),如果我们把实体看作是结点,把实体关系(属性,类别等等)看作是一条边,那么包含了大量三元组的知识库就成为了一个庞大的知识图。被谷歌收购的Freebase包含了上千万个实体,共计19亿条triple,这个Freebase的操作使用好像还有点麻烦,之后用到的话要花一段时间来研究。

什么是知识库问答?

知识库问答(knowledge kbas question answering,KB-QA)即给定自然语言问题,通过对问题进行语义理解和解析,进而利用知识库进行查询、推理得出答案。
image

知识库问答的主流方法

目前对于KB-QA的方法,传统的主流方法可以分为三类:

1.语义解析(Semantic Parsing):

主要思想就是将自然语言转化为一系列形式化的逻辑形式,通过对逻辑形式进行自底向上的解析,得到一种可以表达整个问题语义的逻辑形式,之后通过相应的查询语句,在知识库中进行查询,从而得到答案。下图红色部分为逻辑形式,绿色部分为输入的自然语言问题,蓝色部分为语义解析进行的相关操作,形成的语义解析树的根节点则是最终的语义解析结果,可以根据它来在知识库中查询最终的答案。

结构化的语义表示目前有λ范式 [Kwiatkowski, et al., 2011]和 DCS-Tree[Liang, et al., 2011]。相对应的也提出了很 多语义解析语法或方法,例如组合范畴语法(Category Compositional Grammar, CCG )[Kwiatkowski, et al., 2011] 以 及 依 存 组 合 语 法 ( Dependency-based Compositional Semantics, DCS)[Liang, et al., 2011]等。
image

2.信息抽取(Information Extraction):

这个方法通过提取问题中的实体,通过在知识库中查询该实体,得到以该实体节点为中心的知识库子图,子图中的每一个节点或边都可以作为候选答案,通过观察问题依据某些规则和模板进行信息抽取,得到问题特征向量,建立分类器通过输入问题特征向量对候选答案进行筛选,从而得出最终答案。

3.向量建模(Vector Modeling):

这个方法的思想与信息抽取的思想比较接近,根据问题得出候选答案,把答案和候选答案都映射为分布式表达(Distributed Embedding),通过训练数据对该分布式表达进行训练,是的问题和正确答案的向量表达的得分(通常为点乘)尽量高。模型训练完成后可根据候选答案的向量表达和问题表达的得分进行筛选,得出最终答案。
image
以上三种方法的论文都集中在13-14年。14年之后KB-QA的主流方法集中在了深度学习方面。随着深度学习在自然语言处理领域的飞速发展,从15年开始,涌现出一系列基于深度学习的KB-QA文章。通过深度学习对传统方法进行优化,比如:使用卷积神经网络多语义解析方法进行提升等。

语义解析(Semantic Parser)

这一节通过一个经典的语义解析baseline方法,介绍语义解析如何进行KB-QA。该方法来自斯坦福Berant J, Chou A, Frostig R, et al. 的Semantic Parsing on Freebase from Question-Answer Pairs,文章发表于2013年的EMNLP会议。

上一节我们提到,知识库Freebase由大量的三元组组成,并且这些三元组的实体和实体关系都是形式化的语言,比如(BarackObama, PlaceOfBirth, Honolulu)

我们要解决的就是如何建立自然语言问题到结构化数据库的映射。

语义解析KB-QA的思路是通过对自然语言进行语义上的分析,转化为成为一种能够让知识库看懂的语义表示,进而通过知识库中的知识,进行推理(Inference)查询(Query),得出最终的答案。这种语义表示就是逻辑形式(Logic Form)

逻辑形式

为了能够对知识库进行查询,我们需要一种可以访问知识库的逻辑语言,Lambda Dependency-Based Compositional Semantics(Lambda-DCS)就是一种经典的逻辑语言,在实际操作中,逻辑形式会转化为SPQRQL query,可以在Virtuoso engine上对Freebase进行查询。简单的理解:如果我们把知识库看成一个数据库,那么逻辑形式就是查询语句。

我们用$z$表示一个逻辑形式,用$k$表示知识库,$e$表示实体,$p$表示实体关系(有的也称卫浴火属性)。简单而言,逻辑形式分为一元形式(unary)和二元形式(binary)。对于一个一元实体$e$,我们可以查询出对应知识库中的实体 ,给定一个二元实体关系$p$,可以查到它在知识库中所有与该实体关系$p$相关的三元组中的实体对。并且我们可以像操作数据库语言一样,进行连接Join,求交集Intersection和聚合Aggregate(如计数,求最大值等)操作。具体来说,逻辑形式有如下形式和操作:

image

有了上面的定义,我们就可以把一个自然语言问题表示为一个可以在知识库中进行查询的逻辑形式,比如对于问句 “Number of dramas starring Tom Cruise”

它对应的逻辑形式是

count(Genre.Drama\cap Performance.Actor.TomCruise)

当自然语言问题转化为逻辑性是之后,通过转化为相应的逻辑语言(转化为SPARQL query)查询知识库就可以得到答案。接下来的问题就是要如何把自然语言问题正确地转化为相应的逻辑形式。

语义解析KB-QA的方法框架

语法解析的过程可以看作是自底向上构造语法树的过程,树的根节点,就是该自然语言问题最终的逻辑形式表达式。整个流程可以分为两个步骤:

1.词汇映射: 即构造底层的语法树节点。讲单个自然语言短语或单词映射到知识库实体或知识库实体关系所对应的逻辑形式。我们可以通过构造一个词汇表(Lexicon) 来完成这样的映射。

2.构建(Composition): 即自底向上对树的节点进行两两合并,最后生成根节点,完成语法树的构建。这一步有很多种方法,注入构造大量手工规则,组合范畴语法(Combinatory Categorical Grammars, CCG)等等,而我们看的这篇论文,采用了最暴力的方法,即对于任意两个节点都可以执行上面所谈到的连接Join, 求交Intersection, 聚合Aggreate三种操作,以及这篇文章独创的桥接Briding操作进行节点合作。显然,这种合并方式复杂度是指数级的,最终会生成很多棵语法树,我们需要通过对训练数据进行训练,训练一个分类器,对语法树进行筛选。

自然语言转化为逻辑形式的流程图如下图所示:
image
上图红色部分即逻辑形式 ,绿色部分where wos Obama born为自然语言问题,蓝色部分为词汇映射(Lexicon)构建(Composition) 使用的操作,最终形成的语义解析树的根节点即语义解析结果。

接下来讨论最后三个未解决的问题,如何训练分类器?如何构建词汇表?什么是桥接操作?

训练分类器:

分类器的任务是计算每一种语义解析结果$d$的概率,作者通过discriminative log-linear model(判别线性对数模型)进行建模,公式如下:
image
其中$x$代表自然语言问题,$\phi(x,d_{i})$是一个从语义解析结果$d_{i}$$x$中提取出来的b维特征向量(该特征向量包含了构造该语法树所有操作的对应特征,每种操作的具体特征之后会提到),$\theta$是b维的参数向量。

对于训练数据问题-答案对$(x_{i},y_{i})$,最大化log-likelihood损失函数,通过AdaGrad算法(一种动态调整学习率的随机梯度下降算法)进行参数更新。
image

构建词汇表:

词汇表就是自然语言与知识库中实体关系的单点映射,这一操作也被称为对齐(Alignment)。自然语言实体到知识库的映射比较简单,比如将Obama中的实体Obama映射为知识库中的BarckObama,可以使用一些简单的字符串匹配方式进行映射。

但是要将自然语言短语例如 "was born in"映射到相应的知识库实体关系,如PlaceOfBirth,则较难通过字符串匹配的方式建立映射。直觉上来说,假如有较多的实体对(entity1, entity2)作为主语和宾语出现在包含PlaceOfBirth的三元组中,那么我们可以认为 "was born in"这个短语可以和PlaceOfBirth建立映射。

比如(“Barack Obama”, “Honolulu”), (“MichelleObama”, “Chicago”)等实体对在文档中经常作为 "was born in"这个短语的主语和宾语,并且它们也都和实体关系PlaceOfBirth组成三元组出现在知识库中。

有了这样的直觉,我们再来看看这篇文章是怎么构建词汇表的,利用ReVerbopen IE systemClueWeb09(注:该数据集由卡耐基梅隆学校在09年构建,还有一个12年的版本,ClueWeb12)上抽取15millions个三元组构成一个数据集,如(“Obama”, “was also born in”, “August 1961”),可以看出三元组的实体和关系都是自然语言的形式,取出其中的一个三元组子集,对里面的每一个三元组的主语实体和宾语实体通过字符匹配的方式替换为知识库的实体,并使用SUTime对数据进行归一化。

经过预处理后(“Obama”, “was also born in”, “August 1961”)经过预处理后转化为(BarackObama, “was also born in”, 1961-08)。

接着我们对每一个三元组中的自然语言短语$r_{1}$两边的实体对(entity1, entity2)进行统计,由于自然语言短语$r_{1}$和知识库实体关系$r_{2}$的对应关系是多对多的,比如 "was also born in"可能对应PlaceOfBirth, 也可能对应DateOfBrith,我们需要对每一个$r_{1}$进行区分,我们可以通过知识库查询到每一个实体的类型(type),比如1961-08类型是data而honolulu的类型是place,我们因此可以把$r_{1}$进一步表示为$r[t_{1},t_{2}]$,其中$t_{1}$为主语实体的类型,而$t_{2}$是宾语实体的类型。我们对其所在三元组两边的实体进行统计,得到实体对集合$F(r[t_{1},t_{2}])$

同样的,通过对知识库进行统计,对每一个知识库三元组中的实体关系$r_{2}$也统计其两边的实体,可以得到实体对集合$F(r_{2})$,通过比较集合$F(r[t_{1},t_{2}])$和集合$F(r_{2})$类似Jaccard距离(集合交际元素数目比集合并集元素数目)这样的特征来确定是否建立词汇映射,如下图所示:
image

图中绿色字体为$r_{1}$,蓝色字体为$r_{2}$。作者定义了词汇映射操作的三种特征(用于训练分类器),对齐特征(Alignment features),文本相似度特征(Text similarity features),和词汇化特征(Lexicalized features),具体内容如下表所示:
image

在实际使用中,我们可以通过词性标注(POS)和命名实体识别(NER)来确定哪些短语和单词需要被词汇映射(Lexicon),从而忽略对一些skipped words进行词汇映射。并且,作者还建立了18种手工规则,对问题词(question words)进行逻辑形式的直接映射,如“where,how many”映射为Type.Location 和 Count。

桥接操作:

完成词汇表的构建后,仍然存在一些问题。比如,对于go,have,do这样的轻动词(light verb)难以直接映射到一个知识库实体关系上,其次,有些知识库实体关系极少出现,不容易通过统计的方式找到映射方式,还有一些词比如actress实际上是两个知识库实体关系进行组合操作后的结果$(actor\cap gender.female)$,因此我们需要一个补丁,需要找到一个额外的二元关系来将当前的逻辑形式连接起来,那就是桥接。

举个例子,比如:“Which college did Obama go to?”
假设“Obama” 和 “college” 可被词汇映射映射为 BarackObama 和 Type.University, 这里"go to" 却难以找到一个映射,事实上,这里我们需要去寻找一个中间二元关系$b$(即Education)使得上面的句子被解析为$(Type.University\cap Education.BarackObama)$,如下图所示:
iamge

具体来说,给定两个类型(type)分别为$t_{1}$$t_{2}$的一元逻辑形式$z_{1}$$z_{2}$,我们需要找到一个二元逻辑形式$b$,在$b$对应的实体对类型满足$(t_{1},t_{2}$的条件下生成逻辑形式$(z_{1}\cap b.z_{2})$,这就是桥接,由于这里有类型的限制,所以我们可以在知识库中相邻的逻辑关系中暴力搜索符合条件的二元关系$b$

同样的,作者也为桥接操作、构建(composition)的其他三种操作,连接Join,求交集Intersection和聚合Aggregate,作者也定义了相应的特征(为了分类器的训练),定义如下表所示:
image
iamge

实验结果

作者测试了仅使用Alignment和Bridging以及都使用下的正确率,如下表所示:
image

这个方法还是有着很多的缺陷,首先,词汇映射是整个算法有效(work)的基点,然而这里采用的词汇映射(尤其是关系映射)是基于比较简单的统计方式,对数据有较大依赖性。最重要的是,这种方式无法完成自然语言短语到复杂知识库关系组合的映射(如actress 映射为$(actor\cap gender.female)$

其次,在答案获取的过程中,通过远程监督学习训练分类器对语义树进行评分,注意,这里的语义树实际的组合方式是很多的,要训练这样一个强大的语义解析分类器,需要大量的训练数据。我们可以注意到,无论是Free917还是WebQuestion,这两个数据集的问题-答案对都比较少。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值