Transition-based Graph Generation For Text-to-SQL Task 文本生成SQL(记ACL2019一次投稿)

引言

首先简单说一下什么叫做Text-to-SQL任务,对于这个任务我们输入的是一个自然语句问题,输出的是一个SQL语句,其中不同的自然语句可能对应着同一个SQL语句,如下图所示:question1和question2都对应着下面的SQL语句。我们看一下像下面比较简单的SQL query由哪几个基本部分组成的,首先是一个聚合Agg(MAX、MIN、AVG等),然后是一个Clumn(Bronze),最后跟一个WHERE条件从句,其中WHERT从句包括Column(Silver),OP(>),Cell(2)。这种简单的SQL语句类似于一个表格查询。

Transition-based Graph Generation For Text-to-SQL Task(submit to ACL2019)

摘要

在本文中,我们提出了一种基于transition的神经语义解析方法来将自然语言问题映射到SQL查询。我们将SQL查询表示为一个语义图,其中知识库中的语义单元作为节点,SQL语言的关键字和运算符作为边。然后利用transition方法和Seq2Seq模型,将文本到SQL的生成过程转化为序列到图的过程,这样可以同时利用语义图表示的优点和Seq2Seq模型强大的预测能力。另外,为了提高问题与知识库匹配图节点的生成,提出了一种利用知识库的多层次粒度和语义结构的匹配网络。在wikiSQL数据集上的实验结果表明,尽管使用了相对简单的解码器,但我们的方法始终能够提高性能,取得具有竞争力的结果。

动机

  1. 在text-to-SQL任务中,大多数工作是基于序列到序列的,这些工作没有充分利用到SQL语句的逻辑结构信息。
  2. 语义图可以用一些比较成熟的方法生成,例如基于Transition,用最简单的译码器就可以满足SQL语言的语法要求。

贡献点

在这项工作中,我们建议将SQL查询表示为语义图(如下图所示)并且用一个简单的解码器将序列到序列的过程转换成序列到图形的过程。在我们的框架中,使用基于Seq2Seq模型的Transition方法将图的生成转化为动作序列的生成,它可以同时利用语义图表示的优点和Seq2Seq模型强大的预测能力。为了实现这一目标,我们选择了一个称为cache-transition-system转换系统并且设计了一个能够编码语义图生成过程的动作集(包括NodeGen等节点生成动作,ArcGen等边生成动作)。然后,我们使用Bi - LSTM对输入信息进行编码,并设计RNN模型来生成动作序列。另外,为了提高节点的生成能力,我们提出了一种利用多层次粒度和知识库结构的匹配网络。综上所述,我们主要做出以下贡献:

  • 我们是第一个将SQL查询表示为一个图,并为SQL查询和图之间的转换设计规则。我们利用Seq2Seq模型和Transition方法生成图,综合了图形表达和Seq2Seq模型的预测能力的优点。
  • 本文提出了一种基于多级粒度和知识库结构的匹配网络,即表数据库中的列column-cell关系。
  • 我们的架构是在wikiSQL数据集上实现的,尽管使用了最简单的序列解码器,但与以前的系统相比,它的性能还是很有竞争力的。

问题定式

Text到SQL任务以一个问题 q q q 和一个由 k k k 个表组成的知识库 b b b 作为输入,每个知识库由 n n n 列和 n × m n×m n×m 个单元组成,输出一个SQL查询 y y y。我们将SQL查询转换为以语义图为中间表示的动作序列,如图2所示。任务和挑战如下:

  • SQL查询语句和语义图之间的具体转换要确保以唯一的方式进行转换。
  • 对于图形生成,我们使用了Transtion方法,这些方法确保了动作序列可以生成gold graph(Nivre,2008)。我们设计了一个动作集来编码语义图生成.
  • 设计模型以生成带有自然语言问题的动作序列。

SQL的语义图表示

