一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情。
导语
SyntaxSQLNet是第一个为Spider数据集设计的baseline方法,是Spider数据集的提出者在发布数据集的同期提出的基本方法。
简介
SyntaxSQLNet可以认为是结合了复杂SQL语句结构版的“SQLNet”模型(关于SQLNet模型,可以参考我之前的博客# Text2SQL学习整理(三)SQLNet与TypeSQL模型)。相比之下,SyntaxSQLNet模型有如下改进:
- 解码过程引入结构性信息,解码对象为SQL语句构成的树结构。
- 预测分解为9个模块,每个模块对应SQL语句一种成分。由预定义SQL文法确定这9个模块调用顺序,引入结构信息。
- 提供了一种针对text2sql任务的数据增强方法,生成跨领域、更多样的训练数据。
方法
模块概览
SyntaxSQLNet将解码的过程引入了结构性信息,即解码的对象为SQL语句构成的树结构。预测分解为9个模块,每个模块对应了SQL语句中的一种成分。解码时由预定义的SQL文法确定这9个模块的调用顺序,从而引入结构信息。树的生成顺序为深度优先(故会先预测column,再预测AGG)。分解出的9个模块有:
-
IUEN模块:预测INTERCEPT、UNION、EXCEPT、NONE(嵌套查询相关)
-
KW模块:预测WHERE、GROUP BY、ORDER BY、SELECT关键字
-
COL模块:预测列名
-
OP模块:预测>、<、=、LIKE等运算符
-
AGG模块:预测MAX、MIN、SUM等聚合函数
-
Root/Terminal模块:预测子查询或终结符
-
AND/OR模块:预测条件表达式间的关系
-
DESC/ASC/LIMIT模块:预测与ORDERBY相关联的关键字
-
HAVING模块:预测与GROUPBY相关的Having从句
SQL生成示例
生成SQL语句过程如下:
- 首先,看中间的“Current Token”部分, ROOT代表一个SELECT语句的开始。从“Current Token”出发,来决定要调用哪个算法模块预测后续的Token。
- 其次,看图中右边“Module to call”,各个方块表示不同的算法模块,调用不同模块可以生成相应的Token。
- 然后,看图中左边“History”部分。具体应该调用哪个算法模块,除了看“Current Token”之外,SyntaxSQLNet还把Token之前的SQL语句也考虑进来,以改善预测准确率。同时,当SQL语句很长的时候,History也附带表示了不同语句之间的依赖信息。
- 最后,看图的左上角“Stack”部分。Stack用于辅助递归来生成SQL语法树。
举个例子,在刚开始的时候,算法会在堆栈里初始化一个ROOT Token,接着从堆栈里推出ROOT Token触发IUEN模块,如果IUEN预测产生NONE Token,算法会把预测出的NONE推入堆栈,这一步完成;下一步,将NONE Token推出,作为“Current Token”触发后面的模块……按此递归,直到Stack变空,预测结束。
模型结构
模型输入有Question,Table Schema,SQL History三个部分。
-
Question用BiLSTM进行encoding。
-
对于Table Schema,和SQLNet只使用了Column Name来做encoding不同,针对Spider任务的复杂性,SyntaxSQLNet把Table Name,Column Name,Column Type一起作为输入,然后通过Bi-LSTM把Table和Column的信息都在一个encoding里来表示。
-
对于SQL Histroy,需要对当前Token的前序SQL语句进行编码。这里对训练阶段和测试阶段处理有所区别:训练时会直接使用标注数据中提供的gold query来作为SQL History;而在测试数据上,会使用前序预测出来的SQL语句来替代。
-
另外,在进行具体Token预测的时候,Question和SQL History的不同词起到作用是不一样的。为解决这个问题,SyntaxSQLNet在各个模块中使用了Attention机制来提高预测准确率。
数据增强
文章同时提供了一种针对text2sql任务的数据增强方法,生成跨领域、更多样的训练数据。
首先在Spider的标注样本上分析提炼出通用的Question-SQL模板,将一些过于简单模板过滤掉后,得到280个复杂度较高的模板。然后利用WikiSQL数据集,对每个数据表任意挑10个模板,随机选择表格中的Columns进行填充。同时,填充的时候会考虑所选择Column的数据类型与需要填充的Slot的数据类型是匹配的,比如都是数值型。这样共产生了约98000个Question-SQL样本用于训练。
实验
通过以上方法的运用,SyntaxSQLNet取得了当时很好的结果。相比于SQLNet或TypeSQL模型,EM提升在十几个点左右。
总结
SyntaxSQLNet是Spider提出后第一个baseline方法,相比于之前WikiSQL上的SQLNet,SyntaxSQLNet利用了更多的SQL高级语法信息,可以预测更加复杂的SQL语句。这篇论文也和之前的Spider数据集论文一同被EMNLP 2018接收。下一篇将为大家介绍一种引入中间表示的方法:IR-Net。