无论是在日常生活还是工作中,人们都越来越多地使用自然语言来与计算机进行交互。例如,使用自然语音交互方式让虚拟语音助手(如Cortana、Siri、Google Assistant、Amazon Alexa等)查询天气、预定日程、拨打电话等;用户在搜索引擎中用自然语言输入查询内容,得到精准的答案;员工使用自然语言与结构化的企业数据库交互,完成查询操作。
在上述的应用场景中,输入的是用户的自然语言(natural language),而输出的是机器可以理解并执行的规范语义表示(formal meaning representation),该表示可以在某个环境中被执行并返回结果。
在自然语言处理领域,上述输入-输出任务被称为语义解析(semantic parsing),即把自然语言自动转化为一种机器可以理解并执行的表达形式。例如,在虚拟语音助手场景中,语义解析模型可以将用户的语言转换为调用不同应用程序的API语句;在基于知识库的搜索场景中,语义解析模型可以将用户查询转换为可以在结构化知识库(如Microsoft Satori)上可以执行的SPARQL语句;在企业数据交互场景中,语义解析模型可以将用户的语言转换为结构化查询语句(Structured Query Language, SQL);
在本文中,我们以结构化查询语句为例介绍在语义解析领域的研究进展。该任务的输入是一张web table或一个关系数据库表以及一个关于这张表的自然语言问句,输出是表达该问句语义的SQL语句。这个SQL语句可以在输入的表上被执行,从而得到问题的答案。
图1 结构化查询语句
目前,做生成任务比较流行的方法是基于序列到序列(sequence to sequence)架构的神经模型,这类模型一般由一个编码器(encoder)和一个解码器(decoder)组成。编码器负责建模句子表示,解码器则根据编码器得到的问句表示来逐个从词表中挑选出一个个符号进行生成。
当生成任务的目标语言是SQL时,由于其语法的符号有限,我们可以使用Pointer Network模型来进行建模。这个模型在解码过程中使用了“拷贝”机制,即只从SQL的关键字和问句中的单词所组成的集合中选择每个时刻生成的单词,以达到减少预测空间大小的目的。在Pointer Network模型中,在每个时刻t,decoder选择问句中第i个单词xi的概率如公式1中所示:
公式1
其中代表解码器中的隐层状态,代表编码器中第i个单词对应的因层状态。
由于自然语言表达的多变性,问句中对表中内容的表述可能与表中的真实表述不一致。在图1的例子中,表中的一列名称为“Song choice”,一个单元的内容为“Anna Christine Nalick”。而在问句中对应的表达却是“songs”和“anna nalick”。由于这种不一致的存在,用Pointer Network生成的SQL就包含了许多不能执行的结果。
图2 融合SQL语法的生成式语义解析模型
为了解决这个问题,我们提出了一个融合SQL语法的生成式语义解析模型,其整体结构如图2所示。这是一个序列到序列的模型,其编码器由双向的RNN组成,双向RNN的最终状态向量在首尾相连后作为解码器的初始状态。解码器则由三个频道和一个门单元组成。其中三个频道分别为Column、value、SQL频道,在每个频道中分别预测表中列名称、表中单元格名称和SQL语法关键字。而门单元则预测在每个时间节点应该选择哪个频道的预测结果作为输出。解码器在t时刻生成目标yt的概率如公式2所示,其中zt代表由门单元选择的频道,pz(·)是选择频道的概率,而pw(·)类似于公式1,它是各自频道的概率输出。
公式2