SQL查询由来自知识库的语义单元、聚合器、SQL关键字和问题的值组成(见图1)。我们将知识库的单元、聚合器和极限值定义为节点,所有这些节点通过问题与KBs1的匹配得到;SQL关键字被定义为边,在动作序列生成过程中获得。

SQL关键字用一些模式构造SQL查询,每一个关键字都会引出一个具有自己模式的子SQL。SQL查询和图之间的转换被转换成子SQL和子图之间的映射。sub-SQL的覆盖率我们根据SQL语法收集sub-SQL的所有模式,并确保它们能够以确定性的方式转换成子图,见表2的示例。使用深度优先搜索算法,所有SQL查询都可以以确定的方式转换为图形。此外,我们设计了确保节点对(父节点、子节点)在图中只有一个关系的措施,以保证图可以通过transition生成。

所有的SQL查询都可以被转换成100%准确的图形。同时,所有的图都可以转换成SQL查询,这些查询完全覆盖了基本真理的子SQL并与之完全匹配,只有子SQL的顺序导致与基本真理不匹配的负数(百分比为3.4%)。

基于Transition的语义图生成

我们将SQL查询的生成转换为图形生成,并将其转换为动作序列生成。

语义图的动作集合

cache transition parser包括stack, cache, input buffer。stack是一系列(整数,节点)对,最后一个元素在最上面的位置;input buffer 是输入的序列,第一个元素作为新引入的图节点被读取;cache是一个节点序列,第一个元素在最左边,最后一个元素在最右边。解析器的配置形式如下,其中 δ δ δ, η η η β β β分别是stack, cache 和 input buffer; G p G_p Gp是迄今为止构建的部分图:

在第一步中,我们将输入语 w 1 : n = w 1 , … , w n w_{1:n}=w_1,…,w_n w1:n=w1wn映射到候选节点序列 n 1 : m = n 1 , … , n m n_{1:m}=n_1,…,n_m n1:m=n1nm(详见第6.1节)。输入语句和候选节点序列作为输入。解析器的转换如下所示:

  • N o d e G e n ( n i ) NodeGen(n_i) NodeGenni读取下一个候选节点 n i n_i ni及其对应的自然语言问题中的token w j w_j wj 或者 tokens span w j : j + k w_{j:j+k} wj:j+k,利用匹配网络(在第5.3节中介绍)来确定是否应该保留它。如果匹配的网络之后没有留下节点,则将其映射到立即移出缓冲区的 ϵ ϵ ϵ,否则它准备在接下来的两个步骤中进行进一步的处理。
  • A r c G e n ( i , d , l ) ArcGen(i,d,l) ArcGenidl在缓冲区 β β β最左边的节点和缓存 η η η中的第 i i i个节点之间建立一个方向为 d d d和标签为 l l l的弧。如果没有生成弧,则标签 l l l A r c N o n e ArcNone ArcNone。我们考虑缓冲区最左边的节点和缓存的每个节点的弧。我们可以把这个阶段看作是首先在每个节点对之间做一个二进制决定,如果有一个标签,就预测标签。
  • P u s h N o d e ( n i ) PushNode(ni) PushNodeni将下一个输入节点移出缓冲区并将其移动到缓存的最后一个位置。我们还取出出现在缓存中位置 j j j的节点 n j n_j nj,并将其推到堆栈 δ δ δ上,以及记录其在缓存中的原始位置的整数 j j j
  • P o p Pop Pop从堆栈中弹出一对 ( i , v ) (i,v) iv,其中的整数i记录了它最初来自的缓存中的位置。我们将node v v v放在缓存中的位置 i i i,将缓存的其余部分向右移动一个位置,并丢弃缓存中的最后一个元素。

动作序列生成

