论文阅读让数据库听懂人话(Text-to-SQL)

Posted 囚生CY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论文阅读让数据库听懂人话(Text-to-SQL)相关的知识,希望对你有一定的参考价值。

论文标题: 在跨领域数据库中引入中间表示来实现复杂Text2SQL
英文标题: Towards Complex Text-to-SQL in Cross-Domain Database with Intermediate Representation
论文下载链接: https://arxiv.org/abs/1905.08205
论文项目代码: GitHub@IRNet


序言

Text-to-SQL任务旨在直接通过口述的查询问题, 直接从数据库中执行对应的SQL语句得出结果, 是常见的对话系统, 问答系统设计中常常会运用到的方法; 然而本文作为目前最先进的方法, 仍然无法取得良好的结果, 事实上目前大部分的Text-to-SQL模型依然只能处理相对简单的SQL查询, 而一旦问题涉及复杂的嵌套查询, 目前还没有很好的解决方案, 从本文3.4节误差分析中可以看到, 高难度的嵌套查询的准确率是非常低的, 而且引入BERT增强也提升效果不显著, 这应该算是Text-to-SQL中值得攻克的一个难点。

关于项目代码,其预训练模型和数据都在googledrive上需要翻墙下载,没有数据可能还是很影响代码阅读的。


目录


摘要

本文提出一种名为IRNet的神经方法解决复杂的, 跨领域的(cross-domain) Text-to-SQL任务;

  1. IRNet旨在解决两个难题:
  • ① 自然语言(Natural Language, 下简称为NL)中表达的意图与SQL实现细节上的不匹配;
  • NLP中出现的大量领域外(out-of-domain)的单词导致难以预测所指向的数据库中表的字段;
  1. IRNet的创新点:
  • 不同于使用端对端(end-to-end)的方法来合成(synthesize)一次结构化查询语言(Structural Query Language, 下简称为SQL)查询语句, IRNet将合成(synthesis)分解为三个阶段:
    • ① 首先, IRNet在给定的问题和数据库结构(schema)执行一次结构链接(schema linking);
    • ② 其次, IRNet采用一个基于语法的神经模型来合成SemQL查询;
      • SemQL查询是一种设计来用于联系NLSQL的中间表示(intermediate representation, 下简称为IR);
    • ③ 最后, IRNet根据第②步中得到的SemQL生成最终的SQL查询语句;
  1. IRNet表现:
  • 精确度: 46.7 46.7% 46.7(比目前最先进模型的精确度提升了 19.5 19.5 19.5个百分点);
  • 截至本文发布IRNet的评分位于Spider leaderboard排行榜的榜首;

