持续创作,加速成长!这是我参与「日新方案 6 月更文挑战」的第8天,点击查看活动概况
前言
本文为我之前在CSDN平台上的一篇博客记录。原链接为:blog.csdn.net/u011426236/…
导语
- 会议:DASFAA 2021
- 地址:link.springer.com/chapter/10.…
摘要
本文研究了多轮的Text-to-SQL交互使命,与之前运用端到端办法的模型不同,本文提出运用两阶段模型。首要生成一个SQL语法树,称为Tree-SQL,作为一种中心表明。然后再从Tree-SQL推断出终究的SQL句子。关于这类上下文相关(context-dependent)的问题,提出了一种重用战略(Reuse strategy),能够将之前猜测的Tree-SQL中的子树赋予一个概率。在SParC数据集的具有“value selection”使命上,所提出办法完成了SOTA的体现。一起,本文也经过试验验证了重用战略的有效性。
关键词
Context-dependent semantic parsing, Reuse strategy, Intermediate representation
1 简介
单轮的跨数据库Text-to-SQL使命,如Spider数据集是不现实的。因为Spider中假定一切的问题都是上下文独立(context-independent)的无关问题,即在单回合交互中将每个问题映射到独立可履行的SQL查询。在真实的场景中,一个数据分析者通常会经过在多回合交互中询问一系列相关问题来查找数据库。这些问题通常在语义上相关,因而一个问题或许包含对以前问题部分的引证/重用。
SParC数据集对处理丰富的上下文信息和问题之间的主题联系提出了新的挑战。此外,该使命着重泛化,因为每个数据库在练习数据集或开发/测试数据集中只呈现一次。处理与上下文相关的Text-to-SQL使命并非易事,因为大多数现有的神经模型都不能提供令人满意的成果。
遭到IRNet模型(能够参阅我的博客)在处理上下文无关的Text-to-SQL使命时的启示,因为自然语言句子和SQL句子之间的不匹配,咱们也引进一种中心表明,称为Tree-SQL,这是一种符合SQL语法的树结构。而且,这种表明能够被用来支持值的猜测(value prediction),这在之前的大多数工作中都没有考虑到,而且无法生成完好的SQL句子来履行。
关于这类context-dependent的问题的处理,一种直观的知道是在猜测下一个SQL句子时,重新运用上文中生成的Tree-SQL前史信息。具体来说,咱们为Tree-SQL的每个子树分配一个概率,该概率表明在猜测新SQL时它被重用的或许性。关于值猜测,咱们经过将开放域的值选择(value selection)问题转换为问题的关闭域值提取(value extraction),为SQL查询中的特定数值/字符串值生成正确的猜测。
2 相关工作
关于NL2SQL使命,在WikiSQL数据集和更杂乱的Spider数据集上,上下文无关(context-independent)的语义解析现已得到了很好的研究。一些研究在这两个数据集上都取得了很好的成果。与上下文无关的语义分析比较,上下文相关的语义分析是近年来才逐渐流行起来的,而且现已有了一些基准数据集,如ATIS、SequentialQA和SParC。在这些数据集中,SParC是最具挑战性的一个,它具有杂乱的语义问题和数据库方式(schema)。
Suhr等人提出了一种依据ATIS单域数据集的模型,该模型语义薄弱,上下文类型较少。它保护一个交互级(interaction-level)编码器,并为下一次猜测仿制从前猜测的查询片段。它的段级(segment-level)仿制战略遭到过错传达的影响。为了处理这个问题,Edit-SQL模型(能够参阅我的博客)在SParC上使用了token-level的编辑战略,该战略对过错传达很强健,但在一切或许的方针token上产生了很高的猜测开销。关于前史答案的重用,segment-level太粗而token-level太细。咱们的办法进一步扩展了折中的重用战略,该战略首要关注以前的Tree-SQL的操作级重用,以更好地探究接连问题之间的相关性,并获得更精确的映射成果。
3 办法
3.1 使命界说
令XX和YY别离表明问题Question和对应的SQL句子。S=[s1,s2,…,si,…,sm]\hat{S}=\left[\hat{s}_{1}, \hat{s}_{2}, \ldots, \hat{s}_{i}, \ldots, \hat{s}_{m}\right]表明数据库的schema,其间每一个si\hat{s}_{i}都表明一个原始的行,即table.column。
在上下文相关的语义解析使命中,咱们保护一个交互前史。It=[(X1,Y1),(X2,Y2),…,(Xt−1,Yt−1)I_{t}=\left[\left(X_{1}, Y_{1}\right),\left(X_{2}, Y_{2}\right), \ldots,\left(X_{t-1}, Y_{t-1}\right)\right.,其包含了前t-1轮的Question和猜测的SQL句子。故整个问题能够界说如下:给出当时次序t的Question XtX_t和数据库scheme信息S\hat{S},咱们的方针是学习这样一个最优的映射函数f:(Xt,It,S)→Ytf:\left(X_{t}, I_{t}, \hat{S}\right) \rightarrow Y_{t}。
3.2 Tree-SQL
咱们提出Tree-SQL作为一种中心表明。其语法如图1所示。下图2给出了SParC的数据示例和第三轮得到的Tree-SQL的形状。 当时,在Spider或SParC这样的杂乱数据集上,很少有工作能够处理“值猜测”(value prediction)问题,首要原因是值的猜测有很大难度。值具有不同的来源和变体方式,比如图2中的“North America”和“3000” 这些值。 为了减小查找空间,Tree-SQL将open-domain的value prediction问题转换为closed-domain的NL句子中value extraction使命。咱们界说了三个参数来保护值的具体内容,别离是VtV_t表明值呈现在第VtV_t次序的Question中,VsV_s表明值在当时Question中的offset(即对应的index起始下标),VdV_d表明值的长度。经过这三个参数,就能够仅有确认值。
为了推断一个SQL查询,咱们只需预先遍历树结构,并依据图1中界说的语法规则将每个树节点映射到相应的SQL查询组件。
3.3 根本模型
咱们规划了一个依据编码器-解码器结构的SQL语法感知模型来生成Tree-SQL。它将问题、数据库方式和前史Tree-SQL作为输入,其输出一个Tree-SQL。模型全体结构如图3所示。
Contextual Encoder 咱们运用预练习的BERT作为第一层对问题XtX_t和数据库方式S\hat{S}进行编码,它们由[SEP]标记连接在一起:[CLS],Xt,[SEP],s1,[SEP],s2,[SEP],…sm,[CLS],X_t,[SEP], s_1,[SEP], s_2, [SEP],…s_m,。然后将问题的BERT嵌入送入Bi-LSTM层,生成终究的问题嵌入HtUH_t^U。关于schema的编码,咱们选用attention来估计不同项的重要性,一起也能够用来辨认主-外键联系。最后的schema嵌入是加权组合HSH^S。
History-Aware Encoder 为了揭示不同问题/查询对之间的相关性,咱们规划了一个依据LSTM的前史感知编码器,在交互进程中融入上下文信息。编码器在当时嵌入问题htUh_t^U与其躲藏状况htIh_t^I之间迭代更新。
Two-Stage Tree-SQL Decoder 咱们的解码器不是使用端到端办法,而是首要从嵌入生成一个Tree-SQL。Tree-SQL的生成是一个从粗到细(Coarse-to-Fine)的结构猜测进程,包含两个阶段。
- 在第一阶段,咱们使用一个结构解码器(skeleton decoder)来生成只要内部节点的Tree-SQL的结构。
- 在第二阶段,咱们选用一个细化解码器(refine decoder)来填充缺失的叶节点。
图3演示了咱们的解码器的进程。为了解码第k个动作,咱们建立了两个可学习的嵌入,aka_k表明动作的语义,bkb_k表明动作的类型,并学习了一个上下文向量ckc_k。两种解码器共享相同的可学习参数,不同之处在于上下文向量。 (a) Skeleton Decoder Tree-SQL的内部节点不涉及特定的原始列和值。因而,结构解码器的上下文向量ckc_k(记为LSTMD1LSTM^{D_1})仅经过D1D_1的躲藏状况与一切加权问题嵌入HUH^U之间的留意来自问题信息cktokenc^{token}_k,即ck=[cktoken]c_k = [c^{token}_k]。
(b) Refinement Decoder 细化解码器(记为LSTMD2LSTM^{D_2})用于猜测结构中缺失的叶子节点,在Question嵌入的基础上,也需要运用schema的嵌入HSH^S来学习ckschemac^{schema}_k,即ck=[cktoken;ckschema]c_k = [c^{token}_k; c^{schema}_k]。
依据以上界说,咱们能够界说两级解码器的loss函数为
咱们选用穿插熵作为咱们的解码器的损失函数和一个权重因子来调整两个解码器的重要性,其间N是动作的数量(yt,k,j=1y_{t,k,j} = 1表明第j个action与ground truth一致,yt,k,j=0y_{t,k,j} = 0表明j个action与ground truth不一致)。
3.4 运用重用机制进行优化
为了运用不同次序中Tree-SQL的相关性,咱们提出了一种优化技术,经过重用前史次序中生成的部分SQL语法树来改善Tree-SQL的猜测。重用机制的进程如图4所示。 咱们首要经过一个依据Bi-LSTM结构的编码器生成Tree-SQL的嵌入。然后,经过对解码器的躲藏状况和Tree-SQL嵌入之间的attention机制,衡量从前不同次序猜测的Tree-SQL cl,kqueryc_{l,k}^{query} 的重要性。为此,界说一个新的具有query嵌入的上下文向量ckc_k为ck=[cktoken;ckschema;ckquery]c_k = [c^{token}_k; c^{schema}_k; c^{query}_k]。
咱们经过将sigmoid函数用于上下文向量ckc_k来猜测重用之前Tree-SQL action的概率。咱们也为每一个子树(sub-tree)生成一个权重wl,iw_{l,i}表明该子树中重用的或许性。然后,输出散布就变成了当时操作与多次序和多个子树的前史Tree-SQL之间的权衡。
当时回合的动作概率表明为ptp_t,而从之前的Tree-SQL重用的动作概率表明为plp_l,其间1<=l<=t−11<=l<=t-1。图4显现了重用战略的一个示例。假定咱们有两个前史Tree-SQL, y1\hat{y}_1和y2\hat{y}_2。在生成y3\hat{y}_3时,咱们重用以前的Tree-SQL中的大多数结构和一些叶节点。
举个比如,如图4所示。咱们在猜测y3\hat{y}_3时,前面现已有了猜测的前史信息 y1\hat{y}_1和y2\hat{y}_2,其结构如图4(a)所示。在进行猜测时,首要由Skeleton Decoder猜测全体SQL句子结构,得到图4(b)上方的那个方式。接着,Refinement Decoder对叶子节点进行补充(即图4(b)上方到下方的方式的进程)和猜测动作(即图4(c)部分),在进行动作猜测时,运用了重用机制。该机制的运作示例如图所示:假设咱们要猜测图4(c)中的暗色节点(即下图中箭头所指的节点A),那么一方面咱们运用LSTM猜测它一切本来或许的动作,猜测得到各个action的概率散布如右下角current actions probability所示。一起,咱们也参阅之前猜测A这个类型节点时猜测得到的action,如下图左侧我用红框标注的位置。关于y1\hat{y}_1,它总共猜测过两次A,得到了两个成果,都是none。关于y1\hat{y}_1,它总共猜测过三次A,得到了三个成果,都是none。所以他们的前史信息能够作为参阅,其概率散布如图4(c)右下角previous actions。最后,解码器以\beta概率考虑原始的前史猜测成果作为参阅得到终究输出。
4 试验
4.1 试验设置
数据集 咱们在SParC上进行试验,这是一个专家标记的跨域上下文相关数据集,包含4,298个相关问题序列(12k+问题与SQL查询配对),查询138个不同域的200个杂乱数据库。
评价目标。关于不带值的SQL,为了防止排序的影响,咱们遵循之前的办法,将猜测查询分解为不同的组件,并核算ground truth值与猜测SQL之间的调集匹配精度。陈述了两个目标:问题匹配精确性(QMA)和交互匹配精确性(IMA)。关于有值的SQL,咱们直接运用生成的SQL履行数据库,并陈述问题履行精确性(QEA)和交互履行精确性(IEA)。
4.2 全体成果
表1展现了不猜测值时的EM目标的成果体现。
表2展现了带有值猜测时的EX目标的体现。
4.3 重用机制的有效性
为了进一步了解重用战略的有效性,咱们将咱们的办法与无值使命上的EditSQL进行比较,后者也支持编辑战略。如图5所示,使用重用战略对一切次序都有利,并使模型在以后次序时愈加安稳。运用问题之间的相关性能够有效地减少过错的传达。
5 总结
在本文中,咱们提出了一种具有编码器-解码器架构的神经办法,用于上下文相关的跨域Text-to-SQL生成。咱们规划了一种新的树结构,Tree-SQL,它被用作转换的中心表明。为了运用不同交互的问题之间的相关性,咱们引进了一种重用机制来改善咱们的猜测。在具有挑战性的SParC基准上的试验成果证明了咱们的模型的有效性。特别是,咱们的Tree-SQL扩展了值猜测模块,以适应更真实的使用程序场景(SQL通常包含值),咱们的模型完成了最先进的值猜测使命。