我们利用Seq2Seq模型生成action sequence。我们的模型以问题 w 1 : n w_{1:n} w1:n及其对应的候选节点序列 n 1 : m n_{1:m} n1:m作为输入。动作序列 a 1 : q a_{1:q} a1:q是输出。
BiLSTM Encoder
给定输入字序列 w 1 : n w_{1:n} w1:n,我们使用双向LSTM对其进行编码。
LSTM Decoder
我们使用一个基于注意力的LSTM解码器,要计算当前状态下所有动作的输出概率分布。对于每个时间步骤 t t t,解码器将嵌入的先前动作 e t − 1 e_{t−1} et1和单词 µ t − 1 µ_{t−1} µt1的先前上下文向量的串联馈送到LSTM模型中,以更新其隐藏状态, s t = L S T M ( s t − 1 , [ e t − 1 : µ t − 1 ] ) s_t=LSTM(s_{t−1},[e_{t−1}:µ_{t−1}]) st=LSTM(st1,[et1:µt1])
时间步长 t t t的注意概率 α α α计算如下:

当前状态下所有动作的输出概率分布计算如下:

Transition State Features for Decoder

我们可以从当前的Transition state C t C_t Ct中提取特征。

这些特征嵌入被连接为 e f ( C t ) e_f(C_t) ef(Ct),并作为附加输入馈送到解码器:

我们在实验中使用了以下特性:
•节点类型:表示被处理节点的类型,包括缓存的当前节点和缓冲区最左边的节点,类型集包括 ( a g g , c o l , c e l l , t a b , l i m v , r o o t , n o n e ) (agg,col,cell,tab,limv,root,none) aggcolcelltablimvrootnone n o n e none none表示节点没有类型。
•列单元关系:如果当前节点对的类型是 ( c o l , c e l l ) (col,cell) colcell ( c e l l , c o l ) (cell,col) cellcol,如果该单元属于表中的列,则标记为1,否则为0。

节点生成的匹配网络

在给定输入语句及其候选节点序列的基础上,利用匹配网络进行节点选择(the action of N o d e G e n NodeGen NodeGen)。基于问题与知识库的匹配,构造了一个节点选择的分类模型。我们使用Column-cell relation提出了一个多级粒度匹配网络,如图2右下角所示。

在本文中,我们将一个节点表示为一个KB语句。对于列,KB语句表示为 x i o = [ w i 1 o ; … ; w i m o ] x^o_i=[w^o_{i_1};…;w^o_{i_m}] xio=[wi1owimo] m m m是第 i i i列中的字数。对于单元格,表示为 x i j c = [ x j o ; w i j 1 c ; … ; w i j k c ] x^c_{ij}=[x^o_j;w^c_ {ij_1};…;w^c_{ij_k}] xijc=[xjowij1cwijkc] k k k是第 ( i , j ) (i,j) ij个单元格中的字数,表示结合了列和单元格的语义,可以用来提高列的预测。类似地,对于表名,句子是表名及其所有列的连接;对于聚合器和limit值,该语句是它们的全名和同义词的连接。

给定一个问题 q q q和一个KB句子 r r r,该模型查找嵌入表,将 q q q r r r分别表示为 q = [ e q , 1 , … , e q , n q ] q=[e_{q,1},…,e_{q,n_q}] q=[eq,1eq,nq] r = [ e r , 1 , … , e r . n r ] r=[e_{r,1},…,e_{r.n_r}] r=[er,1er.nr],其中 e q , i , e r , i ∈ R d e_{q,i},e_{r,i}∈R_d eq,ier,iRd分别是 q q q r r r的第 i i i个词的嵌入。然后用 Q ∈ R d * n q Q∈R^{d*n_q} QRdnq R ∈ R d * n r R∈R^{d*n_r} RRdnr构成一个词相似矩阵 M 1 ∈ R n q * n r M_1∈R^{n_q*n_r} M1Rnqnr和序列序列相似矩阵 M 2 ∈ R n q * n r M2∈R^{n_q*n_r} M2Rnqnr,这是卷积神经网络(CNN)的两个输入通道。CNN从矩阵中提取重要的匹配信息,并将其编码成匹配向量 v v v

