论文部分内容阅读
大数据时代已经来临,海量的数据被存储在各种数据库中,如何从这些海量的数据中挖掘有价值的信息成为人们研究的重点。医疗、教育、金融、软件开发等各个行业都会在工作中频繁使用SQL语句用于数据的增删改查。对于有一定编程基础的人来说,使用SQL可能是一件比较轻松的事情,但对于更多的人来说需要学习一定的数据库和SQL语言相关专业知识并且需要在熟悉数据库模式的前提下,才能熟练进行SQL语句的编写。所以降低SQL语言的学习成本,更快更好的生成SQL查询语句,使用更自然的方式进行数据库操作是一个值得研究的问题。自然语言处理(NLP)是近年来人工智能领域重点研究方向,发展速度很快。NLP的目的就是希望计算机能够理解人类的自然语言,同时期望计算机能够依据非人类语言类型的数据生成人类能够理解的语言类型,这是自然语言处理所要面对的两大主要问题,即自然语言理解(NLU)和自然语言生成(NLG)。NLP的发展能够极大的推动我们在人工智能领域的进展,具有重要的理论价值和实践意义。通过自然语言与数据库进行人机交互来查询数据,是一种可以被广泛采用的方式,这种方式既能节省用户学习专业知识的成本,也能提升数据查询的效率。因此,自然语言生成SQL语句,即Text2SQL任务,具有重要的研究价值。如何消除自然语言,数据库中数据表结构及内容和SQL语句三者之间在表达和结构上的差距,正确理解自然语言的语义并将用户的意图翻译成正确的SQL 语句是Text2SQL任务中面临的主要挑战。Text2SQL任务主要分为两部分,一个是将自然语言编码为计算机可以理解的内容,另一个是将编码内容再解析翻译成SQL语句,即经典的encoder和decoder过程。同时,我们也会面对两个不同的SQL 语句生成场景,分别是单表查询和多表查询。这两者之间也有很多不同之处,但也有可以复用的技术。自然语言编码的好坏直接影响后续任务的执行效果。One-hot编码显然是一个直接有效的方式,它为每一个词都赋予了数学意义上的唯一表示,但这样的表示过程中会丢失词在文本中的顺序信息。Word2Vec与传统的高维词向量One-Hot相比,它既能解决维数爆炸问题,还具备上下文的语义特征但它无法解决解决一词多义问题。预训练模型BERT在许多实验中已经证明了其在NLP任务中的有效性,所以将预训练模型用于自然语言编码也是现在一种很流行的做法。完成对自然语言编码过程之后,我们获得了自然语言查询语句的编码结果,该结果包含了词法语法语义信息,根据编码结果我们需要了解用户的实际查询需求,将此需求转化成正确的SQL语句。目前用于解决这个任务的方法大致分为两种:1.基于非深度学习的流水线方法;2.基于深度学习的端到端的方法。基于非深度学习的流水线方法是将自然语言查询转化为一种中间表达,再将这些中间表达转化为SQL语句。该方法的优势在于不需要大量的“自然语言查询-SQL语句”配对,因为获取大量标注数据代价很大且很耗时。而该方法的不足之处在于无法处理一些复杂多变的自然语言描述,只能处理几种比较固定的表达方式,并且依赖于提前定义好的模板和手动设计的特征,因此领域迁移性也较差。基于深度学习的端到端的方法可根据使用训练数据的多少分为弱监督学习和监督学习两种。虽然弱监督学习有着训练数据收集快,数据标注成本低等优点,但不可否认的是,通过充足的“自然语言查询-SQL语句”配对的训练数据进行监督学习,得到的模型在效果上也会更胜一筹。Seq2SQL将生成的SQL语句分为三个部分:聚合操作:(S-UM、COUNT、MIN、MAX等)、SELECT:选取列、WHERE:查询条件。每一部分使用不同的方法进行计算,作者同时提出利用强化学习基于查询结果来进行优化。为了解决Seq2SQL使用强化学习效果不明显的问题,SQLNet将SQL 语句分成了 SELECT和WHERE两个部分,每个部分设置了几个槽位,只需向槽位中填入相应的符号即可,最后通过注意力机制进行分类得到操作符和条件值。TypeSQL模型基于SQLNet,使用模版填充的方法生成SQL语句。SQLNet为模版中的每一种成分设定了单独的模型;TypeSQL对此进行了改进,对于相似的成分,例如SELECT-COL和COND-COL以及CONDS(条件数),这些信息间有依赖关系,通过合并为单一模型,可以更好建模。相比于之前decoder输出一段线性的文本,SyntaxSQLNet将解码的过程引入了结构性信息,即解码的对象为SQL语句构成的树结构。通过该技术,模型的精确匹配率得到很大提高。与SyntaxSQLNet类似,IRNet定义了一系列的CFG文法,将SQL转化为语法树结构。作者另一部分的改进主要在schemelinking,即如何找到问题中所提到的表格与列。现有的算法模型主要针对的是单表查询,在单表查询中有可能面临列名复用的问题,极大影响算法的准确性。同时现有的算法模型也较少有专门针对多表查询的优化,而实际的应用场景中,通常涉及到多个数据表的查询操作,复杂程度也会很大。在多表查询场景下,我们需要在更大的范围内寻找与自然语言查询中描述中相匹配的内容,分辨出这些内容分别来自于数据库中的哪些数据表,并且在生成SQL语句时,考虑更多的SQL要素。本文在进行了 Text2SQL领域国内外相关工作与研究充分调研的前提下,针对单表和其扩展的多表查询场景,实现了通过自然语言查询生成SQL语句的完整流程和方法。本文的主要工作和贡献可以概括为以下几点:·提出了利用预训练模型的上下文输出来增强结构化表示和利用深度学习分类模型来完成Text2SQL下游任务的的完整流程和方法。本文首先对SQL 语句进行解析,将序列生成问题转化为模板填充问题,即分解为多个分类问题,并根据转化后的问题进行数据标注处理。然后,在单表查询场景下,将Text2SQL任务分解为两个子任务,分别采用了通用分类模型和条件值获取模型,两者模型的输出结果共同构成完整的SQL语句;在扩展的多表查询场景下,对应的SQL结构比单表复杂得多,预测结果难以用一个简单的模板来进行管理。因此我们采用树形的语法结构,同时加入SPC(Statement Position Code)来管理子查询的问题,用递归的形式完成SQL的生成。同时改造encoder层加强自然语言问题与数据库表结构和内容上的联系,提升模型对数据库表和列的预测能力。·在单表查询场景下,基于模板填充将Text2SQL任务分解成多个多分类子任务。充分利用预训练模型在处理文本时的特征表达能力,通过微调的方式在各个子任务上构建相应的分类模型。通用分类模型的作用是获取SQL语句中除条件值之外的填充部分,在对SQL语句中的列名填充时,该模型改善了列名复用的问题;条件值获取模型是为了获取SQL语句中的条件值,分别针对文本类型和数值类型构建不同的模型,充分利用了自然语言查询和数据库中存储的内容,该模型改善了自然语言查询的描述与数据库中存储的列值数据表述不一致的问题。通过对比实验证明在WikiSQL数据集和WikiTableQuestion数据集上,该方法从列名、条件值预测等多个方面提升了 SQL语句生成的准确率。·在多表查询的场景下,依旧采用了单表查询场景下的思路,基于模板填充将Text2SQL任务分解成子分类任务,但同时针对多表查询的特殊情况对模型进行优化。单表查询中的encoder层仅仅使用单一注意力机制来融合信息,针对多表的情况我们可以引入transfomer和heuristic fusion function用于加强上下文的联系来构造更加复杂的模型,这个模型可以极大增强问句与数据库数据表结构内容上的联系,将表结构信息和自然语言问句中的信息同时考虑,在多表的情况下更好的确定我们所需要的表和列。同时由于多数据表任务对应的SQL结构比以前复杂得多,预测过程难以用一个简单的模板来进行管理。因此根据SQL语句的特点,设计了 SQL语句解析树同时加入SPC(Statement Position Code)信息来解决SQL语句查询嵌套的问题。通过对比实验证明该方法能很好地从单表查询场景迁移到多表查询场景,完成多表SQL语句的生成,在多表查询数据集Spider上与多个模型进行比较,取得了不错的成绩。