用深度学习解决NL2SQL的启蒙算法——X-SQL
随着各行各业的逐步信息化,从业人员对数据检索和数据分析的需求在不断地扩大。然而,要掌握这些能力却具有一定的门槛。NL2SQL技术就是为了降低数据库表格的使用门槛而出现的一种技术,旨在将自然语言形式的查询原语转换为适用于数据库的SQL语言形式。近年来,学术界涌现出了很多基于深度学习的NL2SQL方法,其中较为经典的方法就是X-SQL,要学习NL2SQL技术,X-SQL是一种比较好的启蒙算法。 X-SQL架构主要包含三层:序列编码层(Sequence Encoder)、上下文模式增强编码层(Context Enhancing Schema Encoder)、输出层(Output Layer)。
一、序列编码层:
该层采用了一个类似于BERT的预训练编码器,并做出了几点修改:
- 每个表格schema 都增加了一个[EMPTY]列,在推理时,如果[EMPTY]列的分数最高,则认为不存在where子句;
- 使用Type Embedding 替换 Segment Embedding ,Type Embedding 包括了四种类型:问题、categorial column、numerical column以及空列;
- 基于多个GLUE任务训练了MT-DNN来替代BERT-large。这里还使用了一个小技巧,把[CLS]替换为[CTX]用来增强语义信息。
二、语境增强模式编码:
该层学习了一种增强每个字段的向量Hci,在上一层中,虽然已经有一部分语义信息被捕捉到了但还是非常有限的。语境增强编码方法认为,BERT形式的序列编码已经在自然语言侧已经达到了不错的效果,因此,为了更好地增强表格的模式信息,这层还融合了[CTX]向量的信息。
三、输出层:
输出层的主要任务就是生成SQL语句,该任务又由6个子任务组成,每个子任务都用于生成最终的SQL表达式的一部分。网络中采用了一个子网络可以表达为:
可以转化为下图:
这个公式计算的内容是根据每个不同的子任务进行的:
- 计算S-COL
用于计算SQL语句需要查询的表字段,计算方式比较简单,公式如下:
- 计算S-AGG
用于计算查询字段对应的聚合操作。为了解决部分聚合操作无法作用于string类型的数据上的问题,增加了另外训练的类型embedding,这样做可以让聚合操作和预测字段的类型不出现低级矛盾。这里用了hci而不是rci因为这里需要结合的字段类型信息和第一层的是非常类似的。
4-6. 计算W-NUM、W-COL、W-OP、W-VAL
用于计算组成WHERE部分的各个部分。
W-NUM:条件涉及的字段数目;
W-COL:条件包含的字段;
W-OP:条件的操作符;
W-VAL:条件值;
首先,W-NUM确定了条件的数目n,另外三个任务在取值时只需取softmax的前n个结果即可。W-COL的计算与S-COL基本类似,计算公式如下:
W-OP计算条件中最可能的条件符,W-VAL从query中抽取最有可能是条件值的部分:
实验结果:
上图是论文中提供的实验结果,实验在没有使用EG的情况下对比了SQLNet和SQLova的结果,可以看出X-SQL在验证集和测试集上均带来了较大的提升。在测试集上,对比SQLova逻辑形式精度提高了2.6%执行精度提高了2.5%。另一方面,论文还对比了SQLova和X-SQL在使用EG的情况下的结果,在测试上,逻辑形式精度提高了2.4%执行精度提高了2.2%。
总结:
X-SQL中较为重要的一点是提出了将NL2SQL任务拆分为多个子任务进行模型的学习,这一算法在后来的很多NL2SQL模型算法中均有体现。然而,X-SQL所解决的NL2SQL问题非常简单,数据集中WHERE子句仅有1或2条条件,条件之间的连接仅为and,缺少join、group by等操作。
总而言之,虽然X-SQL存在很多不足,但它还是很好的学习NL2SQL的启蒙方法,同时,我们也可以将这种思想应用到其他的语义解析领域。
- 点赞
- 收藏
- 关注作者
评论(0)