∀ i , j ∀i,j ij M 1 M_1 M1 ( i , j ) − t h (i,j)-th (ij)th元素定义如下, M 1 M_1 M1在词的层次上对 q q q r r r之间的匹配进行建模:

为了构造 M 2 M_2 M2,我们首先使用BiLSTM将 Q Q Q R R R转换为隐藏向量, ∀ i , j ∀i,j ij M 2 M_2 M2 ( i , j ) − t h (i,j)-th (ij)th元素定义如下:

然后由CNN处理 M 1 M_1 M1 M 2 M_2 M2,交替进行卷积和最大池运算。最后的特征图输出经过线性变换后,映射到低维空间。通过学习训练数据中的单词嵌入和LSTM的参数,问题中有助于选择节点的单词或片段总是与KB句子中的一些单词或片段具有很高的相似度,从而导致相似度矩阵中的高值区域。这些区域将通过卷积和池运算进行变换和选择,并将话语中的重要信息传递给匹配向量。这就是我们的模型如何识别有问题的重要信息,并利用它从知识库语句中选择节点。

训练和推理

我们使用两个交叉熵损失来训练我们的模型,一个在oracle操作序列 a 1 , … , a q a_1,…,a_q a1,,aq上结束,另一个在节点选择上结束:

实验

评估指标

我们在WikiSQL数据集上进行了实验。在其他模型的基础上,我们使用了三个评价指标:

  • 逻辑表单准确度( A c c l f Acc_{lf} Acclf)衡量与ground truth完全匹配的示例的百分比;
  • 查询匹配准确度( A c c q m Acc_{qm} Accqm)消除了基于 A c c l f Acc_{lf} Acclf的排序问题导致的误判;
  • 执行准确度( A c c e x Acc_{ex} Accex)衡量正确答案的比例。

预处理和后处理

在生成动作序列之前,首先要得到候选节点序列。

我们使用每个单词及其stem在知识库中进行搜索,得到每个单词的候选节点。同时,我们使用了一些规则来提高系统的召回率,比如单词嵌入的相似性(详见附录B)。然后对同一节点对应的词的跨度进行合并,得到候选节点序列。在动作序列的生成中,对于每一个候选节点,我们使用匹配网络来确定它是否应该留在节点动作中。如果节点是冗余的,那么它与所有其他节点都有关系ArcNone,并且在从动作序列到SQL查询的转换中会被丢弃。

在给定动作序列的情况下,用确定性的方法得到图。从图形到SQL查询的转换也是以确定性的方式进行的。在这里,我们删除标签为ArcNone的边和孤立的节点。

结果分析

我们的模型将SQL查询表示为一个可应用于任何文本到SQL数据集的图形,并利用基于转换的Seq2Seq模型来生成一个端到端的过程。从上表可以看出,Seq2Graph与其他具有多个子模型或定制译码器的机型相比具有竞争优势,并且在 A C C e x ACC_{ex} ACCex上的性能优于现有系统2%。

在其他模型之后,我们还报告了SQL查询组成部分的更细粒度的评估指标,如上表所示。WHERE子句的改进与我们基于多级粒度和列单元关系的匹配来改进列和单元(WHERE子句的值)预测的初步直觉是一致的。

通过实例说明了Seq2Graph生成结果,并与SQLNet进行了比较。结果如图所示。在第一个示例中,Seq2Graph利用动作历史和列单元关系来改进边的预测,单元de vaux continental ismake的父元素是make,因为Model已经是SELECT的子元素;在第二个例子中,Seq2Graph可以通过单元(leicester)预测列(location),以改进列的预测。

节点序列是通过搜索和匹配自动获得的,表5给出了节点召回率和节点序列的准确性,从中可以看出Seq2Graph需要改进问题与知识库之间的匹配,以改善节点的选择。同时,我们发现使用算子的边缘检测精度较低,可以利用与节点无关的节点间的上下文信息来提高边缘的精度。

附录

