如何将SQL语句进行自动翻译

如何将SQL语句进行自动翻译

这里我们利用SQL-to-Text Generation with Graph-to-Sequence Model一文, 给大家简单介绍一下如何对SQL语句进行自动翻译

首先我们来谈谈这个动机, 我觉得最大的动机可能是为了让非技术人员可以了解SQL语句的意义, 进而提出来一种解决方案, 对SQL语句进行自动化的翻译.

说到自动化翻译, 其实就是自然语言处理方面的问题了, 那么之前就有人做过类似的工作, 比如使用规则, 或者模板进行严格形式的翻译

Georgia Koutrika, Alkis Simitsis, and Yannis E Ioannidis. 2010. Explaining structured queries in natural language. In Data Engineering (ICDE), 2010 IEEE 26th International Conference on, pages 333–344. IEEE

利用规则的翻译很显然是十分僵硬的, 也就是说, 翻译出来的东西不流畅, 不想自然语言, 那么在神经网络盛行的今天, 很快就有人提出了, 直接使用Seq2Seq模型来进行翻译, 这个Seq就是Sequence, 序列的意思, 或者Tree2Seq的模型, 我们用RNN或者LSTM可以对语言进行编码, 序列化, 然后再用一个RNN或者LSTM进行解码, 得到翻译结果, 当然这是最简单的编码解码的框架, 实际上可能复杂一点.

但是, 由于序列并不能很好的说明一些内部的结构信息, 举个例子

SELECT company WHERE assets > val0 AND sales > val0 AND industry_rank <= val2 AND revenue = val3

翻译:
which company has both the market value and assets higher than val0, ranking in top val2 and revenue of val3

如果是序列的话, 很有可能就翻译不出both the market value and assets higher than val0, 要察觉相同的作用的词在一个序列中其实是困难的, 而如果我们先转换成图结构, 那就简单多了.

图结构

故, 给出这么一个框架:

  • 首先, 我们有SQL语句, 作为输入
  • 将SQL语句转换成一个有向图
  • 再通过Graph2Seq模型, 将有向图翻译出来
    • 利用每个点的k跳个邻居节点进行点嵌入的编码
    • 利用所有点的点嵌入生成全局的嵌入
    • 利用全局嵌入进行解码得到最后的翻译结果

下面我们讲讲如何进行有向图的转换

有向图的转换

将SQL语句转换成有向图其实十分简单, 我们关注于两个句法:

  • SELECT句法
    我们将为SELECT a这样的句子, 创建一个SELECT节点和一个a节点, 注意到每一个节点都是有一个文本属性, 我们直接将其文本属性赋值为其名字. 注意到可能会有一些聚集选项, 比如你可能是COUNT, MAX这样的, 我们直接创建一个节点连上相应的列节点, 文本属性为相应的聚集名称.

  • WHERE句法
    WHERE可能有很多条件, 如上图所示, 我们将创建许多个条件节点, 然后用AND, OR, NOT这样的逻辑节点来进行连接, 最终全部都连到SELECT节点上.

这里的Graph2Seq模型参考自Kun Xu, Lingfei Wu, Zhiguo Wang, and VadimSheinin. 2018. Graph2seq: Graph to sequence learning with attention-based neural networks. arXiv preprint arXiv:1804.00823

你可能感兴趣的:(如何将SQL语句进行自动翻译)