数据库的自然语言接口——Text to Data

这一章涵盖了文本到数据的转换。它从历史的角度开始,简要介绍了语义解析和意义表示方面的早期相关工作,然后转向利用词嵌入、语义组合性、知识图谱和大型语言模型的新方法。深入探讨了三个关键主题:

(1)将句子转换为结构化形式,

(2)神经语义解析,以及

(3)文本到SQL模型、系统和基准测试。

介绍

自然语言接口到数据库包括两个基本部分:(1)自然语言理解(NLU),也称为文本到数据,以及(2)自然语言生成(NLG),或数据到文本。这两个组件对应于图2.2中连接到用户的箭头。前者(NLU)主要用于将用户的请求转换为语义表示或可执行代码。这种转换可以采用输入问题的形式,也可以在与系统交互期间作为后续用户输入的形式。后者(NLG)并不是所有NLIDB系统都具备的功能,但是在使用时,它提供了一种以自然语言形式显示交互结果的方式。

在本章中,我们将讨论管道的文本到数据部分的组件。这包括意义表示、语义解析、文本到SQL翻译和相关主题。第6章将涵盖数据到文本的生成。

让我们从一个简单的例子开始。假设用户对大十美式足球联盟的教练薪水感兴趣,并且这样的信息在一个关系数据库中是可用的。用户可以用自然语言提出问题,例如,"大十联盟中薪水最高的足球教练是谁,他的薪水是多少?"而不是必须将问题写成SQL查询,比如下面所示的一个。

sql 复制代码
SELECT first_name, last_name, MAX(salary)

FROM football_coach

WHERE conference LIKE 'Big Ten'

GROUP BY first_name, last_name

LIMIT 1

在执行这样的自然语言问题之前,它必须转换为数据库查询格式,通常是SQL。这个自动转换过程传统上包括多个组件,对应于图2.2中的查询理解和查询转换框。

具体来说,查询理解的组件包括:

  1. 句法分析 - 理解句子或查询的语法结构。
  2. 语义解析 - 理解句子或查询的含义。

查询翻译的组件包括:

  1. 将问题映射到数据库模式 - 将问题的元素表示为实体、关系和集合,以及对这些实体和关系进行操作的函数。
  2. 将符号与数据值联系起来 - 例如,确定"Big Ten"指的是一个体育联盟的名称。
  3. 对符号在抽象级别进行推理 - 例如,回答涉及算术或逻辑推理的问题。

理解过程的一种思考方式是,我们以实体和关系的形式来表示世界,以及在这些实体上操作的函数。在这种方法中,自然语言句子中的名词(例如,"学生")对应于实体(例如,特定的学生)、实体集合(例如,所有学生)或实体的属性(例如,给定学生的年龄),形容词(例如,"高")对应于属性,动词(例如,"拿")对应于函数或关系。通过语义组合性,句子或查询中单词的含义被结合成整个句子或查询的含义表示。

自然语言理解和自然语言生成

通常,交流至少涉及两个主要角色:说话者和听者(图4.1)。说话者通过一系列步骤将自己的意图,例如目标和信念,转换成自然语言来传达。这个过程涵盖了战术生成,然后是合成(例如,文本或语音)。听者反过来参与感知(读取或听取说话者说出的自然语言句子),然后进行句法、语义和语用解释,最后通过内化或理解执行将新传达的信息合并的行为。通常,说话者和听者也通过接地共享一些上下文。例如,在用户与银行之间的对话中,用户和银行的名称,以及账号可能是这种共享上下文的一部分,甚至在对话开始之前就已经存在。

在经典的自然语言处理管道中,首先对输入的句子或段落进行句法分析(图4.2),例如,通过为每个单词标记一个词性标签,如名词(N)、形容词(J)、介词(P)和动词(V),然后构建句子的句法分析树(图4.3)。因此(如图4.4所示),将句子转换为含义表示(MR)。然后,使用接地、常识知识和推理来增强这个MR,然后可以将其用作要注入系统的新知识。

在自然语言界面数据库(NLIDB)中,通常发生在人类提问和数据库之间,其中有用的知识以表格或图形形式存储。为了理解用户,系统执行语义解析和含义表示(例如,以SQL格式)。此外,数据库必须以适合处理的格式表示。另外,回复用户可能涉及表格到文本的生成,我们在第6章中进行了介绍。最后,通信也可以超出文本到数据和数据到文本的更互动。我们在第7章中涵盖了与互动相关的更多主题。

历史概述

提供自然语言界面到数据库被许多人视为消除普通用户访问数据库的障碍的圣杯。2008年发生了一项重大发展,即创建了WebTables数据集 [1, 2]。这个包含了1.54亿张高质量表格的集合从140亿个HTML表格中提取出来,并且在当时,它是数量级上最大的可用数据库表格集合之一。

我们应该注意到存在多种类型的表格。在[3]中列出了三种主要类型的表格(关系表、矩阵PDF和矩阵电子表格),如图4.5所示。本章描述的大部分工作都是关于扁平(非层次化)的关系表。