1 引入 Introduction

  1. 问题的定义: Text-to-SQL是通过一个问题来合成对应的SQL查询语句的自然语言处理(Natural Language Processing, 下简称为NLP)任务;

  2. 问题的挑战:

  • 目前传统的端对端(end-to-end)神经网络方法可以在公开的Text-to-SQL数据集(ATIS, GeoQuery, WikiSQL)上取得超过 80 80% 80的精确度(参考文献[9, 19, 26, 42, 46, 47, 52, 56]);
  • 但是有论文(参考文献[54])发现这些先进的模型在最新发布的跨领域的Text-to-SQL数据集Spider上的表现非常糟糕; 原因如下:
    • Spider数据集中存在嵌套查询, 如包含GROUPBYHAVING的从句, 比同跨领域的Text-to-SQL数据集WiKiSQL要复杂得多(参考文献[56]);
      • 笔者注: 下面是Figure 1中地SQL查询语句, 查询意义是找到成绩高于5且有至少2个朋友的学生的名字;
        SELECT T1.name
        FROM friend AS T1 JOIN highschooler AS T2
        ON T1.student_id = T2.id WHERE T2.grade > 5
        GROUP BY T1.student_id HAVING count(*) >= 2
        
      • Figure 1中的示例而言, SQL语句中的student_id字段并没有在NL中被提到过;
      • 原因在于NL只是在陈述查询问题, 而不会包含查询问题的具体查询实现方法, 这就给现有的Text-to-SQL传统方法带来了信息缺失的挑战, 即仅根据NL提供的上下文信息是不足以完成查询任务的;
      • 这种挑战的本质(in essence)源于SQL是设计在关系型数据库中进行高效查询的语言, 而非与NL类似的表义语言(参考文献[22]), 因此NL所陈述的意图与SQL所表示的实现细节就会发生不匹配; 这种挑战本文称之为错误匹配问题(mismatch problem);
    • Spider数据集中存在大量领域外的(out-of-domain, 下简称为OOD)单词;
      • 开发集(development set)中有 35 35% 35的单词没有在训练集中出现过; 这个比例在WikiSQL数据中只有 22 22% 22;
      • 大量的OOD单词带来的直接挑战就是无法正确预测到NL中真实指向的数据库字段(参考文献[53]), 因为OOD单词在神经模型中通常缺少精确的表示(representation); 这种挑战本文称之为词汇问题(lexical problem);
  1. 本文的解决方案:
  • 本文提出一种用于解决上文中提到的错误匹配问题词汇问题的神经方法: IRNet;
  • IRNet的两个关键创新点: 使用了中间表示(intermediate representation, 下简称为IR)结构链接(schema linking); 具体而言, IRNet讲SQL语句合成过程分解为三个阶段(phases):
    • ① 第一阶段: 在NL问题与数据库表的结构(schema)上进行执行结构链接(schema linking);

      • 目的是识别出问题中提到的字段名和表名, 并且基于字段是如何在NL中被提及的给表中的字段赋予不同的类别标签;
        • 笔者注: 所谓字段是如何在NL中被提及的, 笔者理解为字段是以何种词性出现的(如常见的名词, 或是以动词方式间接表示出的), 或者是以何种语法成分出现(如主语或宾语);
      • 进行结构链接可以增强NL问题和数据库表结构的表示(representation)
    • ② 第二阶段: IRNet采用一个基于语法的神经模型(grammar-based neural model)来合成SemQL查询, 即本文设计来用于桥接NL与SQL的IR;

    • ③ 第三阶段: IRNet利用领域知识(domain knowledge)最终根据合成的SemQL查询推断出一个SQL查询;

  • IRNet利用IR来建模的思路来自于以下一些前人的研究:
    • lambda caculus: 参考文献[7];
    • FunQL: 参考文献[23];
    • DCS: 参考文献[30];
    • 各种语义解析任务(semantic parsing tasks): 参考文献[5, 31, 41, 55];
    • 前人在设计IR用于从数据库结构(data schema)和数据库管理系统(database management system)分隔(decouple)NL的语义表示(meaning representations): 参考文献[1, 2, 45];
      • 笔者注: 这三篇文献都是相当古老的研究了;
  1. 本文的成果:
  • Spider数据集上比基线(参考文献[54])提升了 19.5 19.5 19.5个百分点, 达到了 46.7 46.7% 46.7的精确性;
  • 截至本文发布, IRNet的模型评估结果位于Spider排行榜榜首;
  • 通过增加BERT模型, IRNet的模型评估结果可以提升到 54.7 54.7% 54.7的精确性;
  • 此外, 本文实验证明, 通过学习合成SemQL查询而非直接合成SQL查询可以大大提升(substantially benefit)其他Text-to-SQL的神经方法, 如SQLNet(参考文献[46]), TypeSQL(参考文献[52]), SyntaxSQLNet(参考文献[53]); 这意味着建立IR是有效的, 并且是一个用于处理复杂跨领域Text-to-SQL任务的具有研究前景的方向;

2 方法 Approach

本节主要详细介绍IRNet的方法, 就如何解决错误匹配问题(mismatch problem)和词汇问题(lexical problem)以及如何使用神经模型合成SemQL查询;

