Text-to-SQL小白入门(三)IRNet:引入中间表示SemQL

摘要

本文主要介绍了IRNet论文的基本信息,比如标题、摘要、数据集、结果&结论,以及论文中提出的不匹配问题和词汇问题以及对应的解决方案,重点学习了中间表示SemQL。

引言

学习论文时,可以先粗略看看论文标题-摘要-数据集-结果/结论,最后想详细了解信息的话可以重点看看模型结构/代码实践等

论文标题

今天学习的论文是西安交通大学 、北京邮电大学、微软发表于2019年ACL的文章《Towards Complex Text-to-SQL in Cross-Domain Database with Intermediate Representation》,后面大家简称为IRNet (Intermediate Representation Network简写)

  • 英文标题:Towards Complex Text-to-SQL in Cross-Domain Database with Intermediate Representation
  • 中文翻译:使用中间表示(Intermediate Representation)在跨域数据集实现复杂的Text-to-SQL
  • 论文作者:Jiaqi Guo , Zecheng Zhan, Yan Gao, Yan Xiao, Jian-Guang Lou, Ting Liu, Dongmei Zhang
  • 作者单位:西安交通大学、北京邮电大学、微软
  • 发表会议:2019 ACL(Annual Meeting of the Association for Computational Linguistics),CCF-A
  • 文章链接:https://arxiv.org/abs/1905.08205
  • 代码链接:GitHub - microsoft/IRNet: An algorithm for cross-domain NL2SQL

看论文的意外之喜,仙交厉害啊

郭家琪和刘烃老师也是首个跨领域多轮Text2SQL中文数据集------CHASE数据集的作者!!!

那就顺带再放一下陕西省天地网重点实验室-刘烃老师组介绍:软件系统安全小组-陕西省大数据知识工程重点实验室

论文摘要

摘要已经把论文的核心说清楚了

核心创新点是在从自然语言问题->到SQL语言过程中,引入中间层表示,论文中称为SemQL

也就是:NL -> SemQL -> SQL

  1. 作者提出了一种称为IRNet的方法,适用于复杂和跨领域的Text2SQL。
  2. IRNet旨在解决两个挑战:
    1. mismatch problem :自然语言(NL)表达的意图与SQL实现细节之间的不匹配;
    2. lexical problem:大量的领域外的词给预测列带来了挑战。
  3. 与端到端合成SQL查询不同,IRNet将合成过程分解为三个阶段。
    1. schema linking:IRNet在问题和数据库模式之间执行模式链接。
    2. 生成SemQL:IRNet采用基于语法的神经模型来合成一个SemQL查询。(SemQL查询是作者设计的连接NL和SQL的中间表示)
    3. 生成SQL:IRNet确定地从具有领域知识的合成SemQL查询中推断出SQL查询。
  4. 在数据集Spider上,IRNet达到了46.7%的准确率,比以前最先进的方法获得了19.5%的绝对改进。
  5. IRNet在数据集Spider获得了第1名(2019年的时候)

论文数据集

论文数据集使用的是Spider数据集

论文结果&结论

结果

效果提升巨大!!!

  • Spider数据集上完全匹配精度exact matching accuracy 在开发集和测试集都取得第1的效果,重点是提升巨大。
  • 加上BERT后,提升效果更大。

特别困难的SQL需要有经验的SQL从业者才能写出,确实有点为难模型了。

  • 可以发现在Spider的简单SQL上准确率已经77.2%,特别困难的SQL准确率才25.3%。
  • 2019年榜单Test集是54.7%,2023年榜单Test集已经是74.0(提升空间仍然很大)

结论

看完结论,完结散花,开始下一篇

论文提出了什么方法

解决了什么问题

在什么数据集上验证了效果

论文提出了一种神经网络方法SemQL,用于复杂的跨域文本到sql,旨在解决词法问题以及模式链接和中间表示的不匹配问题。在具有挑战性的Spider基准测试上的实验结果证明了IRNet的有效性。

问题引入

前面摘要已经大概讲了原来的SQL的主要问题有2个

接下来细致讲解一下

mismatch problem不匹配问题

因为WikiSQL数据集相对简单,一些先进的端到端方法已经能达到80%以上的准确率了,但是在Spider数据集上却表现不佳。

Spider数据集带来了新的挑战

  • Spider中的SQL查询包含嵌套查询和子句,如GROUPBYHAVING,这比WikiSQL复杂。

考虑下图的Text2SQL,问题中从未提到要在SQL查询中进行分组的列"student id"。实际上,SQL中引入GROUPBY子句是为了方便聚合函数的实现。

  • 输入NL:

    Show the names of students who have a
    grade higher than 5 and
    have at least 2 friends
    (查询成绩大于5并且有至少2个以上朋友的学生姓名。)

  • 输出SQL:

    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