在历史上,两个不同的社区一直在为NLIDB做出贡献:自然语言处理社区(例如,[4])和数据库社区(例如,[5])。作为文献中的样本,我们的第一个例子(图4.6)展示了如何使用语义解析将自然语言查询转换为基于λ演算的含义表示的逻辑形式。我们的第二个例子(图4.7)来自于NaLIR系统[5],该系统使用了Stanford依存解析器和Microsoft Academic Search(MAS)数据库的表示。

我们注意到这两个例子都是针对特定领域的表格,而不是通用领域数据集。

Li和Rafiei的早期著作[6],也是本书的两位合著者之一,对这个领域进行了深入的介绍。最近,又有两份优秀的新材料。其中一份是一份易于理解的入门调查[7],另一份是一份出色的教程[8]。它们将关于文本到SQL的论文分为三类。第一类是基于实体的,其中在内部表示(使用抽象语法树或其他中间表示)之前识别查询实体和这些实体之间的关系。第二类包括"早期"(神经网络之前)的系统,如NaLIR [9],使用本体的Athena [10]和Athena++ [11],而第三类的论文基于深度学习,通过单一流水线操作,例如HydraNet [12],RAT-SQL [13],SQLNet [14],TypeSQL [15],SyntaxSQLNet [16]和Seq2SQL [17]。

最近的两个教程[18, 19]列出了一些挑战,包括语言歧义性、参考解析和模式链接、推理、词汇差距、错别字、SQL语句的复杂结构以及数据库的结构。同一作者的最新调查[20]还提供了这一领域发展的时间线(图4.8)。

语义解析

语义解析是文本到数据系统的关键组件之一。它以不同形式存在已经有几十年了。早期的、神经网络之前的语义解析系统存在许多问题。它们依赖于特定领域,并且缺乏可扩展性和稳健性。此外,缺乏大量的训练数据使得无法使用大规模的监督学习方法。

神经语义解析是自然语言处理中从2013年到2014年开始的深度学习革命的一部分。神经方法在大约2016年左右开始在语义解析中占据主导地位,但是有一段时间,这些解析器仅限于单一领域中的简单查询,例如地理数据库。一篇展示了神经方法在不同领域间具有潜力的关键论文是Dong和Lapata [21]。作者使用了一个多层序列到序列的、基于LSTM的架构(图4.9)。输入以词嵌入的形式显示在图的底部。

含义表示

如何以适合推理的格式表示含义是语义解析中的一个基本问题。含义(语义)表示(MR)与句法表示(如解析树)不同,需要对各种形式的释义具有鲁棒性。例如,"猫找到了鱼"和"鱼被猫找到了"这两个句子应该理想地具有相同或者至少非常相似的语义表示。一种这样的表示是一阶逻辑(FOL):∃(x)∃(y) : Cat(x) ∧ Fish(y) ∧ Found(x, y)。这种语义表示可以以多种方式呈现为文本句子。

一阶逻辑(FOL)

一阶逻辑(FOL),或谓词逻辑,是一种经典的形式主义,用于表示含义。它特别适用于关系数据库,因为它们是围绕谓词(例如,关系和属性)和实体(例如,对象)的概念组织的。FOL符号表示用于表示对象、关系和属性。例如,一个符号对象可以用来表示人物爱丽丝。关系可以表示鲍勃是爱丽丝的兄弟:"Brother(Bob, Alice)"。另一个关系可以表示爱丽丝和鲍勃都会说法语:"Speaks(Alice, French) ∧ Speaks(Bob, French)" 。此外,对象的一个属性可以用来表示爱丽丝的年龄,例如,"AgeOf(Alice)"。

FOL还包括两个量词的使用。存在量词,标记为符号∃,描述了对象的存在,例如,"∃x Cat(x)" 表示存在一个对象x,这个对象表示一只猫。全称量词,标记为符号∀,用作一组(可能很大)事实的简写。例如,"∀x Player(x). ⇒ Speaks(x, French)" 表示"所有玩家都说法语"。 FOL用于符号推理,例如传统形式的演绎推理。图4.10用一个示例说明了这个概念,即如果一个陈述 . α 是真的,并且如果 . α 暗示另一个陈述 . β,那么可以推断出如果 . α 是真的,那么 . β 也必须是真的。右边的例子利用了替换,通过替换顶部的两个陈述,未绑定变量 . x 必须"绑定到"(与)常量 Martin 相关联。

λ演算

Lambda演算是由Alonzo Church [22]引入的一种通用的计算模型。它基于表达式,这些表达式可以是名称、函数或应用。在lambda演算中,名称是局部定义的。例如,在表达式λx:x中,我们认为x是"绑定"的,因为它由λx引入。其他名称,没有前置λ,被称为自由变量。例如,在表达式λx:x+y中,变量y被认为是"自由"的。Lambda演算表达式可以被类型化。它们可以使用单一类型(例如,真值t或实体e),以及复杂类型,如<e,t>。