2.1 中间表示 Intermediate Representation

  1. 定义: SemQL即所谓用于桥接SQL与NL的IR, 是提出用于消除错误匹配问题;
  2. Figure 2中展示了SemQL与上下文无关的语法(context-free grammar), Figure 3则是对Figure 1中的SemQL语句所作的树状图解释;

  • 笔者注:

    SELECT T1.name
    FROM friend AS T1 JOIN highschooler AS T2
    ON T1.student_id = T2.id WHERE T2.grade > 5
    GROUP BY T1.student_id HAVING count(*) >= 2
    
    • Figure 2中所描述的语法规则:
      • Z Z Z: 表示是两个查询集 R R R的集合操作(交集, 并集, 差集等)或直接保留单个查询集 R R R而不作任何操作;
      • R R R: 表示查询集, 包括单纯查询字段( S e l e c t Select Select), 以及附加按照排序结果( O r d e r Order Order), 条件过滤后的结果( F i l t e r Filter Filter), 聚合结果( S u e r l a t i v e Suerlative Suerlative)后的查询集;
      • S e l e c t Select Select: 若干个通过查询得到的字段;
      • O r d e r Order Order: 按照字段升序( a s c asc asc)或降序排列( d e s c desc desc);
      • S u e r l a t i v e Suerlative Suerlative: 对聚合函数的结果取最值( m o s t most most l e a s t least least);
        • 这个 S u e r l a t i v e Suerlative Suerlative似乎不是很常用, 也不是很实用;
      • F i l t e r Filter Filter: 若干 F i l t e r Filter Filter条件的( a n d and and)和( o r or or)逻辑运算的结果;
      • A A A: 聚合函数如对某字段或整个数据表的取最大值( max ⁡ \\max max), 取最小值( min ⁡ \\min min), 计数值( c o u n t count count), 累和( s u m sum sum), 取平均值( a v g avg avg), 不作任何聚合操作( n o n e none none);
      • C C C: 某个字段;
      • T T T: 某个数据表;
    • 根据Figure 2中的语法规则, 对比上面地SQL语句, Figure 3中的树状结构可以被容易的解释清楚; 自顶向下地遍历这棵SemQL树:
      • 由于该SQL查询没有对多个查询集进行集合操作, 因此树根的 Z Z Z就是保留 R R R不作任何操作;
      • R R R显然是一种 S e l e c t F i l t e r Select Filter SelectFilter:
        • S e l e c t Select Select是从friend表中获取name字段, 不作任何聚合函数操作( n o n e none none);
        • F i l t e r Filter Filter包含两个由连接的条件:
          • ① 第一个条件是关于highschooler中的grade值需要大于某个数值;
          • ② 第二个条件是关于friend中任意字段的计数值( c o u n t count count)需要不小于某个数值;
  • 启发于前人研究(参考文献[23])中的lambda DCS模型, SemQL被设计成是一种树状结构, 这样有两种好处:

    • ① 在合成查询SQL语句可以高效地限制搜索空间
    • ② 由于SQL天生具有树状结构的特性, 这使得从SemQL转换到SQL会更加容易;
  1. 如何利用IR解决错误匹配问题:
  • 错误匹配问题的本质是SQL查询中的实现逻辑细节(如HAVINGGROUP BY从句)未能在NL问题中具体描述出来, 所以自然地会想到在SemQL中隐藏掉实现逻辑细节;
    • Figure 3中可以看到:
      • ① SQL中的HAVING, GROUP BY, FROM从句都没有在SemQL中出现;
      • WHEREHAVING中包含的条件语句都统一在SemQL树状结构的Filter节点子树中表示;
  • 在之后结合领域知识(domain knowledge)的推断阶段(inference phase)中, SQL查询的具体实现逻辑细节可以根据SemQL的结构很快被构造出来;
    • 例如出现在SQL查询GROUPBY从句中的字段往往会出现在SELECT从句中, 或者该字段本身就是某个数据表的主键, 而在SQL查询中对这个数据表中的某个非主键字段执行了聚合函数;
      • 笔者注:
        • 比如需要按照班级分类汇总(GROUPBY)时, 班级这个字段一般会出现在最后的查询结果中, 因为很可能是想查询关于每个班级某个统计量的结果;
        • 否则班级大概率就是某个数据表的主键(其实也可以理解为是外键, 用于表的连接), 然后对另一个字段作了聚合筛选; 如Figure 1中的GROUP BY T1.student_id HAVING count(*) >= 2, student_id就是充当highschoolers表和friend表连接时的主键和外键, 然后对另一个字段(*)做聚合(count)筛选;
  1. SemQL推断SQL的几个必要的前提假设:
  • SemQL要求必须指定字段所在的数据表名称;
    • 笔者注:
      • SQL中有时在SELECT从句中可以省略字段所属的数据表名称, 若该字段只在一个数据表出现过;
      • 但是显然这里SemQL没有那么智能, 所以Figure 3中所有出现字段名( C C C)的地方必然紧跟着所属数据表的名称( T T T);
      • 特别地, 为了便于后续从SemQL推断出SQL, 本文将*视为一种特殊字段;
  • 从SemQL推断SQL时, 要求数据表的结构(schema)必须时完整的;
    • 如某个数据表中某个字段实际上是另一个数据表中主键的外键, 则必须要求建表时有声明该外键约束(foreign key constraint);
    • 一般来说设计严谨的数据表都应当具备该性质; 而Spider数据集中有超过 95 95% 95的训练样本都满足该假设;
  1. SemQL推断SQL的流程:
  • 以推断SQL的FROM从句为例, 分为两步:
    • ① 首先确定SemQL中声明的所有数据表在数据库结构(schema)中的最短路径;
      • 笔者注: 关系型数据库结构(schema)可以视为一张无向图, 节点为数据表, 边为联系各个表的外键字段;
    • ② 然后将所有在路径(path)上的数据表表都连接(joining)起来就得到了FROM从句;
      • 笔者注: 这其实很符合常识, 我们在写SQL语句时一般都会先在FROM从句中把所有要用到的数据表全都连接起来, 再在WHERE从句中作筛选操作后, 最后在SELECT取出需要的字段;
  • 附录: 7 补充材料 Supplemental Material中有关于从SemQL推断SQL的详细步骤以及各种举例;

