Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

增强分析中的智能问答揭秘

编者按:NL2SQL是语义分析的一个子领域,它是智能问答功能的核心部分,但目前还没有成熟的可商用的技术方案。为此,百分点认知智能实验室提出结合了语义分析与深度学习的技术方案,即 X-SQL 的思路解决了该商用问题。百分点还综合利用了自然语言处理、深度学习、X-SQL、依存句法,实现了自然语言预处理、NL2SQL、图表匹配等模块,形成了一整套增强分析技术方案。该方案在实际测试中达到90.45%的准确率,且在实际使用中达到了可以商用的效果。

增强分析是指以机器学习为基础的数据分析和BI功能,包含智能数据发现、增强数据准备、增强数据分析等模块。目前增强分析已经在BI中广泛使用,Gartner 认为,到2020年,增强分析将成为新用户购买BI产品、数据科学机器学习平台,以及嵌入式分析的主要驱动力。

通过增强分析功能,能够极大地降低用户的数据分析门槛,使一个非专业人员也能够轻松完成数据预处理和数据分析的整个分析流程。

1、增强分析中的智能问答

智能问答功能是增强分析中非常重要的一个子任务,其目的是让用户能够通过一句自然语言就能自动生成对应的图表。比如,提问“2015年各地区的销售额?”系统自动就会展示出如下的结果:

在学术界,这个任务叫做 NL2SQL,目前已经有很多研究。英语环境通常采用的是WikiSQL和 Spider,而中文目前还没有统一的数据集。在 WikiSQL 数据集上,Leaderboard 中的方法都是把这个任务转化为槽值填充,然后利用深度学习的方法训练多个不同的子模型对每个槽位进行填充,比如作为SOTA模型的X-SQL。

虽然在WikiSQL 数据集上,模型的效果已经超越了人类,但是在产品化的过程中, WikiSQL过于简单,比如它只支持1个查询目标,1个聚合函数和最多4个过滤条件,不支持分组。而在实际使用中,有多个查询目标以及包含分组字段的问题比比皆是,比如“各省份的人口”,“每年的人口”,所以只是采用 X-SQL 的方法无法满足工业的需要;Spider 数据集中不仅支持对分组进行提问,而且支持跨表join,但是 SOTA 模型的测试准确率只有55%,还无法满足产品化的效果。

此外,在实际提问时,时间是一个很特殊并且重要的因素,比如用户可能会问“近七天的总销售额”,“2019/2018年的销售额”,“今年前三个季度的总销售额”等等,这些内容在数据集中都没有覆盖。

2、基于 X-SQL 和依存句法树的智能问答方法

基于以上这些数据集的局限性,百分点智能问答的任务既需要让模型能够准确地提取问题中的槽位信息,又需要无监督的语义分析方法,只有这样才能满足实际使用的需要。

所以我们以 X-SQL 的思路,采用槽位匹配的方法提取出问题中的select、where 内容,然后利用这些信息辅助依存句法树的解析,最终得到完整的 select、where、group、order 等内容。

值得注意的是,问题中的“时间”需要采用模板的方法,这样更易于扩展。

将自然语言转化成 SQL ,本身可以认为是一个 Seq2seq 的任务,所以在 WikiSQL 中很多早期模型也确实是这么做的,比如 Corse2fine。它会对问题和字段名进行编码,然后利用中间的预解码层将向量解码为 SQL 的框架,这个过程就能相当于自动生成了槽位模板,再把槽位模板也进行编码,结合原始的向量,最后能够解码出最终的 SQL。但是这样生成的结果不一定符合 SQL 的语法规则,所以后面改进的生成方法都是事先写好SQL 的模板槽,然后再用多个模型逐个预测槽位,X-SQL 就是其中一种。

下面详细介绍 X-SQL 的大体流程,如下图所示,先通过 MT-DNN 对原始问题及字段名称进行编码,再在问题前面人为地添加一个 [CXT] 用于提取全局信息。中间的 Context Reinforcing Laryer 层是这个模型的核心部分,它的目的是把 MT-DNN 得到的预训练编码在 NL2SQL 任务上进行增强和重组。这个中间层不仅能体现上下文信息,还能通过 Attention机制对字段名称的编码进行强化(紫色部分)。这一层输出的结果包括问题的编码,以及强化后的字段编码,后面的输出层都会在这个基础上进行。输出层包括6个子模型:S-COL和S-AGG 用于预测 select 的字段,只依赖于强化后的字段名称编码,通过 softmax 对每个字段打分就行了;W-NUM 只依赖全局信息,用于预测 where 条件个数;W-COL、W-OP和W-VAL 用于预测过滤条件的具体内容,通过组合字段编码,当前的 where 条件编号及问题编码,通过softmax 评分就能得到需要的结果。