从本质上来说,SQL是为有效地查询关系数据库而设计的,而不是为了表示自然语言NL的含义。因此,在用自然语言表达的意图和用SQL实现的细节之间不可避免地存在不匹配,即mismatch problem。

lexical problem词汇问题

Spider数据集中划分了train训练集、dev验证集、test测试集

因为dev验证集中有35%的数据库模式的单词没有出现在训练集,相比之下,在WikiSQL中这个数字只有22%。

大量的OOD(out-of-domain)领域外的单词对SQL查询中的column列名预测 提出了另一个严峻的挑战,因为OOD单词通常在神经模型中缺乏准确的表示。论文认为这个挑战是一个词汇问题

问题解决

论文提出了问题

那么就要解决问题

为了解决这些问题,论文提出了IRNet。通过中间表示intermediate representation和模式链接schema linking 来解决不匹配问题和词汇问题

Intermediate Representation中间表示

为了消除这种不匹配,论文设计了一种特定于领域的语言,称为SemQL,它作为NL和SQL之间的中间表示。

下图左边就是与上下文无关的SemQL语法,下图右边代表一个SemQL查询的例子。

SQL例子:

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

SemQL语法

如上图左边所示:简单理解一下:

  • ***Z:***表示两个查询集合R之间的操作:交集、并集、差集或者不做任何操作
  • ***R:***表示查询集:单纯查询(Select)| 查询过滤(Select Filter)| 查询排序后的结果(Select Order)| 查询聚合后的最值(Select Superlative)| 还有这些的组合情况
  • ***Select:***若干个通过查询得到的字段。
  • ***Order:***升序asc和降序desc
  • ***Superlative:***最多most或者最少least(论文图里面写的suerlative,应该是少写了一个字母)
  • ***Filter:***过滤条件之间的关系:and | or,或者其他的过滤条件(> | < | = | ..)
  • ***A:***aggregation聚合函数
  • ***C:***column列
  • ***T:***table表

SemQL例子

结合SemQL语法,理解一下上图右边:SemQL例子:从上往下,自顶向下遍历这颗SemQL树

  • 只有一个查询集合,没有多个查询集的集合操作,所以直接从顶部 Z - R
  • R是一个Select Filter (因为SQL中是 SELECT T1.name ... WHERE),这个Filter是由2个Filter组成的。
    • Select 表friend的 name
    • 两个Filter之间是and 关系
      • 一个Filter是针对T2.grade > 5
      • 另一个Filter是count(*) >= 2

SemQL优点:

受lambda DCS (Liang, 2013)的启发,SemQL被设计为树形结构,有两个优点:

  • 有效地约束合成过程中的搜索空间。
  • 鉴于SQL的树结构特性,遵循相同的结构也使其更容易直观地转换为SQL。

为什么能解决mismatch问题?

不匹配问题主要是由SQL查询中的实现细节和自然语言问题中缺少具体信息引起的。

因此,很自然地将实现细节隐藏在中间表示中,这构成了SemQL的基本思想。

考虑到上图右边部分,SQL查询中的GROUPBY、HAVING和FROM子句在SemQL查询中被消除,WHERE和HAVING中的条件在SemQL查询中的Filter子树中统一表示。

在后面的推理阶段,可以使用领域知识从SemQL查询确定地推断出实现细节。

  • 举例子:SQL查询的GROUPBY 子句中的列通常出现在SELECT子句中,或者它是聚合函数应用于其中一个列的表的主键。

SemQL推断SQL的前提

1.要求在SemQL中声明列所属的表

  • 比如列"name"及其表"friend"是在SemQL查询中声明的。
  • 表的声明有助于区分模式中重复的列名

2.基于数据库模式的定义是精确和完整的假设来执行推断。具体地说,

  • 列是另一个表的外键,应该在模式中声明外键约束
  • 这个假设通常成立,因为它是数据库设计中的最佳实践。在Spider基准的训练集中,超过95%的例子都持有这个假设。

SemQL推断SQL的流程

以SQL查询中FROM子句的推理为例:

  • 首先确定连接模式中SemQL查询中声明的所有表的最短路径
    • (数据库模式可以表示为无向图 ,其中顶点是表,边是表的外键)
  • 然后将所有在路径(path)上的数据表表都连接(joining)起来就得到了FROM从句

Schema Linking模式链接

IRNet中模式链接的目标是识别问题中提到的列名和表名,并根据它们在问题中提到的方式为这些列分配不同的类型:table | column | value

字符串匹配