后者对应于将类型为e的输入转换为类型为t的输出的对象,可以写成<e,t>,e>,描述了一个将类型为<e,t>的输入对象转换为类型为t的输出对象的对象。示例如图4.11所示。 Lambda演算可以用来表示所有的一阶逻辑。它允许组合性和高阶函数。术语"lambda函数"用于描述具有输入参数或参数以及主体的未命名函数。然后,这样的函数可以通过对主体中的表达式在输入参数上执行来"应用"到输入参数上。图4.12显示了两个lambda函数的示例。第一个示例将其(单一)参数加1。第二个示例计算其两个参数的和。 图4.13显示了一些额外的lambda表达式示例。

第一个示例描述了一个不及物动词(没有直接对象的动词)。第二个是一个及物动词(需要直接对象的动词),而最后一个示例展示了一个自反动词的例子(其中主语和宾语是同一个实体,即Mary喜欢自己)。 Lambda演算可以作为各种自然语言处理任务的中间表示,包括语义解析、推理和问答。图4.14中显示了一个问答中使用Lambda演算的示例。然后图4.15显示了FOL如何表示交互环境中的命令。

抽象含义表示

Abstract Meaning Representation (AMR) [26] 是一种形式化工具,它使用带有边缘和叶节点标签的有向无环图来表示句子的含义,将其表示为一组连接的实体、属性和事件,以新达尼尔森式的方式进行表示。AMR图的设计旨在提供超越语法的表示。

AMR基于早期的特征结构表示,例如[30]和PENMAN输入表示[31]。图4.16显示了一个AMR树的示例。

在AMR中,实体被表示为存在量化的变量,以词节点的形式,例如,"a/animal"。类似地,"(e / eat-01 :location (b / backyard))"这样的表示表示了一个吃东西的事件(e)发生在后院(b)中。事件基于PropBank帧集(例如,"eat-01")进行表示。AMR使用约100种关系(例如,"distance-quantity")来表达句子含义表示的其他组成部分。

AMR图可以是可重入的。例如,图4.17显示了"Lassie"节点间接地从"e / eat-01"节点和"f / find-01"节点下降。

AMR随着时间的推移发展,并引入了许多扩展。例如,它可以扩展到多句文本。O'Gorman等人在2018年介绍了多句AMR语料库(MS-AMR)[32]。关于这个主题的一篇更近期的论文是由Naseem等人在2021年发表的[33]。另一个扩展AMR的较新提议是通用含义表示(UMR)[34],它将AMR扩展到其他语言,特别是形态复杂、资源匮乏的语言。UMR还通过具有对语义解释至关重要的特征,以及捕捉潜在超越句子边界的语言现象的文档级表示,扩展了AMR。最近,另一篇论文[35]提出了BabelNet含义表示(BMR),作为AMR表示的替代方案。其他有用的参考文献包括两篇博士论文[36]和[37],它们更多地涵盖了AMR,包括解析和生成。此外,关于MR主题的最近教程提供了关于设计、用例、建模和真实用例的详细信息[38]。

词嵌入(Word Embeddings)

在自然语言处理中,如何表示语言信息是几十年来的一个关键问题。大多数早期方法使用符号表示。近年来,已经开始转向分布式表示。在神经网络中表示单词的一种方法是使用大小为 <math xmlns="http://www.w3.org/1998/Math/MathML"> v v </math>v的单热向量(图4.18),其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> v v </math>v是词汇量的大小。在单热表示中,向量的所有值都等于零,除了一个非零值出现在向量的第 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i个位置上,对应于词汇表中的第 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i个单词。

单热表示的一个根本问题是它们无法表示单词的相似性。例如,词对("猫","狗")之间的向量距离与("猫","汽车")之间的距离相同,尽管第一对中的单词在语义上与彼此更相关。

现代的语义表示取而代之的是基于词嵌入的。这些是从现有自然语言文本中自动学习到的稠密、低维(例如300维)向量。词嵌入也被称为分布式表示(图4.19),通过设计,很好地捕获了单词的相似性。在这个例子中,"猫"和"狗"的向量之间的距离将高于"猫"和"汽车"的向量之间的距离。

图4.20展示了单词"药品"的一个样本300维GloVe [39]词嵌入。图4.21展示了通过求和嵌入可以实现组合性。黑色箭头对应于产品-制造商的关系,而黄色箭头表示产品的类型。

词嵌入是使用无监督学习训练的,基于单词的共现。它们表示了在给定上下文的情况下预测单词的概率。例如,给定单词"树皮","骨头","小狗"和"兽医",单词"狗"很可能出现在附近,与语义上不同的单词(例如"西瓜")相比。词嵌入适用于计算语义相似度,以及识别最近邻居。单词的嵌入还可以进一步组成整个句子的含义表示。尽管词嵌入早在[40-42]之前就已经存在,但随着Word2Vec [43,44]和GloVE [39]的引入,它们变得非常流行。这些嵌入以及许多其他嵌入可以轻松从网络上下载,并且经常在各种NLP项目中使用。