这个架构已经十分完善了,但是由于数据的局限,模型无法预测多个 select 及 group 的内容。而且模型完全依赖字段名称去提取过滤条件和select的内容,在中文字段名称特征不够明显或者领域数据与训练数据偏差较大时,容易出错。

另一种方式是语法分析,一般依赖于依存句法分析的结果,能够把问题的语法依赖关系体现出来,在此基础上结合 POS,NER 的结果,可以使依存语法树上的每个节点都具有词性、实体标签等属性。然后通过后序遍历,每次遍历到父节点的时候,都将孩子节点及当前父节点的内容进行整理合并,最终遍历到根节点的时候,就得到了select、group 等要素。这种方法的好处是,它完全依赖于问题的语法规则,不需要训练数据,并且对于领域不敏感,迁移性强;缺点是只能处理相对规范的问题,对非常灵活的问题效果不佳。

那么如果能够结合两种方法,就能把语法和语义结合起来,得到能力更为强大的分析模型。也就是说, X-SQL 从深层语义的角度提取要素,而语法分析从问题的语法组成结构上进行提取。具体实现时,X-SQL 的方法能够解析出 1 个 select、1 个聚合函数、最多 4 个过滤条件。通过 pyltp 库可以得到问题的分词、依存句法树、词性标注、命名实体,加上 X-SQL 解析得到的结果,就可以得到一颗包含了每个词的词性、实体类别、结果标签(select、聚合函数、还是过滤条件中的字段名、操作符或字段值)、依存关系的树。

看一下具体的流程:

问题1:各地区的总新增订单量

步骤1:分词后的结果(需要考虑字段名,X-SQL 的结果):各  地区  的总新增订单量

步骤2:得到的聚合了所有信息的树:

其中 HED、ATT 等表示依存关系,HED表示核心关系,ATT 表示定中关系,RAD 表示附加关系。

步骤3:通过词库以及后序遍历解析依存树

1. 首先遍历到“总”。由 X-SQL 得知这是聚合函数。
2. 遍历到“各”。得到这个是一个分组描述符。
3. 遍历到“的”。得到这是一个无意义的词。
4. 遍历到“地区”。从表中匹配得知这是一个字段名称,从孩子节点处得到的信息及 ATT 的关系,得知这是一个分组字段。
5. 遍历到“新增订单量”。由 X-SQL 得知这是查询词,并且结合孩子节点得知聚合函数是“总”,分组词是“地区”。
6. 遍历到root,得到最终结果:select内容为总新增订单量,分组字段为地区。

步骤4:最终得到解析结果

问题2:销售额最高的3个地区

步骤1:分词后的结果(需要考虑字段名,X-SQL 的结果):销售额  最高  的 3个地区

步骤2:得到的聚合了所有信息的树:

其中 SBV 表示主谓关系。

步骤3:

1. 遍历到“3个”。由词性及规则得知这个是 limit。(不是 where 中的内容,否则会被 X-SQL 标记出来)

2. 遍历到“销售额”。得知这是一个字段名。

3. 遍历到“的”。得到这是一个无意义的词。

4. 遍历到“最高”。由依存关系,以及孩子回溯上来的信息,得知这个是一个降序排序信息。

5. 遍历到“地区”。由 X-SQL 得知这是查询词。并且整合孩子节点的所有信息,得知limit 3, 按销售额降序排序。

6. 遍历到root,得到最终结果:select内容为地区,limit 3, 按销售额降序排序。

步骤4:得到最终结果。

此外,在具体使用的过程中,经常会出现比较复杂的时间问法。比如“上个月”、“近7天”、“一二季度“、“2018/2019年”、“去年3月份”等等。对于这些问法相对固定,但是解析时需要利用大量知识的内容,我们采用了模板的方法进行处理。

模板定义:

一个模板包括问法模板和解析结果两部分。

1. 问法模板定义了问法的句式,由槽位、普通字符和正则语法构成,其中槽位暂时只用 ${num} 就够用了。例如“${num1}${num2}季[度]”,“${num1}/${num2}年”。

2. 解析结果是问法模板对应的解析结果。由“value”, “start”,“end”三个字段构成。“value”是列表,每个值定义了某个具体时间,存在多个时相互间取并集。“start”和“end”表示一个时间段的开始时间和结束时间,只有当 “value”不存在时才会有“start” 和“end”。在解析结果中需要 NOW_YEAR、NOW_MONTH、NOW_DAY 常量表示当前的年、月、日。

3. 下面是一个具体的模板实例:

其中 template表示问法模板,result 表示解析结果。这个模板可以匹配类似“近7天”模式的时间表达。

有了模板之后,只需要解析模板就行了。将 template 转化成对应的正则表达式后,把问题中的词替换成对应的槽位,再用正则表达式进行匹配和提取,匹配完成之后,将得到的槽位信息对应填入 result 中就得到了最终的解析结果。需要注意的是,匹配时间是先置步骤,需要在X-SQL 和语法树解析之前进行,为了避免时间对下面的解析造成影响,在模板匹配提取之后,需要将问题中的时间词语删除。

3、效果评价

X-SQL 采用通过对WikiSQL翻译得到的50000条有标注数据进行训练,取其中 5000条作为测试数据,准确率达到了80% 以上。

实际测试环境中,由于中文NL2SQL领域还没有统一的数据集,所以通过收集用户实际在平台上的使用数据,最终得到了 266条中文测试数据(问题中可能包含了分组、过滤条件、复杂的时间表达、查询内容和排序等),在这个基础上进行测试,得到的结果如下:

在学术界一般都会以 WikiSQL 和 Spider 作为训练集和测试集,且都是英文数据集。由于WikiSQL 不支持复杂时间及分组,不具备可比较性,而在Spider上目前最优效果为测试准确率 55%。

4、关于NL2SQL的延伸思考

目前学术界对Nl2SQL已经做了很多的研究,从最早的模板匹配方法,到后来语法解析,以及最近的深度学习方法。特别是在 BERT等预训练模型出现之后,深度学习的方法在 WikiSQL 数据集上取得了非常好的效果,出现了 SqlNet、Corse2fine、X-SQL 等一系列模型。虽然在工业界的使用中,WikiSQL 和国内一些企业的数据集还是过于简单,但是它们的思想是可以借鉴的。另一方面,基于依存句法树之类的语法分析方法也有其可取之处,通过结合语法分析和语义分析能得到更好的效果。而对于“时间”的处理,由于它的表达比较规范,但是处理时需要大量的知识,这种情况下或许模板才是最适合的方法。所以在工业界使用的过程中,还需要具体情况具体分析。

百分点科技
百分点科技

百分点科技是领先的数据科学基础平台及数据智能应用提供商,以“用数据科学构建更智能的世界”为使命,为企业和政府提供端到端的场景化解决方案。我们会定期与您分享百分点科技在数据科学及数据智能领域的实践经验、心得,以及我们对前沿趋势的洞见。

入门增强分析智能问答语义分析
12
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

数据分析技术

数据分析是一类统计方法,其主要特点是多维性和描述性。有些几何方法有助于揭示不同的数据之间存在的关系,并绘制出统计信息图,以更简洁的解释这些数据中包含的主要信息。其他一些用于收集数据,以便弄清哪些是同质的,从而更好地了解数据。 数据分析可以处理大量数据,并确定这些数据最有用的部分。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

数据科学技术

数据科学,又称资料科学,是一门利用数据学习知识的学科,其目标是通过从数据中提取出有价值的部分来生产数据产品。它结合了诸多领域中的理论和技术,包括应用数学、统计、模式识别、机器学习、数据可视化、数据仓库以及高性能计算。数据科学通过运用各种相关的数据来帮助非专业人士理解问题。

语义分析技术

语义分析是编译过程的一个逻辑阶段, 语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。比如语义分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。如有的编译程序要对实数用作数组下标的情况报告错误。又比如某些程序规定运算对象可被强制,那么当二目运算施于一整型和一实型对象时,编译程序应将整型转换为实型而不能认为是源程序的错误。

词性标注技术

词性标注是指为分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词或其他词性的过程。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

查询技术

一般来说,查询是询问的一种形式。它在不同的学科里涵义有所不同。在信息检索领域,查询指的是数据库和信息系统对信息检索的精确要求

依存句法分析技术

依存句法分析的过程是分析句子的语法结构,建立“头”单词和修改这“头”单词的单词之间的关系。

自然语言处理技术

自然语言处理(英语:natural language processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

MT-DNN技术

MT-DNN 是微软提出的在多种自然语言理解任务上学习表征的多任务深度神经网络。与 BERT 模型类似,MT-DNN 分两个阶段进行训练:预训练和微调。与 BERT 不同的是,MT-DNN 在微调阶段使用多任务学习,在其模型架构中具有多个任务特定层。

推荐文章
中国科学院大学・计算机应用・学士
1.Spider也有中文版的数据集,不妨一试。 2.基于X-SQL+语义依存分析还是没有解决多表查询吧?
感谢提供建议哈~已经转给我们相关同事了啊~~