【论文阅读】基于复杂查询图编码的知识库问答

2019-06-03

大多数现有的KBQA方法只关注简单的问题,在复杂的问题上不能很好地工作,因为它们不能同时表示问题和相应的复杂查询结构。在这项工作中,我们将如此复杂的查询结构编码成一个统一的向量表示,从而成功地捕获复杂问题中各个语义组件之间的交互。这种方法在复杂问题上始终优于现有方法,同时在简单问题上保持竞争力。

原文:https://www.aclweb.org/anthology/D18-1242

首先介绍几个有关的概念,首先是知识库问答KBQA。KBQA所做的任务是给定自然语言问题,通过对问题进行语义理解和解析,进而利用知识库进行查询、推理得出答案。根据研究对象的不同,目前KBQA可分为面向简单问题的问答和面向复杂问题的问题。简单问题是指问句中只包含一个实体关系的问句,复杂问题就是说问句中包含多个实体或者关系,答案和表层形式之间需要经过比较复杂的计算才能得出结果。针对KBQA,目前的技术流派也分为两种,第一种是基于语义解析的方法,该类方法首先是通过自底而上或者状态查询方法收集候选查询图,然后根据给定的问题根据语义相似度预测出最佳的查询图。另一种办法是基于NN神经网络的办法,这类方法是采用encode-and-compare框架,把问题和谓词序列都压缩到通用的向量空间中,然后通过余弦函数计算相似度,相似度高的就是最佳候选项。
为了计算一个问题与一个复杂的查询图的相似度,一个直观的解决方案是像图里一样,把查询图分割成多个语义部分,这样原先的方法变成计算问题与查询图的每个部分的相似度。但是,这样操作面临两个缺陷。第一点,每个语义部件没办法直接跟整个问题进行比较,因为它只学到了整个问题的部分信息。第二点,各个部件是单独编码的,没有学习到整个查询图的表示,因此无法捕捉到一些全局的特征。
鉴于此,本文提出了一个轻量有效的神经网络模型去解决复杂的KBQA任务,下面细说一下具体的流程。
首先是查询图生成,这里采用Freebase作为目标知识库,然后在生成过程中考虑四种语义约束。

第一步要先从问句中提取有效的(mention,focus node)对。对于实体链接,是借助于SMART进行连接。对于类型链接,是利用了问句中的uni-, bi-and tri-gram mention,选取与词向量相似度最高top10个选项。对于时间链接,通过符合year regex提取时间mention。

对于顺序链接,我们利用预定义的最高级词列表。并通过匹配最高级词或“序数+最高级”模式来识别提及的内容。顺序节点是表示序数的整数在mention中。比如对于例句,会将识别出这几个。
然后我们通过1跳或者2跳谓词序列将答案节点链接至不同的实体。也就是相当于以entity为终点,去搜索作为锚节点的答案节点。

当有了主路径之后,还要为其添加约束,于是采用深度优先搜索,去查询多元实体的组合,通过添加1跳的节点来约束主路径。对于type限制,主要就是添加isA谓词。除此之外本文还采用谓词的domain去限制答案。

作者造了一个freebase的类型层次表,然后通过这个表去定义一些类型继承关系。比如说这里的government position的domain是一个政治家,isA的类型是美国总统,它在层次表里是属于政治家的子类型那么就保留这个类型限制,如果不是domain的类型的任何子类型或者父类型就抛弃它,所以就相当于进行了一个剪枝操作。时间和序号的限制就是用2跳谓词序列去限制,比如after2002年变成from哪年,并且这一年>2002。同理序列限制也是如此。

当查询图生成之后,接下来的步骤就是如何将问句的语义和查询图的语义做比较,使之挑选出相似度最高的那个查询图作为最终答案。因此本文提出了一种基于神经网络的语义匹配模型。首先,对于语义组件,综合考虑谓词id和谓词名称。谓词id是从路径级别考虑,当给定id序列,我们就将其作为一个整体的单元,然后直接embedding。这么做的原因主要是因为本文方法中id序列的长度不会超过2,并且不同谓词序列的数量和不同谓词的数量是大致相同的。谓词名称则是从单词级别去考虑,把每个谓词拆分成单词序列,对每个单词做embedding之后取平均值。将二者加和就得到了一个语义组件的向量表示。

对于问句的表示,分别从全局和局部级别进行考虑。先将所有实体和时间替换为token,全局信息的话就是把token序列作为输入,然后用同样的单词embedding矩阵去做embedding得到向量序列,然后过一个双向GRU网络,将最后一个前向后向隐藏状态的组合作为最终向量。局部级别的话就是将问句转化成依存路径,然后过另一个双向GRU,得到基于依存级别的向量。还是两个向量做个加法,得到最后的句子表示。

那么如何计算问句和语义组件之间的相似度呢?这里采用了最大池化操作,分别从语义组件表示向量和问句表示向量中选出最大的,然后做一个余弦相似度比较。

其他的一些点比如实体链接用到了S-MART做语义丰富,训练时的损失函数,以及计算分数时考虑实体、语义和结构三部分的得分,详见原文。

本文的实验是在三个数据集上进行,分别是ComplexQuestions(2100个复杂问题,收集自Bing搜索查询日志)、WebQuestions(5810个问题,收集自Google Suggest API)、SimpleQuestions(超过100K个问题)。


利用F1作为衡量指标,结果显示对于复杂问题的处理达到了state of the art水平,同时对简单问题也有不错的表现。

除此之外,作者还添加了几个额外的实验,比如采取不同的方法做谓词的embedding,结果显示对于谓词名称采用取均值操作,对于谓词id采取路径基本的embedding产生的效果是最好的。对于问句表示,综合考虑依存和句法效果最佳。


最后有一些自己的思考,本文是第一次尝试用神经网络去显式地编码复杂查询图的完整语义信息。但是对于隐含的时间等复杂的约束并没有进行处理,是否可以用同样的embedding方法进行编码?语义计算采用max-pooling的方法,是否其他的池化方法会更有效?现在的方法是利用pooling来表示各个部件之间的隐藏关系,是否可以用神经网络的办法,比如说把所有的constraint过一个神经网络,用输出的向量来当做语义表示。

本文来源:「想飞的小菜鸡」的个人网站 vodkazy.cn

版权声明:本文为「想飞的小菜鸡」的原创文章,采用 BY-NC-SA 许可协议,转载请附上原文出处链接及本声明。

原文链接:https://vodkazy.cn/2019/06/03/【论文阅读】基于复杂查询图编码的知识库问答

支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者,更多文章请访问想飞的小菜鸡