现代NLP的一个主要范式是使用预训练语言模型(PLM),它们在大量的文本数据上进行训练。最显着的模型之一是BERT [45],它用于计算上下文嵌入。这样,神经网络可以区分"鼠标"作为动物和作为计算机配件的用法,因为"鼠标"的这两个版本将被编码为不同。BERT是一个大型的预训练神经网络,用于数百个NLP任务。它使用了多个Transformer层,并将其输入作为WordPiece [46]嵌入。它在图书和英文维基百科文本语料库上使用两个目标进行训练,即遮蔽语言建模(预测句子中的一个遮蔽单词)和下一个句子预测。BERT的基础模型包括110M个参数,而大型模型有340M个参数。BERT可以通过任务特定的层进行微调,例如执行不同的NLP任务。当首次引入BERT时,它在许多NLP任务上取得了SOTA的成绩,例如QNLI(问题-回答NLI)[47]、语义相似度和语言可接受性。BERT还被用作更先进和通常更大的预训练语言模型的基础,包括RoBERTa [48]以及表格特定模型,如TaPAS [49]、TaBERT [50]和GraPPa [51],我们将在第6章中讨论。

语义组合性

为了表示一个完整句子的含义,必须将各个单词的嵌入进行组合。逻辑中的组合性原则指出,复杂句子的含义可以从底层组件的含义和结构递归地计算出来。其中一种句子嵌入的示例是在 [ 52] 中引入的。这篇论文展示了深度平均网络(Deep Averaging Networks,DAN)在文本分类任务中取得了出色的性能。DAN 计算输入单词嵌入的平均值,然后将这些平均值通过前馈层传递。

自然语言显示了组合性和非组合性特性的混合。例如,"红房子"这个短语的含义是组合性的;它可以通过组合两个基础单词的含义得到,因为红房子只是一座被涂成红色的房子。然而,像"红鲱鱼"这样的习语表达是非组合性的,因为它不是关于一条红色的鲱鱼。换句话说,"红房子=红色+房子"但是"红鲱鱼/≠红色+鲱鱼"。

图 4.22 展示了如何利用组合性来表示出现在 NLIDB 问题中的短语的含义。例如,"计数(人)"这个短语的含义由谓词"计数"和宾语"人"的含义组合而成。组合性在含义表示和语义解析中发挥着重要作用。

知识图谱和RDF(资源描述框架)

知识图谱是另一种有用的实体和关系表示方式。它们可以用于表示来自维基百科等信息源的世界知识,例如,某位艺术家演唱过哪些歌曲、某个州有哪些河流流经、或者哪些人统治了特定国家多年等。知识图谱由顶点(实体)和边(关系)组成。图 4.23 展示了关于休斯顿火箭篮球队及与之相关的一些对象的样本知识图谱。

资源描述框架(RDF)[54]是用于编码知识库,如DBpedia和其他数据集,例如FOAF和LinkedGeoData的语言。这种表示受到W3协会(w3.org)的支持。RDF三元组由主语、关系(谓词)和宾语组成。然而,它并不是自然语言表示。图4.24展示了来自Yago的一个示例。

句法表示

计算机语言(如C语言)的解析是由编译器完成的,编译器利用计算机代码的明确结构。与计算机语言不同,人类语言存在(高度)歧义性。人类语言没有明确的词汇"类型",没有短语周围的括号,而且在大多数情况下,也没有明确的嵌套标记。额外的问题来自于歧义性词汇和短语、暗示和常识信息的使用等。句法分析(包括成分分析和依存分析)用于解决自然语言文本中的句法歧义。

成分分析构建的句法树通常以S("句子")节点作为根节点。然后,递归地,它们编码句子的句法结构,例如,S节点可以有一个名词短语(NP)和一个动词短语(VP)作为其子节点。在树的另一端,叶子(终端)节点对应于句子中的个别单词,而它们的父节点("预终端")代表了叶子节点的词性标记(例如,N代表名词,V代表动词)。预终端及其以上的其他节点统称为非终端。成分分析通常使用Collins解析器或Charniak解析器等方法进行。

依存分析构建一个根据语法的有向跨度树,而不使用非终端。相反,除了根节点之外的每个节点对应于句子中的一个词。每个节点可以有零个或多个子节点。每条边对应于一个句法依赖关系,依赖关系的"头部"显示为父节点,每个"修饰词"显示为子节点。例如,短语"红房子"被表示为具有"红色"作为修饰词(依赖)节点和"房子"作为头节点的依赖边。根节点通常是句子的主谓。一些经典的依存分析方法是MacDonald等人和Nivre等人的方法。近年来,陈等人和曼宁等人等神经方法已经取代了这项任务。

多年来,已经提出了许多语法形式主义,例如归纳逻辑编程、SCFG、CCG + CKY、约束优化和整数线性规划(ILP)以及与投影依赖分析相结合的基于依赖的组合语义(DCS)。

值得注意的是,这两种传统的句法分析范式(成分分析和依存分析)在现代NLP流水线中并没有直接使用。相反,它们现在大多已被神经方法取代。

Combinatory Categorial Grammar(组合范畴语法,CCG)

组合范畴语法(Combinatory Categorical Grammar,CCG)是一种轻微上下文敏感的语法形式,可以准确地表示几种有趣的语言现象,特别是从词汇和句法角度来看。CCG中使用的词汇表相对较小,并且容易组合成复杂的嵌套结构。Zettlemoyer和Collins(2009)提供了这个例子。