我们使用一些规则来提高系统的召回率

  • 对于聚合器和限制值,我们收集它们的同义词,例如(count number)代表count,(total amount)代表sum,(minimun)代表min,(maximum)代表max,(avg)代表avg,(top代表limv)。同时,我们认识形容词的最高级形式,并将其作为min、max和limv的候选同义词。
  • 我们使用词嵌入的相似度(阈值为0.6)来提高列的召回率,但不使用停止词。
  • 如果在当前位置识别出属于该列的单元格,我们会自动将该列作为节点添加到当前单词或span中。
  • 如果在当前位置识别出当前单词或span的对应列,并且所有单元格的值都是二进制的(例如true and false),我们会自动将这些单元格作为节点添加到当前单词或span中。
  • 为了提高数字和日期之间的匹配性,我们将疑问句和知识库中的数字均表示为 N u m b e r Number Number

模型的优点

这个模型简单来说就是将SQL查询表示为一个语义图,可以同时利用语义图强大表达的优点和Seq2Seq模型强大的预测能力。
首先,语义图与知识库具有紧密的耦合关系并且和句法结构有很多共同点。因此,在句法分析过程中,知识库中的结构约束和语义约束都可以利用。
其次,对于具有相同粗草图的实例,该模型可以显式地共享局部结构的知识(例如一些子图,具有相同的边和节点对类型,图1中的(root,min)和(root,max)对,即使它们的实际意义表示不同)。

遇到的痛点和解决方式

这个任务主要就是两个问题。一个是节点的生成,另外一个是边的生成。

节点的生成

其中对于节点的生成,我们是是倒排+匹配网络来进行筛选。对于我们这个节点任务,最重要的是需要保持很高的召回率,因为如果没有正确的节点被召回,那么无论如何这个语义图都是残缺的是错误的,对于多余的节点,我们可以通过孤立这个节点从而在最后的语义图删除。所以我们的倒排检索一定要保持很高的召回率,有很多的trick加入其中:

  • 我们不仅每个单词在知识库中进行搜索,并且还将它的stem也进入知识库中搜索,得到每个单词的候选节点。
  • 对于聚合器和限制值,我们收集它们的同义词,例如(count number)代表count,(total amount)代表sum,(minimun)代表min,(maximum)代表max,(avg)代表avg,(top代表limv)。同时,我们认识形容词的最高级形式,并将其作为min、max和limv的候选同义词。
  • 为了提高数字和日期之间的匹配性,我们将疑问句和知识库中的数字均表示为 N u m b e r Number Number
  • 如果在当前位置识别出属于该列的单元格,我们会自动将该列作为节点添加到当前单词或span中。

倒排检索的细节如下:

边的生成

对于生成SQL的任务来说,最大的难点是WHERE从句,也就是说COL OP VALUE这几个的关系。具体来说:

  1. cell来自的column不是数据库中所对应的column
  2. select从句的cloumn和where从句的cloumn经常重复,者在大多数情况下是错误的。
  3. op预测问题,<>=比较难判断。

我们通过Transition State Features for Decoder有效缓解了问题1和问题2。
列单元关系:如果当前节点对的类型是 ( c o l , c e l l ) (col,cell) colcell ( c e l l , c o l ) (cell,col) cellcol,如果该单元属于表中的列,则标记为1,否则为0。这样可以解决了问题1;另外引入以前的动作历史信息,可以有效解决问题2,当已经有column属于select,对于其在whertr从句有一定隐式的限制;
对于op预测问题,我们会加入更多的上下文信息,而不能只通过cloumn和对应的cell去判断op,需要引入更多边缘信息。

这次Text-to-SQL工作的不足

  1. 首先这个方法(尤其是前面的节点生成)比较偏工程化,所以写在论文里不是那么优雅。
  2. 然后这个论文trick偏多一点,可读性可能不是很高,不是很吸引阅读论文的人。
  3. 实验方面,虽然在WikiSQL数据集取得了当时的state-of-the-art,因为比较赶实验,所以没有来得及尝试Spider数据集,所以实验有一点点欠缺。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值