语义解析是近几年发展起来的一个NLP的分支,主要目的是将自然语言的文本描述,自动转成机器语言(SQL)语句。也称Text-to-SQL, nl2SQL等。随着知识图谱的发展,也逐渐孵化出很多nl2Cypher算法。
NL2SQL的历史悠久,早在1973年,Woods等人就开发了一个名为LUNAR的系统,可以回答关于从月球带回的岩石样本的问题。到了1978年,Hendrix设计了一个连接美国海军舰艇信息数据库的自然语言接口,名为LIFER/LADDER。这些系统仅仅支持特定数据库的单表操作,受限于当时的技术发展,NL2SQL并没有受到太多的关注。直到2015年AI的复苏和NLP的发展,它渐渐回到人们的视线。
目前比较火的英文数据集有WikiSQL、Spider、WikiTableQuestions、ATIS等,中文数据集有刚刚结束的中文首届NL2SQL挑战赛公开的数据,各个数据集都有各自的特点,下面简单介绍下这几个数据集。
英文数据集,单表查询数据集。
https://github.com/salesforce/WikiSQL
WikiSQL数据集是Salesforce在2017年提出的大型标注NL2SQL数据集,也是目前规模最大的NL2SQL数据集。它包含了 24,241张表,80,645条自然语言问句及相应的SQL语句。目前学术界的预测准确率可达91.8%。样例如下图。
WikiSQL的问题长度8~15个词居多,查询长度8~11个词居多,表的列数5~7个居多,另外,大多数问题是what类型,其次是which、name、how many、who等类型。
下载方法:
git clone https://github.com/salesforce/WikiSQL
cd WikiSQL
pip install -r requirements.txt
tar xvjf data.tar.bz2
创建evaluate
mkdir -p third_party
git clone https://github.com/salesforce/WikiSQL third_party/wikisql
耶鲁大学的LILY Lab在2018年发布了Spider数据集。相比起之前的数据集更加接近真实场景——涉及多表关联、更多SQL种类、更广泛的领域——任务难度很大。数据集发布到现在1年半以来,(测试集上)准确率虽然已经从最初的27.2%为61.9%,但距离工业应用还有不小差距。
该数据集包含了10,181条自然语言问句,分布在200个独立数据库中的5,693条SQL,内容覆盖了138个不同的领域。虽然在数据数量上不如WikiSQL,但Spider引入了更多的SQL用法,例如Group By、Order By、Having等高阶操作,甚至需要Join不同表,更贴近真实场景,所以难度也更大。
https://yale-lily.github.io/spider
英文数据集,多表格,有CSpider,中文翻译版,但是对应的表格列名为英文,相对实验效果较差。
数据格式
数据样例
https://github.com/ppasupat/WikiTableQuestions
该数据集是斯坦福大学于2015年提出的一个针对维基百科中那些半结构化表格问答的数据集,内部包含22,033条真实问句以及2,108张表格。由于数据的来源是维基百科,因此表格中的数据是真实且没有经过归一化的,一个cell内可能包含多个实体或含义,比如「Beijing, China」或「200 km」;同时,为了很好地泛化到其它领域的数据,该数据集测试集中的表格主题和实体之间的关系都是在训练集中没有见到过的。样例数据如下:
ATIS(The Air Travel Information System)是一个年代较为久远的经典数据集,由德克萨斯仪器公司在1990年提出。该数据集获取自关系型数据库Official Airline Guide (OAG, 1990),包含27张表以及不到2,000次的问询,每次问询平均7轮,93%的情况下需要联合3张以上的表才能得到答案,问询的内容涵盖了航班、费用、城市、地面服务等信息。
https://www.kaggle.com/siddhadev/ms-cntk-atis
https://tianchi.aliyun.com/competition/entrance/231716/information
该数据集由追一科技在2019年举办的首届中文NL2SQL挑战赛中提出,使用金融以及通用领域的表格数据作为数据源,提供在此基础上标注的自然语言与SQL语句的匹配对,包括4万条有标签数据作为训练集,1万条无标签数据作为测试集。其中,5千条测试集数据作为初赛测试集,对选手可见;5千条作为复赛测试集,对选手不可见。样本格式如下:
中文单表格
表格信息:
2020年百度举办的LIC比赛,包含语义解析赛道,数据为中文数据,并在首届nl2sql基础上增加了多表查询的数据。提高了难度。
https://aistudio.baidu.com/aistudio/competition/detail/30?isFromCcf=true
红色文字标示出的是各阶段表现最好的基础模型,桔色高亮标示出的是各个时间点上的SOTA。
单表任务有很多比较好的模型,且达到了较高的结果,但是实际生产应用中多表查询更契合实际场景。。
2017 ACL Pengcheng Yin,Graham Neubig,Carnegie Mellon University
作者认为现有的方法将代码生成看做是自然语言生成的任务,生成树形结构结果
论文link
EMNLP 2018 论文链接:https://arxiv.org/abs/1810.05237
SyntaxSQLNet是第一个针对Spider任务设计的模型。在decoder阶段,不是生成线性文本,而是生成一棵对应SQL语言特点的语法树。同时论文提出了一种生成跨领域训练数据的方法,用数据增强来提升模型表现。
这篇论文是基于2017 ACL Pengcheng Yin,Graham Neubig的那篇论文来的,也是生成树形结构。
(Lee, 2019):针对不同的SQL语句来创建decoder;使用seq2seq而不是seq2set的方法进行列名预测;使用循环递归的方法来生成子查询。
(Bogin et al., 2019):将关系型数据库的数据结构用图神经网络表示,以此来提升数据库信息的利用效率。并将GNN结构用于辅助后续的编码和解码过程。
(Guo and Zhan et al., 2019):微软亚洲研究院。分三个阶段进行,首先,将所提问题和数据库的关系结构做schema linking。然后,用基于语法规则的神经网络构造一个SemQL query。最后,基于SemQL构造不同场景下的SQL query。
这个方法是19年的一个经典,基本处于当时霸占榜首的位置。
RATSQL(Wang et al., 2019):也是微软出品。用基于relation-aware的自注意力机制,建立一套完整框架来进行schema linking和schema encoding。同时,在有向图上定义了更多的边,对schema进行了更加详细的分解。
在进行几波改进之后,处于当前sota效果,所以简单说几句,这篇论文有重点
①对于Transformer的改进是第一大点,加入了关系进行attention(个人认为这个是提高效果很有意义的一点)
②graph的构建,这块貌似参考了IRNet相关内容
③ 生成SQL树,这块论文中记录是参考2017 Pengcheng Yin,Graham Neubig 这篇方法
Recursively Applying Sketch-based Slot Fillings for Complex Text-to-SQL in Cross-Domain Databases
https://arxiv.org/pdf/2004.03125.pdf
方法采用将SQL分块,在补充对应的内容的方法,SQL的块通过生成模型实现。
从榜单可以看到,除了IRNet RatSQL之外的方法中, RYANSQL的方法比较脱颖而出,且是单模型,未进行多余改进。
2020年LIC2020 语义解析比赛中,冠军团队的方法也是采用类似方案达到了远高于第二名和第三名的效果。
这里有一些比较经典的模型没有介绍到,比如XSQL是18年比较经典的一个nl2sql模型,主要用来解决单表查询任务,可以通过模板配置实现。有兴趣可以学习下相关论文。
目前榜首的几篇,① 多采用BERT XLNET等预训练模型来增强,② 其次,DB content 通过字段内容来提升模型识别能力。③ 重排序算法对于模型效果提高也有一定意义,,在beam输出里选择最优的预测来提升准确率。LIC2020语义解析冠军方案采用了重排序算法来对输入的column和tabel进行降维; 最新的论文Bertrand-DR(Kelkar et al., 2020/2/3) 建议了类似的方法。
NL2sql相关论文链接
https://zhuanlan.zhihu.com/p/143400912 RATSQL
https://zhuanlan.zhihu.com/p/139973372 RYANSQL
https://zhuanlan.zhihu.com/p/136877103 IRNet
从Spider榜单梳理Text2SQL技术演进的关键点
【综述】NL2SQL (一) 简介及数据集
论文笔记 | 语义解析相关论文