文本-SQL转化任务,是将用户的自然语言转化为SQL继而完成数据库查询的工作。
例如根据下表,用户输入一个问题,模型将其转换为 SQL,查询数据库得到结果:"-4.52, -9.55"
Query:新浪和人人网的周涨跌幅分别是多少?
SQL:
SELECT
周涨跌幅
FROM
表
WHERE
名称=‘新浪’
OR
名称=‘人人网’
原本要辛辛苦苦写SQL,现在我用
大白话
告诉机器想看的内容,就能从数据库中拿到答案,这就是Text2SQL。
本文将解读Text2SQL领域最新论文,BERT从中学会了如何编写SQL语言。原文发表在
EMNLP 2020
会议上。
论文题目
:
Bridging Textual and Tabular Data for Cross-Domain Text-to-SQL Semantic Parsing
论文链接
:
https://arxiv.org/pdf/2012.12627v2.pdf
开源代码:
https://github.com/salesforce/TabularSemanticParsing
想快速获取论文的小伙伴也可以在订阅号【
NLP情报局
】后台回复关键词【
0119
】下载。
01 Text2SQL定义
Text2SQL解决的是将自然语言映射到数据库查询语句SQL的问题。论文中将跨领域的text-to-SQL任务定义如下:
给定
自然语言问句
和关系型数据库模式
,模型需要生成对应的SQL查询
。
我们知道,一个数据库中可能包含很多张
表
,一张表又包含多个
字段
,所以
,
。每张表的表名
和字段名
都是文本字符。表中的字段可能有主键、外键,同时字段有不同的
数据类型
。
表中的
单元值
包含了真实数据信息,例如前文的“人人网”和“新浪”。
明白了什么是Q和S,我们来思考如何搭建模型。
02 模型架构
论文提出的模型BRIDGE采用了主流的
Seq2Seq
架构,把Text2SQL视作翻译问题(原序列:text,目标序列:SQL),包含编码器和解码器。
编码器
编码器的目的是
对Q和S分别做向量编码,同时对两者之间的关系充分交互
。
论文中,作者将Q和S拼接为一个
混
合的问题-模式序列
,作为编码器的输入:
每一个表名、字段名分别用字符
[T]
和
[C]
分隔。问题Q和S之间用字符[SEP]分隔。最后,在开始位置插入[CLS]字符。
这样的序列既符合BERT的输入格式,从而优雅地编码跨模态信息,又能快速获取任意字段的编码向量
(提取[T]/[C]对应特征即可)。
首先输入BERT,随后经过一层双向LSTM获得序列的初始编码表示
。
中的问题片段继续通过一层bi-LSTM获得Q的最终编码
。
Meta-data Features
相比于表名,字段名多了主键、外键等属性。为了利用这些特征(meta-data),论文中用了一层前馈网络对表名、字段名进一步编码。
这里的
分别表示各个字段的
主键、外键、类型特征
,
表示字段特征。将4个向量
横向
顺序拼接,经过函数
转化,可以得到每一个字段的最终向量表示。
表名没有额外特征,后三个维度均用零向量替代。各个表名、字段名都进行g函数转化,纵向拼接得到模式的最终编码
。
Bridging
截至目前,仅仅完成了Q和S的各自编码。读者可能会疑惑,
交互
在哪呢?
为了解决这个问题,作者使用锚文本(
anchor text
)将问题Q中包含的单元值与数据库字段链接起来。
具体实现上,作者将问题Q中的每一个token,与数据库表中每一列的所有value值进行字符串模糊匹配,匹配上的value值将被插入到序列X中。
如上图所示,问题Q和表格“
Properties
”、“
Reference Property Types
”相关联。其中Q包含的两个单词“
houses
”和“
apartments
”与两张表中的同名字段“
Property type code
”有
重合单元值
。
字段名“
Property type code
”本身没有在问题Q中出现,让模型直接推理出“
houses
”、“
apartments
”和“
Property type code
”相关,难度很大。
所以作者在
中把和问题
有关的单元值人为拼接在相应字段
之后
,相当于直接告诉
BERT
哪些问题片段包含引用。
作者把这种方式称为“
bridging
”,即模型BRIDGE的由来。
解码器
解码器的目的是从编码特征中还原出相应SQL。
相比于前人的工作(RAT-SQL
[2]
、IRNet
[3]
等),BRIDGE解码器设计非常简洁,
仅使用了一层带多头注意力机制
[4]
的LSTM指针生成网络。
在每一个step中,解码器从如下动作中选择1种:
1、
从词汇表V中选择一个token(SQL关键字)
2、
从问题Q中复制一个token
3、
从模式S中复制一个组件(字段名、表名、单元值)
从数学定义上分析,在每一个时刻
,给定解码状态
和编码表示
,按照
[4]
中的方式计算多头注意力
是语义子空间总数量,
表示从Q或S中复制相应token加入当前解码结果的
权重
。
紧接着,作者给出了由V和输出分布产生的概率定义:
是LSTM输出的概率分布,
是长度为
序列,只包含
中的问题单词和特殊标记[T]、[C](动作2、3)。
表示从V生成的概率(动作1),