词汇表描述了一组句法和语义规则的混合。在上面的例子中,"flights"的词汇表条目表明这个词是一个名词(N),但它也用于表示语义类型为"flight"的对象x。对于"to"的第二个词汇表条目表明,"to"可以与其右边的名词短语(NP)组合(例如,与名词短语"Boston"),得到类型为(N N)的结果,这可以进一步与名词(N)组合,并具有以下语义含义:存在一个对象(例如,"flights"),以及两个位置(x和y),使得存在"flights"对象,连接这两个位置(如"从纳什维尔到波士顿的航班")。

图4.27显示了CCG中使用的简单和复杂的句法类型的示例。可以看到,即使是基本的词性类别,如形容词、冠词和介词,也可以从其他类型中组合定义。例如,冠词可以定义为一个对象,当与其右侧的名词组合时,返回一个NP(名词短语)类型的对象。

CCG还用于句法和语义分析,通过应用规则,例如组合规则。考虑图4.28中的示例。在句法层面上,它展示了词汇"to"和"Boston"(分别具有类型:(N N)/NP和NP)如何组合成短语"to Boston"(类型为"N N"),然后可以进一步与词汇"flights"(类型为N)组合成完整的短语"flights to Boston"(在此特定示例中为"N"类型,尽管更好地表示为"NP"或名词短语)。在语义层面上,最终结果是λx. flight(x) ∧ to(x, boston)的λ表达式。然后,这个λ表达式可以与另一个N(例如,"纳什维尔")组合成短语"从纳什维尔到波士顿的航班"。CCG还可以用于将句法类型映射到语义类型(例如,类别到λ表达式),还可以执行其他操作,如组合、类型转换和协调。

将句子转换为结构化形式

研究人员几十年来一直在探索将自然语言自动翻译成数据库查询的方法。这个领域的最早工作之一是月球科学自然语言信息系统[67],该系统提供了一个接口,用于访问有关月球岩石的小型数据库。

信息提取

信息提取是文本转数据流程中的重要组成部分。它是将非结构化文本自动转换为结构化表格的过程,后者可以通过数据库接口进行后续处理。在图 4.29 和 4.30 的示例中,普通文本句子,即关于股票评级变化的标题,被转换为结构化(数据库)格式。并非所有字段都可能出现在输入中,或者被系统提取出值。输出中的每条记录都与输入句子之一相匹配。字段包括公司名称、其"ticker"(交易)符号、评级变化的来源、旧评级和新评级(如果已知),以及变化的方向(上升、下降、不变)。每个字段(或属性)的类型以不同的颜色显示。

GeoQuery

GeoQuery是一个经典的项目,位于与NLIDB相邻的自然语言处理领域。这个项目产生了大量的后续贡献。其基础数据库GeoBase(有时称为GEO)包含了关于美国地理的800条事实,以Prolog表示。图4.31展示了这个数据库的示例。然后图4.32展示了GeoQuery中使用的主要对象(例如国家、州和河流)。图4.33和4.34分别说明了在论文中使用的谓词和元谓词。

GEO基于Chill [ 68],它使用句子对和可执行的数据库查询作为输入。查询语言基于逻辑语法(例如,[ 69, 70])。查询解释器执行数据库上的查询。后来,Tang和Mooney [ 71]使用了一种移位归约类型的解析器,其中包含诸如INTRODUCE、COREF_VARS、DROP_CONJ、LIFT_CONJ和SHIFT等运算符。INTRODUCE在栈顶部插入一个谓词,以便预测以当前输入中的词开头的表达式。然后,这个解析器被归纳逻辑编程(ILP)方法接替,该方法通过自底向上和自顶向下搜索规则空间。

语义解析

语义解析用于将自然语言转换为符号化和/或逻辑形式,即针对特定应用程序的可执行代码。一些明显的例子包括航空公司预订、地理信息系统、访问包含体育比赛结果的表格等。图4.35展示了如何使用语义附着来构建分层的含义表示。在这个例子中,输入是自然语言句子"Javier likes pizza."。这个句子被表示为一个语义树,其中"S: likes (Javier, pizza)"是根节点。在这个表示中,"S"代表"句子"(输入句子的句法类别),而"likes (Javier, pizza)"给出了输入句子的含义。递归地,内部节点具有类似的句法+语义结构。例如,"VP"(动词短语)节点具有一个λ表达式作为其语义表示。图4.36展示了一个上下文无关文法,可以用来生成图4.35中的解析树。

半监督语义解析

在那个时期,还有一些其他相关的论文值得提及。在 [72] 中,作者描述了一个在Freebase上进行语义解析的系统,而不使用已标注的逻辑形式。他们使用了Liang的Lambda Dependency-Based Compositional Semantics(λ-DCS)框架的简化版本。他们通过潜在的逻辑形式将问题映射到答案。首先,他们利用Freebase和文本语料库进行粗略的对齐,然后执行一个桥接操作,使相邻的谓词兼容(见图4.37)。在他们的工作中,他们使用了Cai和Yates的FREE917数据集 [73],该数据集包含917个问题,涉及635个Freebase关系。尽管没有使用标注的逻辑表示,但他们的系统性能优于Cai和Yates的解析器。他们还介绍了WebQuestions数据集,该数据集包含使用Google Suggest API检索的关于单个实体的wh-问题。

