百度语义解析 ( Text-to-SQL ) 技术研究及应用( 二 )


其中术语介绍:

  • 根据包含领域数量 , 数据集分为单领域和多领域 。
  • 根据每个数据库包含表的数量 , 数据集分为单表和多表模式 。 在多表模式中 , SQL生成涉及到表格的选择 。
  • 根据问题复杂度 , 数据集分为简单问题和复杂问题模式 , 其中问题复杂度由SQL查询语句涉及到的关键词数量、嵌套层次、子句数量等确定 。
  • 根据完整SQL生成所需轮数 , 数据集分为单轮和多轮 。
  • 若SQL生成融进渐进式对话 , 则数据集增加“结合对话”标记 。 当前只有CoSQL数据集是融进对话的数据集 。

百度语义解析 ( Text-to-SQL ) 技术研究及应用
本文插图
表1
由图2和表1可知 , 当前主流数据集都是多领域的 , 这就要求Text-to-SQL解析模型除了满足问题无关外 , 还要满足领域无关 。
2. 模型介绍
SQL查询语句是一个符合语法、有逻辑结构的序列 , 其构成来自三部分:数据库、问题、SQL关键词 。
在当前深度学习研究背景下 , Text-to-SQL任务可被看作是一个类似于神经机器翻译的序列到序列的生成任务 , 主要采用Seq2Seq模型框架 。 基线Seq2Seq模型加入注意力、拷贝等机制后 , 在单领域数据集上可以达到80%以上的准确率 , 但在多领域数据集上效果很差 , 准确率均低于25% 。
从编码和解码两个方面进行原因分析 。
在编码阶段 , 问题与数据库之间需要形成很好的对齐或映射关系 , 即问题中涉及了哪些表格中的哪些元素(包含列名和表格元素值);同时 , 问题与SQL语法也需要进行映射 , 即问题中词语触发了哪些关键词操作(如Group、Order、Select、Where等)、聚合操作(如Min、Max、Count等)等;最后 , 问题表达的逻辑结构需要表示并反馈到生成的SQL查询语句上 , 逻辑结构包括嵌套、多子句等 。
在解码阶段 , SQL语言是一种有逻辑结构的语言 , 需要保证其语法合理性和可执行性 。 普通的Seq2Seq框架并不具备建模这些信息的能力 。
当前基于Seq2Seq框架 , 主要有以下几种改进 。
1)基于Pointer Network的改进
首先 , SQL组成来自三部分:数据库中元素(如表名、列名、表格元素值)、问题中词汇、SQL关键字 。 其次 , 当前公开的多领域数据集为了验证模型数据库无关 , 在划分训练集和测试集时要求数据库无交叉 , 这种划分方式导致测试集数据库中很大比例的元素属于未登录词 。 传统的Seq2Seq模型是解决不好这类问题的 。
Pointer Network很好地解决了这一问题 , 其输出所用到的词表是随输入而变化的 。 具体做法是利用注意力机制 , 直接从输入序列中选取单词作为输出 。 在Text-to-SQL任务中 , 将问题中词汇、SQL关键词、对应数据库的所有元素作为输入序列 , 利用Pointer Network从输入序列中拷贝单词作为最终生成SQL的组成元素 。
由于Pointer Network可以较好的满足具体数据库无关这一要求 , 在多领域数据集上的模型大多使用该网络 , 如Seq2SQL[1]、STAMP[8]、Coarse2Fine[9] 、IRNet[16]等模型 。
2)基于Sequence-to-set的改进
在简单问题对应的数据集合上 , 其SQL查询语句形式简单(仅包含Select和Where关键词) , 为了解决Seq2Seq模型中顺序错误带来的影响(如“条件1 And 条件2” , 预测为“条件2 And 条件1” , 属于顺序错误 , 但对应的SQL是正确的) , SQLNet[10]提出了Sequence-to-set模型 , 基于所有的列预测其属于哪个关键词(即属于Select还是Where , 在SQLNet模型中仅预测是否属于Where) , 针对SQL 中每一个关键词选择概率最高的前K个列 。
该模式适用于SQL形式简单的数据集 , 在WikiSQL和NL2SQL这两个数据集合上使用较多 , 且衍生出很多相关模型 , 如TypeSQL[11]、SQLova[12]、X-SQL[13]等 。


推荐阅读