2.2 结构链接 Schema Linking

  1. 定义:
  • 所谓结构链接是为了识别出NL问题中提到的字段和数据表, 并基于这些字段是如何在NL问题中被提及, 来给这些字段附上不同的类型(types);
  • 结构链接是Text-to-SQL上下文(context)中的实体链接(entity link)实例化(instantiation);
    • 笔者注: 这句话似乎很难理解;
      • 实体(entity)代表数据库中的, 字段(columns), 数据表(tables)以及单个数值(cell values);
      • 本质就是构建抽象的SQL元素与形象的NL问题中的单词的链接;
  1. 结构链接的实现方法: 本文使用字符串匹配的方法来解决结构链接, 虽然很简单但是很管用;
  • ① 首先定义三种可能在NL问题中被提及的实体(entities)标签: table, column, value; 并枚举出一个NL问题中所有长度不大于的6的 n n n-gram短语;

    • 笔者注: 即1-gram到6-gram的单词组合全部都枚举一遍, 其实也不多, 若NL问题中一个有 t t t个单词, 穷举总共也就 6 t − 15 6t-15 6t15 n n n-gram短语;
  • ② 如果某个 n n n-gram短语恰好匹配上了某个字段名称, 或者只是某个字段名称的子串, 那么就识别该 n n n-gram短语是一个column;

    • 同理可以用相似的方法识别出某个 n n n-gram短语是一个table;
    • 如果某个 n n n-gram短语同时被识别为columntable则优先认定为column;
  • ③ 如果某个 n n n-gram短语以单引号(single quote)开头并以单引号(single quote)结尾, 那么识别为一个value;

  • ④ 一旦某个 n n n-gram短语被指定了识别结果, 那么所有与该 n n n-gram短语字符串有重叠部分的 n n n-gram短语全部被移除, 不再被考虑;

  • ⑤ 最后将所有识别出的实体序列与剩余的1-gram短语按原先NL问题中单词的顺序排列起来, 就可以得到一个互不重叠的实体序列;

    • 笔者注: 这其实就是做了一个分词工作;
  • ⑥ 根据⑤中得到的实体序列, 给序列中的每个 n n n-gram短语分别附上table, column, value标签, 这里本文称序列中的每个 n n n-gram短语为一个span(注意这个span在后文中会常常被提到);

    • 识别结果为column的短语, 根据是否为完全匹配可以分为exact matchpartial match两种类别标签;
    • 关于如何链接一个value到它对应的column, 可以使用参考文献[36]中提出的ConceptNet, 这是一个开源的大型知识图谱;
      • 本文只考虑ConceptNet两种返回结果: is the type ofrelated term, 因为一般来说columnvalue的关系就是这两种;
      • 如果有结果精确地或部分地匹配了某个字段名称, 则本文给它赋上value exact matchvalue partial match的类别标签;
      • 笔者注: 常见的想法是把value输入知识图谱获取返回的value上位词, 因为valuecolumn的关系就是下位词和上位词的关系, 然后在数据库结构(schema)中搜索哪个column与返回的上位词结果最匹配即可; 当然似乎按照文中的说法ConceptNet的返回结果是很丰富的, 这是个开源的知识图谱倒是很值得去学习一下;
  • 下面的Figure 4给出了详细的一个结构链接示例, 以及如何使用神经模型合成SemQL, 一些未知的模型构件可以在下一节中看到:

2.3 模型 Model

(1) 为了解决词汇问题(lexical problem), 本文在构建问题表示(representation)和数据库结构(schema)中的字段表示时考虑使用结构链接结果;
(2) 本文设计一个内存增强指向网络(memory augmented pointer network)来在合成过程(synthesis)中进行字段选择(selecting columns); 当一个字段被选到时, 该网络首先决定是否要在内存(memory)中选出, 这一点与vanilla pointer network(参考文献[40])时不一样的, 这里创新的动机源于作者通过观察发现, vanilla pointer network更倾向于选择相同的字段, 所以如果先决定是否要在内存(memory)中选择, 就可以改善这种情况;

  1. 自然语言编码器: NL Encoder