一个有趣的研究问题是,如果训练数据中没有逻辑形式的标注(例如CCG公式的λ表达式),会发生什么情况。在2010年代中期,该领域的一些主要贡献与WikiTableQuestions(WTQ)数据集 [74] 以及随后的工作相关。WTQ数据集包含来自2,108个开放领域维基百科表格的22,033个问题/答案对。这些问答对是通过众包获得的。众包工作者被要求编写需要组合性的问题(例如包括计数、差异和比较)。图4.38显示了该数据集中的一个示例。

论文 [74] 着重介绍了通过表格进行复杂问答的语义解析。它引入了一种基于逻辑形式和强类型约束的解析算法,旨在处理可能解析的数量的组合爆炸,这又是由于需要泛化到未见过的领域、模式和表格以及需要更深层次的组合性。

训练三元组 (��,��,��)(xi​,yi​,ti​) 分别由问题、答案和表格组成。不需要逻辑形式。训练集和测试集中的表格是不重叠的。图4.39说明了预测框架。在步骤(1)中,将输入表格 �t 转换为表示 �w。在步骤(2)中,解析器读取输入问题 �x,例如"希腊在哪一年举办了最后一届夏季奥运会?"以及 �w,并生成输入问题的多个解析候选项,形式为潜在变量 ��Zx​。接下来的步骤(3)进行排名并生成 �z。然后,在步骤(4)中,执行 �z 中生成的表达式在表格表示上,并将结果存储在变量 �y 中。最后,对 (�,�,�,�,�)(x,Z,z,t,y) 五元组进行排名。

后续论文 [75] 使用简单的语法将话语转换为简单("笨拙")的逻辑形式。然后,众包工作者重新表达简单的逻辑形式,然后使用生成的数据集训练语义解析器,仅需几个小时(见图4.40进行说明)。

神经语义解析

最近大部分自然语言理解的工作都是使用神经网络进行语义解析。这种趋势始于大约2014年,并且至今仍在持续发展。

序列到序列(Seq2Seq)方法

文本到文本生成------将文本序列翻译成其他文本序列------是自然语言处理中的基本任务之一。这种范式涵盖了语音到文本生成、机器翻译、文本摘要等许多任务,包括文本到SQL翻译。

进行文本到文本生成的主要方法之一是通过序列到序列模型,例如最初的seq2seq论文中描述的模型。

在这样的模型中,使用递归神经网络(恰当地称为编码器)从输入序列中提取一些含义。当到达输入的末尾(例如,达到一个 <math xmlns="http://www.w3.org/1998/Math/MathML"> < E O S > <EOS> </math><EOS>符号或等价物)时,网络开始将迄今提取的含义"解码"为匹配的输出序列(例如,使用不同的语言或不同的表示形式)。这一步通常以自回归的方式进行,每个后续的输出符号都是基于输入和先前生成的输出符号生成的。图4.41中的示例显示了如何将简单的自然语言查询转换为SQL语句。更近期的方法还使用了注意力机制和变压器。与文本到SQL相关的现代论文之一是Dong和Lapata的工作[21],随后是[17]。一些后续的工作是基于草图的。其中一篇论文是SQLNet[14],其中每个组件都有自己的编码器。列注意力被用来强调与表头匹配的查询中的单词。与WikiSQL不同,SQLNet不使用强化学习。

另一篇相关的论文是SQLova [77]。它采用了与SQLNet相同的草图思想,并一次处理表的所有列。相关的论文是HydraNet [12]。它分别处理每一列,然后将以下信息传递给BERT的每一列:([CLS], NLQ, [SEP], column_type, table_name, column_name, [SEP])。然后,它使用BERT的输出来预测草图插槽。分类任务包括预测特定列是否出现在SELECT或WHERE子句中,预测特定列的聚合函数,预测列的条件等等。在那个时期的一些其他相关论文包括IncSQL [78],IRNet [79]和[80]。最近的一项调查指出,Seq2SQL和SQLNet使用单词嵌入作为输入,而HydraNet、SQLova、IRNet和RAT-SQL使用迁移学习。

神经语义解析的应用

多年来已经发表了许多关于神经语义解析应用的论文。我们在这里简要讨论其中一些。

神经方法允许语义解析器扩展到任意领域。Dong 和 Lapata [21] 使用编码器-解码器模型和注意力机制对逻辑形式进行编码(图 4.9)。基于 LSTM 的底层架构可以生成树(图 4.42)或序列。这项工作在四个数据集上进行了评估(图 4.43):Jobs、Geo、ATIS 和 Ifttt。前三个数据集在第 5 章中进行了审查,而 Ifttt 数据集包括来自 IFTTT 网站的 if-this-then-that 配方。注意机制生成的对齐显示在图 4.44 中,其中彩色框显示了输入序列的跨度如何与匹配的输出序列的跨度对齐。

Reddy 等人的后续论文 [81] 研究了将依赖结构转换为逻辑形式。专注于依赖结构而不是成分结构可以使用更简单的架构。结果表明,这种方法在 Free917 数据集上优于早期基于 CCG 的表示,并在 WebQuestions 数据集上取得了竞争性结果。