实现方式:字符串匹配的方法。(简单但是高效)

  1. 首先枚举出一个NL问题中所有长度不大于的6的n-gram短语。(就是按不同长度找字符串子集)
    1. 从长度为1、2、3、4、5、6分别枚举一次,假如自然语言问题长度为**x,**总共可以有(6x -15)个分词
    2. 长度为1的短语有x
    3. 长度为2的短语有x - 1
    4. 长度为3的短语有x - 2
    5. 长度为4的短语有 x - 3
    6. 长度为5的短语有 x - 4
    7. 长度为6的短语有 x - 5
  2. 如果某个n-gram短语恰好匹配上了某个字段名称, 或者是列名的子串, 那么就识别该n-gram短语是一个column
    1. 同理可以用相似的方法识别出某个n-gram短语是一个table;
    2. 如果某个n-gram短语同时被识别为column和table则优先认定为column;
  3. 如果某个n-gram短语以单引号开始+单引号结束,那么就认为是value
  4. 某个n nn-gram短语被指定了类型type, 那么所有与该n-gram短语字符串有重叠部分的n-gram短语全部被移除, 不再被考虑;
  5. 最后将所有识别出的实体序列(table 、column、value)与剩余的1-gram短语按原先NL问题中单词的顺序排列起来, 就可以得到一个互不重叠的实体序列;
  6. 根据⑤中得到的实体序列, 给序列中的每个n-gram短语分别附上table, column, value标签。这些短语在论文中称作一个span。

比如在下图中:自然语言问题Question中:

  • Show、the、and等都是剩下的1-gram短语,标记为none
  • book titles、years等是column
  • books 是table

模型

前面分享了论文提出的问题以及对应的解决办法

接下来分享一下模型的其他部分,模型结果如上图所示

NL Encoder

  • 作用:用于编码自然语言问题NL
  • 输入:问题Question + n-gram的分词type
  • 输出:Embedding
  • 通过Bi-LSTM实现

Schema Encoder

  • 作用:用于编码数据库schema信息。
  • 输入:接受整个s作为输入
    • s = (c, t)表示一个数据库结构schema
    • c = {(column, type),(column, type),....(column, type)},表示所有的列和类型
    • t 表示所有的table
  • 输出:Embedding

Decoder

  • 作用:用于生成SemQL查询。
  • 鉴于SemQL的树状结构,论文使用基于语法的解码器(Yin和Neubig, 2017,2018),该解码器利用LSTM通过动作的顺序应用对SemQL查询的生成过程进行建模。
  • 解码器与三种类型的操作交互以生成SemQL查询,包括APPLYRULE、SELECTCOLUMN和SELECTTABLE。
    • ApplyRule(r):生成规则r应用于SemQL查询的当前派生树
    • SelectColumn(c):从数据库schema中选择一个列column
    • SelectTable(t):从数据库schema中选择一个表table

额外

memory augmented pointer network内存增强指针网络

  • 作用:优化在合成SemQL过程中进行列column的选择。
  • 具体:当一个字段被选到时, 该网络首先决定是否要在内存(memory)中选出, 这一点与普通的 pointer network不一样。

Coarse-to-fine粗力度到细粒度

  • 作用:优化生成SemQL查询过程
  • 具体:引入Coarse-to-fine框架,该框架是用来将SemQL查询的解码过程分解成两个阶段:
    • 第一阶段: 一个框架(skeleton)解码器输出SemQL查询的框架(skeleton);
    • 第二阶段:一个细节(detail)解码器通过选择字段和数据表来向第一阶段输出中填写缺失的细节

代码

GitHub - microsoft/IRNet: An algorithm for cross-domain NL2SQL

preprocess/sql2SemQL.py:

  • 把sql 转化为 SemQL,便于训练。

sem2SQL.py

  • 把SemQL转化为 sql,便于输出测试。

参考

https://arxiv.org/abs/1905.08205

Spider: Yale Semantic Parsing and Text-to-SQL Challenge

【论文阅读】让数据库听懂人话(Text-to-SQL)_text2sql_囚生CY的博客-CSDN博客

Text-to-SQL小白入门(一) - 知乎

相关推荐
Channing Lewis15 分钟前
sql server如何创建表导入excel的数据
数据库·oracle·excel
秃头摸鱼侠15 分钟前
MySQL安装与配置
数据库·mysql·adb
UGOTNOSHOT20 分钟前
每日八股文6.3
数据库·sql
行云流水行云流水43 分钟前
数据库、数据仓库、数据中台、数据湖相关概念
数据库·数据仓库
John Song1 小时前
Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
数据库·redis·哈希算法
IvanCodes1 小时前
七、Sqoop Job:简化与自动化数据迁移任务及免密执行
大数据·数据库·hadoop·sqoop
tonexuan1 小时前
MySQL 8.0 绿色版安装和配置过程
数据库·mysql
JohnYan1 小时前
工作笔记- 记一次MySQL数据移植表空间错误排除
数据库·后端·mysql
我最厉害。,。2 小时前
Windows权限提升篇&数据库篇&MYSQL&MSSQL&ORACLE&自动化项目
数据库·mysql·sqlserver
远方16092 小时前
20-Oracle 23 ai free Database Sharding-特性验证
数据库·人工智能·oracle