0%

TypeSQL: Knowledge-based Type-Aware Neural Text-to-SQL Generation

论文概要

论文地址,发表于 2018 年。 - 所用数据集 + WikiSQL

对 text-sql 任务提出了 TypeSQL 模型,将问题视为 slot filiing task,使用 type(详见下面内容) 信息以更好的理解输入中稀有实体和和数字。 对关系型数据库构建一个自然语言接口是一个重要且具有挑战的问题((Li and Jagadish, 2014; Pasupat and Liang, 2015; Yin et al., 2016; Zhong et al., 2017; Yaghmazadeh et al., 2017; Xu et al., 2017; Wang et al., 2017a)。本论文使用 WikiSQL,它是 text-to-SQL 问题的一个巨大的基准数据集。对于该任务,具体来说是给定一个关于数据表的自然语言问题及其协议,系统需要生成与该问题对应的 SQL 查询。 本文基于之前的 state-of-the-art SQLNet(Xu et al., 2017: Sqlnet: Generating structured queries from natural language without reinforcement learning),TYPESQL 使用一个 sketch-based 方法,并将此任务视为 slot filing 问题。 进一步,特定于一个数据库的情况下,自然语言问题通常会包含不常见的实体和数字。之前的一些工作 Agrawal and Srikant, 2003: Searching with numbers 已经展示了这些词汇对许多下游任务起着重要作用,但是在预训练词嵌入模型中,大部分词汇缺乏准确的 embeddings。为了解决这一问题,无论单词来自知识图谱、数据库的列还是数字,TYPESQL 为每一个单词分配一个 type。例如,在图 1 中,我们将“mort drucker”作为 PERSON,对应于我们的知识图谱;将“spoofed title”,“artist”和“issue” 作为 COLUMN,因为它们是数据的列名;最后将 “88.5” 作为 FLOAT。结合这一发明,TYPESQL 进一步提高了 WiKiSQL 上的性能。 此外,先前大部分工作假定用户的查询包含准确的列名和实体,但是这是不切实际的。为了解决这一问题,……。

相关工作

方法

类似 SQLNet,我们使用了 sketch-based 方法,并且将该任务视为 slot filling。首先预处理问题输入,识别 type。然后使用两层 bi-directional LSTMs 去 encode 问题的单词,encode 时分别利用了 type 和列名(数据库)。最后用 LSTMs 输出的隐藏状态预测 SQL sketch 中 slot 的值。

Type Recognition for Input Preprocessing

首先将每个问题分为长度 2-6 的 n-gram 语法,然后在 table scheme 中使用它们进行搜索(这步很关键,但是我觉得用 n-gram 语法可能会错过一些列名吧),并且将问题中出现的任意列名打上 COLUMN 标签。其他类别做类似操作,转换如下所示(以下 type 均来自 Freebase): 1. 问题中出现的列名 -> COLUMN 2. 问题中的数字和日期 -> INTEGER, FLOAT, DATE, and YEAR 3. 命名体 -> PERSON, PLACE, COUNTRY, ORGANIZATION, and SPORT

五种类别的命名体以及涵盖了数据集中的大部分实体,因此不再使用 Freebase 提供的其他实体类型。

Input Encoder

如图 1 所示,我们的 input encoder 由 bi-LSTM 组成,分别为:\(\text{Bi-LSTM}^{QT}\)\(\text{Bi-LSTM}^{COL}\)。为了编码问题中的一对 word 和 type,我们将 word 和对应的 type 的嵌入拼接起来,然后将它们输入进 \(\text{Bi-LSTM}^{QT}\)。最后分别输出隐藏状态 \(\text{H}_{QT}\)\(\text{H}_{COL}\)。 为了编码列名,SQLNet 使用 Bi-LSTM 对每一个列名编码。我们首先平均具有 COLUMN 类型的单词的嵌入,然后只使用一个 \(\text{Bi-LSTM}^{COL}\) 编码。这样的编码方法提高了 1.5% 的性能,并且使得时间减半。我感觉这篇论文写得好乱,有点读不懂这部分。可能需要看一下 SQLNet

Slot-Filling Model

接下来,我们预测 SQL sketch 中 slots 的值。 文章沿用了 SQLNet 的 Column Attention 机制,即将 question 输入 Bi-LSTM 后得到的 \(H_{QT}\) 和 column 的 \(H_{COL}\) 做 Attention。关于列的编码部分,上面说了看不懂。计算过程为: \[ \begin{aligned} \alpha_{QT/COL} & = softmax(H_{COL} W_{ct} H^T_{QT}) \\ H_{QT/COL} & = \alpha_{QT/COL} H_{QT} \\ \end{aligned} \] 最后我们就得到了 \(H_{QT/COL}\) 隐藏状态。然后使用这个隐藏状态进行预测。具体公式为 MODEL COL-$SELECT COL\[ \begin{aligned} s & = V^{sel} tanh(W^{sel}_c H^T_{COL} + W^{sel}_{qt} H^T_{QT/COL}) \\ P_{sel_col} & = softmax(s) \\ \end{aligned} \] \(P_{sel_col}\) 就是每个单词的概率,我们可以使用 argmax() 函数得到最大概率的索引。

MODEL COL-$COND#: 。。。略

对于不同的模型,论文中都有说明,就不一一记录了。

之前理解错了,还以为跟 encoder-decoder 一模一样,现在才知道原来 slot filling 是这样的。 跟语义解析来比较,就是说大致的生成语句已经给你写好了,剩下的几个空,用 attention 的方法来填充,可以理解为不需要 decoder 部分了。