依赖树被转换为 lambda 表达式(图 4.45)。图 4.46 显示了一些单词的 lambda 表达式以及一个句子解析。该方法使用的操作包括二进制化,例如,"(nsubj(dobj acquired Pixar)Disney)",替换和组合。

Dong 和 Lapata 后来引入了粗到细的解码 [82],使用与他们 2016 年论文相同的数据集(见图 4.47)。这项工作的思想是在粗略阶段首先生成一个含义草图,然后在细化阶段,让解码器填补含义表示中缺失的细节(图 4.48)。最后,他们还在 WikiSQL 数据集上测试了他们的方法 [17](图 4.49 和图 4.50)。

在这里,我们还将简要提及 [83] 的工作。该论文介绍了一种将话语转换为可执行形式查询的上下文相关模型。与 ATIS 的交互显示在图 4.51 中。图 4.52 显示了注释的 SQL 查询。

Text-to-SQL

将自然语言查询稳健地转换为 SQL 面临诸多挑战。其中包括开放领域、复杂的数据库模式、多样化的语言表达,以及递归和组合性等基本问题。

以图 4.53 为例。用户的问题是:"哪些欧洲国家有一些球员至少赢得了澳大利亚公开赛 3 次?"。要回答这个问题,需要对三个表进行连接:比赛(Matches)、排名(Ranking)和球员(Players)。该过程涉及的阶段包括将实体映射到单元格值(图 4.54)、将问题术语映射到列标题和表名(图 4.55 和 4.56),然后处理聚合查询(图 4.57)。

早期的一篇论文,Neural Enquirer [84],引入了一种神经架构(图 4.58)来将自然语言查询映射到表格。它执行端到端的神经查询转换和执行。然后,SQLNet [14] 使用列注意力和基于草图的方法来生成 SQL,作为插槽填充,无需使用强化学习。

早期在文本转 SQL 任务上的工作受到的一个阻碍因素是缺乏大规模且多样化的数据集,用于模型的训练和评估。近年来,为了克服这一挑战,引入了多个数据集,这些数据集与更强大的神经模型一起推动了这一重要而又具有挑战性的问题的快速进展。

数据集分割

Finegan-Dollak等人调查了常见数据集的训练和测试集拆分问题,这些数据集通常包含非常相似的数据点。该论文提出了一种拆分方法,确保任何相关的示例都出现在同一个折叠中(仅在训练集或仅在测试集中)。作者还表明,通过这种拆分,许多数据集先前报告的性能结果似乎过于乐观,而在新拆分下的修订结果通常显示出非常低的分数(有关更多详细信息,请参见第5.5.4.1节)(图4.61和图4.62)。

这项工作的一个结果是密歇根大学的text2sql-data语料库,其中包括基于[85]的适当拆分的SQL数据集,基于[5, 17, 61, 71, 86--91]。

Spider评测基准

Spider数据集,由于Yu等人引入,是另一个有影响力的开放领域文本到SQL数据集。它专注于多表连接(JOIN,UNION)以及聚合查询(例如,GROUP BY,MAX和SUM)和嵌套查询。与WikiSQL相比,它包含的查询和表更少,但被认为质量和复杂性更高。它包括单轮问题和其训练集中的140个数据库,以及另外60个不相关的数据库作为测试集的一部分。

建立Spider数据集需要11名耶鲁大学的学生数月的大量努力。具体分工如下:数据库创建(150个人时),问题和SQL注释(500个人时),SQL审查(150个人时),问题审查和改写(150个人时),最终审查和处理(另外150个人时)。

Spider数据集中的数据点按困难程度标记,这是根据SQL关键字的数量和类型确定的。正如论文所指出的,如果查询具有"超过两个SELECT列,超过两个WHERE条件,并且GROUP BY两列,或包含EXCEPT或嵌套查询",则将其视为困难查询。要标记为额外困难,查询必须更加复杂。一些示例显示在图4.64、4.65、4.66和4.67中。Spider和WikiSQL的统计数据显示在图4.68中。

Spider数据集的扩展

多年来,Spider已经衍生出了许多扩展数据集。我们简要介绍其中一些。CoSQL [94] 是将Spider扩展到了多轮对话语境的数据集。CoSQL数据集的示例如图4.69所示。它包括了30,000+轮次和10,000+个带注释的SQL查询,通过向导式对话(Wizard-of-Oz,WOZ)方法从约3,000个关于涵盖138个领域的200个数据库的Spider数据集的对话中收集而来。这些对话旨在模拟真实场景,包括一个众包工作者和一个SQL专家,后者可以使用SQL检索答案,可能在过程中需要澄清模糊的问题或告知众包工作者查询无法回答。如果查询是可以回答的,SQL专家会以自然对话的形式描述模式、SQL查询和执行结果。与传统的面向任务的对话数据集不同,这里的对话状态是基于SQL的。此外,测试是在新的领域进行的,因此在CoSQL数据集上表现良好的系统必须是独立于领域的。CoSQL包含三个挑战:基于SQL的对话状态跟踪、从查询结果生成响应以及用户对话行为预测。

EditSQL [95] 通过编辑最近的语句生成序列化的SQL语句。示例如图4.70所示。编辑组件将后一个SQL查询中的"id"替换为"name"。

SpaRC [96] 是在跨领域语境下进行的多轮语义解析的数据集。它包括4,298个问题序列,其中包含12,000+个问题,所有问题都附带有SQL查询注释。与CoSQL类似,SpaRC也是基于原始的Spider数据集。图4.71展示了SpaRC顺序方面的示例。

TypeSQL [15] 使用基于草图的方法来填充槽位。它利用两个双向LSTM来编码问题词的类型和列名。LSTM的隐藏状态预测了草图中的值。图4.72中包含了TypeSQL的示例。

最后,SyntaxSQLNet [16] 使用了针对复杂和跨领域文本到SQL生成的SQL特定树解码器。示例如图4.73所示。它使用了SQL路径历史和表结构的注意力编码器,以及SQL特定的语法树解码器。图4.74展示了SyntaxSQLNet的示例。图4.75展示了部分SQL语法。

选择性的近期论文

RAT-SQL 16是在[97]中介绍的。它专注于领域泛化。它使用了一种关系感知的自注意方法,以统一的方式解决多个任务,包括模式编码、模式链接和特征表示。它使用了一个问题上下文化的模式图和预定义的模式关系。边对应于模式关系,并且还用于按名称和值进行链接。训练用于关系感知自注意的转换器识别已知的关系。在发表时,它在Spider排行榜上达到了SOTA。示例显示在图4.76中。

SQUALL [98]是一个数据集,其中包含来自WikiTableQuestions的11,726个问题,并将它们与手工编写的SQL语句进行匹配。进一步将SQL语句与问题片段进行对齐。SQUALL的示例显示在图4.77中。

BRIDGE [93]是在[93]中介绍的数据集。该系统将给定的问题和模式转换为一个序列,其中某些字段的一些单元值与问题相关联。在论文发表时,BRIDGE在Spider和WikiSQL上取得了SOTA。示例显示在图4.78中。

STRUG [99]是关于结构引导的预训练。它由Deng等人[99]介绍。作者描述了一种使用平行语料库进行文本到表格对齐的方法。他们承担的预训练任务包括列对齐、值对齐和列-值映射(图4.79)。

PICARD是在[100]中引入的,旨在解决每个解码步骤可用的无约束输出空间导致的问题。作者提出了一种通过增量解析防止生成无效代码的方法。在每个解码步骤中,PICARD拒绝不合规的标记。在Spider和CoSQL上评估时,PICARD实现了SOTA性能。我们将在第5章更详细地讨论这篇论文。

另一篇最近的论文[101]采用了一种代表了该领域最新趋势的方法。更具体地说,它在零-shot设置中使用了一个预训练的语言模型(在本例中为Codex),在Spider数据集上比Fine-tuned T5-base实现了略微更好的测试套件准确性,而没有使用任何Spider训练数据或进行Fine-tuning。图4.80、4.81和4.82展示了输入到Codex的示例。

DIN-SQL是最近的一项工作[102],它在少样本情况下使用大型语言模型,并在Spider数据集上实现了新的SOTA性能。具体而言,每个文本到SQL任务都被分解为四个子任务:(1)模式链接,(2)查询分类和分解,(3)SQL生成,和(4)自我校正。所有子任务都使用大型语言模型的提示技术解决,并且每个中间子任务(例如,模式链接)的输出都被用作其他任务(例如,SQL生成)的输入。模式链接模块和查询分类和分解模块的示例分别显示在图4.83和4.84中。在DIN-SQL之前,Spider的保留测试集上的SOTA,以测试套件准确性衡量,是79.9,属于RESDSQL[103],一个经过Fine-tune的编码器-解码器模型。DIN-SQL使用GPT-4实现了85.3的测试套件准确性,并且使用Codex Davinci在上下文学习中仅使用少量示范,并且没有对Spider训练集进行预训练或Fine-tuning,达到了78.2的测试套件准确性。虽然使用大型语言模型是这些结果的一个贡献因素,但分解任务也起着重要作用,尤其是对于困难和额外困难的查询,这导致了显著的改进。

需要注意的是,从2020年11月开始,Spider排行榜和最近的工作,包括DIN-SQL,已经切换到测试套件准确性,而以前的测试套件准确性现在只是简单地称为执行准确性。

相关推荐
Amctwd2 分钟前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou38 分钟前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh1 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵2 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多3 小时前
Linux——mysql主从复制与读写分离
数据库·mysql
初次见面我叫泰隆3 小时前
MySQL——1、数据库基础
数据库·adb
Chasing__Dreams3 小时前
Redis--基础知识点--26--过期删除策略 与 淘汰策略
数据库·redis·缓存
源码云商3 小时前
【带文档】网上点餐系统 springboot + vue 全栈项目实战(源码+数据库+万字说明文档)
数据库·vue.js·spring boot
源远流长jerry3 小时前
MySQL的缓存策略
数据库·mysql·缓存
纯纯沙口4 小时前
Qt—用SQLite实现简单的注册登录界面
数据库·sqlite