互联网上的许多重要数据都存储在结构化数据库中,其具有存储简单、数据质量高等特点。但是对于缺少相关SQL专业知识的用户而言,很难快速准确地写出他们所需求的SQL查询语句。为解决该问题,研究人员提出NL2SQL(Natural Language to SQL)任务,该任务要求模型根据自然语言问句和数据库表生成相应的SQL查询,而解决该任务的关键是充分地理解自然语言问句的语义,并将其映射到SQL表达式相应的部分(如在表中找到对应的列名,在表内容找到对应的条件值,在SQL关键字中找到对应的聚合函数等)。
由于缺少人工标注的SQL数据集,使得该任务未被重视。2017年,ZHOU等人[1]发布人工标注的大型SQL数据集——WikiSQL,该数据集含有大量英文问句以及对应的SQL语句和数据库表。2019年,追一科技公司在阿里云平台举办的首届中文NL2SQL挑战赛,提供了大型中文SQL数据集。上述数据集为训练NL2SQL神经网络及解决语义解析提供了训练条件。
早期将自然语言转换为SQL语句的研究是利用中间表达式的方法,结合自定义语法和规则将自然语言问句转换成SQL语句。文献[2]使用斯坦福依存树解析器[3]解析问句,根据启发式规则生成SQL候选集,利用语法树核函数的SVM[4]对候选SQL进行排序。文献[5]使用无监督学习的方法生成SQL,利用数据库模式限制模型的输出空间以弥补标注数据的不足,同时引入扩展状态空间的语义依存树解决语义和语法不匹配的问题。文献[6]通过与用户交互来确定问句的词语与表相应内容的关系,同时自定义规则调整查询树的结构,最终将其转换成SQL。文献[7]通过自定义一种形式化意义语言实现了中文GIS自然语言接口。上述方法都是依赖高质量的语法来解析问句,不能处理用户语法多变的问句,因此具有局限性。
随着深度学习的发展,人们开始将NL2SQL的研究转向训练神经网络模型。早期的深度学习模型将NL2SQL看成序列生成问题,利用sequence-to-sequence模型[8]生成SQL查询。文献[9]运用注意力机制,通过sequence-to-sequence的解码层自动生成SQL序列。为提升SQL查询的准确率,结合SQL语法限制输出空间的模型被提出。文献[1]提出Seq2SQL模型,该模型将SQL生成分为聚合函数分类、select column以及where子句生成三部分,同时利用强化学习解决序列生成引发的“order matters”问题。文献[10]利用SQL语句的格式和语法提出sequence-to-set模型,将SQL语句任务分成多个子任务,并结合column attention提升SQL生成的准确率。文献[11]结合知识图谱识别问句中的实体。文献[12]利用sequence-to-sequence以及sequence-to-set模型各自的优势,提出sequence-to-action模型。该模型使用预定义的action来填充SQL查询草图的插槽。文献[13]通过SQL执行结果修复错误的SQL查询。
近年来,大规模预训练模型在许多自然语言处理的下游任务中取得优秀的成绩,许多基于预训练的Nl2SQL模型被提出。研究人员使用Bert[14-15]预训练模型替代glove[16]作为模型的编码器,基于Bert编码器提出3种不同的输出层,超过了人类手动标注。文献[17]基于MT-DNN模型[18]提出X_SQL模型,通过强化上下文信息得到数据库模式新的表达式,更好地表征其结构信息以用于下游任务。
现有许多深度学习模型都仅局限于数据库结构对模型的影响,忽略了表内容对NL2SQL任务的重要性。问句的词语与表内容不匹配,导致生成的SQL查询在数据库执行错误。而结合表内容不仅可以帮助模型更好地识别问句中对应的SQL语句实体,还可以缓解问句与表内容不一致的问题。本文在SQLova[13]的框架下,提出一个同时结合表结构和内容的NL2SQL模型。使用字符串匹配的方法筛选出与问句相关的表内容,利用Bert编码器对问句、表列名以及相关表内容进行字编码,value attention和column attention将表结构和内容的表示特征加到问句表达式中,帮助模型更好地理解用户问句的语义,识别问句中的表列名和条件值,并根据多个子模型的分类方法填充SQL草图完成SQL查询。
1 任务描述本文使用追一公司在阿里云发布的中文数据集作为整篇文章的示例。该中文数据集的任务是在给定问句和数据库表的情况下生成相应的SQL查询。其数据格式如图 1所示,每条数据对应一个数据库表和1条问句以及SQL查询。
|
Download:
|
| 图 1 中文数据集数据格式 Fig. 1 Chinese dataset data format | |
对于问句的词语与表内容不完全匹配的问题,如图 1中的“死侍2”与表内容的“死侍2:我爱我家”不一致的情况,会导致SQL查询结果为空。模型结合表内容通过字符串匹配的方法来替换模型从问句中生成的词语,即将“死侍2:我爱我家”替换成“死侍2”,缓解表内容与问句词语不一致的问题。在WikiSQL测试集上比SQLova准确率高出1.4%,实验结果表明,结合数据库结构和内容特征可以帮助模型更好地理解问句语义,提升SQL查询的准确率。
本文将序列生成任务转化为多个分类任务,通过填充SQL草图生成SQL查询。该中文数据集的SQL查询对应的SQL草图如图 2所示,草图的每个槽对应不同子任务。以$开头的标记表示槽标记,$后面的名称表示需要预测的类型。其中:$AGG表示模型预测SQL查询的聚合函数,取值集合包括{' ','MAX','MIN','COUNT','SUM','AVG'};$SELECT_COL和$WHERE_COL表示模型需要预测的数据库表列名;$WHERE_RELA表示where子句的关系,包括{' ','and','or'};$WHERE_OP表示SQL查询的操作符,包括{'=',' > ',' < '};$WHERE_VAL表示从问句中生成的SQL查询条件值;(…)*表示子句的数量是零个或多个。
|
Download:
|
| 图 2 SQL草图 Fig. 2 SQL sketch | |
在SQLova框架下,将模型分成Encoder层、Attention层以及Ouput层三部分,具体结构如图 3所示。在Encoder层,SQLova将问句和表列名作为Bert预训练模型的输入,在SQLova模型的基础上将相关表内容作为Bert的输入;在Attention层,SQLova通过Column Attention得到问句表达式,利用Value Attention将表内容的信息融入问句的表达式中;在Output层,为了更好地预测Where Column和Where Value子任务,将基于表内容的问句表达式作为额外输入。
|
Download:
|
| 图 3 模型整体结构 Fig. 3 Model overall structure | |
在解析问句语义时,相对于结合数据库结构,表内容对于生成SQL查询有着重要作用。结合表内容可以帮助模型更好地找到SQL查询的条件值,如图 1中的示例,模型根据表内容“大黄蜂”更好地找到问句中的“大黄蜂”。同时结合表内容还可以帮助模型预测问句中表列名,比如“北京”这个条件值使模型更倾向于预测“城市”列名。但将表内容所有的信息作为Bert编码器的输入,给模型带来过多的干扰因素,同时会使得模型的输入过长,所以本文筛选出与问句有关的表内容作为模型的输入。
为得到与问句相关的表内容,模型将问句进行分词处理,枚举长度为1~4的所有n-garms,使用Jaccrad公式计算组合的词语与表内容的相似度。若问句中出现单引号或者双引号以及书名号时,直接使用该词语与表内容进行相似度计算。计算公式如下:
| $ J\left(A, B\right)=\frac{|A\bigcap B|}{|A\bigcup B|} $ | (1) |
如果相似度超过一定的阈值,则将表内容加到模型的输入中。本文利用得到的相关表内容、问句和表列名共同构成Bert编码器的输入。
2.2 基于表的Bert编码器基于语境的动态词表达式ELMO[19-20]和Bert[14]预训练模型,在处理许多自然语言处理任务方面表现突出。SQLova[13]的实验结果也表明利用Bert模型得出的基于上下文和表的词表达式,可以有效提高NL2SQL任务的准确率。模型使用Bert模型对其进行字编码,同时将问句、数据库列名以及相关表内容作为Bert的整体输入。Bert中的self-attention机制使得模型更注重问句中列名和条件值,获得更准确的表达式。具体如图 3所示,其中[CLS]和[SEP]是用于分类和上下文分离的特殊标记。本文使用[SEP]来分隔问句、列名以及表内容,与位置向量共同构成bert编码器的输入,得到对应的问句、列名以及表内容的特征表达式Hq、Hcol和Hval。
2.3 注意力层将Hq、Hcol、Hval通过3个Bi-LSTM,选择最后的隐藏状态得到对应的表达式
| $ {w^{q|{\rm{col}}}} = {\rm{softmax}}\left( {\mathit{\boldsymbol{E}}_{{\rm{col}}}^{\rm{T}}{\mathit{\boldsymbol{W}}_{{\rm{col}}}}{E_q}} \right) $ | (2) |
| $ {E}_{q|\mathrm{c}\mathrm{o}\mathrm{l}}={E}_{q}{w}^{q|\mathrm{c}\mathrm{o}\mathrm{l}} $ | (3) |
其中,
为更好地理解问句中的条件值,本文提出Value Attention,使问句的表达式可以在预测SQL查询的条件值时更好地反映出表内容在问句的重要信息。本文首先利用问句和表内容的表达式计算问句对应表内容的权重,其中,Wval是参数矩阵。根据得到的每个问句的权重
| $ {w^{q|{\rm{val}}}} = {\rm{softmax}}\left( {\mathit{\boldsymbol{E}}_{{\rm{val}}}^{\rm{T}}{\mathit{\boldsymbol{W}}_{{\rm{val}}}}{E_{\rm{q}}}} \right) $ | (4) |
| $ {E}_{q|\mathrm{v}\mathrm{a}\mathrm{l}}={E}_{q}{w}^{q|\mathrm{v}\mathrm{a}\mathrm{l}} $ | (5) |
模型利用Attention层得到的输出来预测SQL草图不同的槽,其中槽分别对应8个子任务,分别是Select Number、Select Column、Select Agg、Where Relation、Where Number、Where Column、Where Operator、Where Value。Output层的子任务以及之间详细的依存关系如图 4所示。由于Select Number子任务与Where Number以及Where Relation模型结构相同,在图中只显示出Select Number子模型的结构。
|
Download:
|
| 图 4 输出层子模型之间的关系 Fig. 4 Relationship between output layer submodels | |
子任务分别介绍如下:
1)Select Number。该任务是确定Select子句中表列名的数量,模型把该任务当成一个4分类任务,具体公式如下:
| $ {P_{{\rm{sel}}\_{\rm{num}}}} = {\rm{softmax}}({\mathit{\boldsymbol{V}}_{{\rm{snum}}}}{\rm{tanh}}({\mathit{\boldsymbol{W}}_{{\rm{snum}}}}{E_{q|q}})) $ | (6) |
其中,
2)Select Column。该任务根据概率的大小从表中k个列名作为SQL语句的Select查询字段,其中,k是Select Number预测的个数,具体公式如下:
| $ {P_{{\rm{sel}}\_{\rm{col}}}} = {\rm{softmax}}({V_{{\rm{col}}}}{\rm{tanh}}({\mathit{\boldsymbol{W}}_{{\rm{col}}}}\mathit{\boldsymbol{E}}_{{\rm{col}}}^{\rm{T}} + {W_q}\mathit{\boldsymbol{E}}_{q|{\rm{col}}}^{\rm{T}})) $ | (7) |
3)Select Agg。该任务是预测SQL查询的聚合函数,利用Select子句的列名和问句进行分类任务,具体公式如下:
| $ {P_{{\rm{agg}}}} = {\rm{softmax}}({V_{{\rm{agg}}}}{\rm{tanh}}({\mathit{\boldsymbol{W}}_{{\rm{scol}}}}\mathit{\boldsymbol{E}}_{{\rm{scol}}}^{\rm{T}} + {W_q}\mathit{\boldsymbol{E}}_{q|{\rm{scol}}}^{\rm{T}}) $ | (8) |
4)Where Number:该任务是利用问句的表达式预测Where子句的个数,具体公式如下:
| $ {P_{{\rm{where}}\_{\rm{num}}}} = {\rm{softmax}}({V_{{\rm{wnum}}}}{\rm{tanh}}({W_{{\rm{wnum}}}}{E_{q|q}})) $ | (9) |
5)Where Relation。该子模型是预测Where子句之间的关系。若Where子句的数量为1时,默认Where Relation为空;当Where子句的数量大于1时,将问句表达式作为输入对Where子句的关系进行二分类(and,or),具体公式如下:
| $ {P_{{\rm{rela}}}} = {\rm{softmax}}({V_{{\rm{rela}}}}{\rm{tanh}}({W_{{\rm{rela}}}}{E_{q|q}})) $ | (10) |
6)Where Column。该任务是确定Where子句的表列名,利用列名、基于表结构和表内容的问句表达式进行分类任务。根据SQL语法,Select Column与Where Column不能同时对应数据库表的同一个列名,因此把Select子句生成的列名也作为该任务的输入,公式具体如下:
| $ \begin{array}{l} {P_{{\rm{where}}\_{\rm{col}}}} = {\rm{softmax}}({V_{{\rm{col}}}}{\rm{tanh}}({\mathit{\boldsymbol{W}}_{{\rm{col}}}}\mathit{\boldsymbol{E}}_{{\rm{col}}}^{\rm{T}} + {W_q}\mathit{\boldsymbol{E}}_{q|{\rm{col}}}^{\rm{T}} + \\ {W_{{\rm{qval}}}}\mathit{\boldsymbol{E}}_{q|{\rm{val}}}^{\rm{T}} + {\mathit{\boldsymbol{W}}_{{\rm{scol}}}}E_{q|{\rm{scol}}}^T)) \end{array} $ | (11) |
7)Where op。该子任务是确定Where子句的操作符,需要根据Where子句的表列名与问句表达式来进行分类,具体公式如下:
| $ {P_{{\rm{op}}}} = {\rm{softmax}}({V_{{\rm{op}}}}{\rm{tanh}}({\mathit{\boldsymbol{W}}_{{\rm{wcol}}}}\mathit{\boldsymbol{E}}_{{\rm{wcol}}}^{\rm{T}} + {W_q}\mathit{\boldsymbol{E}}_{q|{\rm{wcol}}}^{\rm{T}})) $ | (12) |
8)Where Value。该任务通过序列标注从问句中找到每一个Where Column对应的条件值。除了基于列名问句表达式与Where Column预测的Column表达式作为Where Value任务的输入外,基于Value attention的问句表达式也可以帮助模型预测Where Column,具体公式如下:
| $ \begin{array}{l} {P_{{\rm{val}}}} = {\rm{softmax}}({V_{{\rm{val}}}}{\rm{tanh}}({\mathit{\boldsymbol{W}}_{{\rm{wcol}}}}\mathit{\boldsymbol{E}}_{wcol}^{\rm{T}} + {W_q}\mathit{\boldsymbol{E}}_{q|{\rm{wcol}}}^{\rm{T}} + \\ {\mathit{\boldsymbol{W}}_{{\rm{qval}}}}\mathit{\boldsymbol{E}}_{q|{\rm{val}}}^{\rm{T}})) \end{array} $ | (13) |
若该任务生成的条件值与表内容存在不匹配的问题,模型结合表内容利用字符串匹配的方法替换生成的条件值。
2.5 训练阶段在训练阶段,由于模型被分成多个分类子任务,因此目标函数可以被看成多个子模型的交叉熵损失函数的和。针对表列名的预测,模型通过交叉熵损失函数计算标注数据出现的表列名与预测列名概率的损失;针对Where Value子任务的预测,通过预测问句中的条件值的开始位置和结束位置与真值的损失。交叉熵损失函数的具体公式如下:
| $ \begin{array}{*{20}{l}} {{\rm{loss}}\left( {{\rm{pre}}, y} \right) = - \left( {\sum\limits_{i = 1}^N {({y_i}{\rm{lo}}{{\rm{g}}_a}P({x_i}) + (1 - {y_i}){\rm{lo}}{{\rm{g}}_a}(1 - P({x_i})))} } \right)} \end{array} $ | (14) |
其中,x表示训练数据,y表示真值,N表示样本的数量。本文通过最小化目标函数的方式来更新模型参数。
3 实验结果与分析 3.1 数据集和评估方法本文分别在追一公司发布的中文数据集和WikiSQL数据集进行测试。WikiSQL数据集是ZHONG等人[1]发布的手工数据集,被广泛应用于NL2SQL深度学习模型,该数据集拥有80 000多条训练数据以及对应的20 000多张数据库表。中文数据集共有50 000多条数据,与WikiSQL不同的是,中文数据集的SQL查询中Select子句的表列名可以是多个,另外,Where子句之间的关系不是默认的“and”关系,其条件数量以多个为主。本文使用Logic Form Accuracy(Logic)和Execution Accuracy(Exe)两个指标评估模型性能,其中,Logic Form Accuracy是指生成的SQL查询与数据集的SQL真值比对的准确率,Execution Accuracy是指生成的SQL语句与数据库的SQL语句在数据库执行完查询结果后进行比对的准确率。
3.2 实验设置在实验中,本文使用768维的Bert作为模型的编码器,其最大长度设置为222,在训练阶段微调Bert预训练模型的参数;设置模型使用的Bi-LSTM隐藏层的维度是100,丢失率为0.3,不同子任务之间的Bi-LSTM的参数不共享;设置迭代次数为100,批训练次数为8,每次迭代打乱训练数据的顺序,学习率设置为0.003,使用Adam方法优化参数模型。
3.3 实验结果表 1给出本文模型和不使用表内容的模型在中文数据验证集上的实验结果,其中,“-表内容”表示不使用表内容的模型。可以观察到在S_col任务上,原模型比不使用表内容的模型准确率高出0.021,在W_col任务上,比不使用表内容的模型高出0.007,结果表明,结合表内容可以在一定程度上帮助模型预测与表内容相关的表列名;原模型在W_val上高出0.01,这是因为原模型可以通过表内容更好地理解问句中的SQL查询条件值。例如问句“爱情的呼唤这部电影是哪家单位引进的”,对应正确的Where子句是“Where剧名=爱情呼叫转移and类别=电影”,结合表内容可以帮助模型预测“电影”应该作为SQL查询的条件值,而不是表列名。不使用表内容的模型比原模型在Execution低0.19,在Logic Form低1.8%,说明模型利用Attention层的Value Attention注意力机制,获得更加准确的问句表达式,可以更好地帮助下游任务分类。
|
下载CSV 表 1 不同模型在中文数据集上的实验结果 Table 1 Experimental results of different models on the Chinese dataset |
表 2给出不同模型在WikiSQL验证集和测试集上的实验结果。从表 2可以看出,本文模型的准确率明显高于表中前5个模型。针对SQLova的模型,本文获取到SQLova源码得到的模型由于不知道SQLova具体的参数,实验结果比原文给出的准确率低。本文模型在验证集上的Logic Form比SQLova高出0.18,在测试集高出0.15;在验证集上的Execution Accuracy比SQLova模型高出0.14,在测试集高出0.14。该结果表明结合表内容和表结构可以有效地提高SQL生成的准确率。
|
下载CSV 表 2 不同模型在WikiSQL数据集上的实验结果 Table 2 Experimental results of different models on the WikiSQL dataset |
本文在SQLova框架下,提出一个基于表结构及其表内容的NL2SQL模型,利用Column Attention和Value Attention来更好地理解用户问句的语义。将序列生成任务转变成多个分类任务,通过填充SQL草图生成SQL查询。实验结果表明,结合表结构和内容可以提升模型生成单表的SQL语句的准确率。但该模型暂不能处理结合生活常识解决的问题,同时在实际情况中,用户提出的问题往往需要多张数据库表来解决,而多表对应的SQL查询会涉及表名、多张表的连接方式、嵌套查询以及增加Group、Order等SQL关键字的情况。下一步研究方向是处理涉及多表查询的Spider数据集,利用人们的生活常识生成SQL查询,以更符合实际应用场景。
| [1] |
ZHONG V, XIONG C, SOCHER R.Seq2SQL: generating structured queries from natural language using reinforcement learning[EB/OL].[2019-12-10].https://arxiv.org/pdf/1709.00103.pdf.
|
| [2] |
GIORDANI A, MOSCHITTI A.Automatic generation and reranking of SQL-derived answers to NL questions[C]//Proceedings of International Workshop on Eternal Systems.Berlin, Germany: Springer, 2012: 59-76.
|
| [3] |
DE MARNEFFE M C, MACCARTNEY B, MANNING C D.Generating typed dependency parses from phrase structure parses[C]//Proceedings of IEEE International Conference on Language Resources and Evaluation.Washington D.C., USA: IEEE Press, 2006: 449-454.
|
| [4] |
SHEN L, JOSHI A K.An SVM-based voting algorithm with application to parse reranking[C]//Proceedings of the 7th Conference on Natural Language Learning at HLT-NAACL.Washington D.C., USA: IEEE Press, 2003: 9-16.
|
| [5] |
POON H.Grounded unsupervised semantic parsing[C]//Proceedings of the 51st ACM Annual Meeting of the Association for Computational Linguistics.New York, USA: ACM Press, 2013: 933-943.
|
| [6] |
LI F, JAGADISH H V. Constructing an interactive natural language interface for relational databases[J]. Proceedings of the VLDB Endowment, 2014, 8(1): 73-84. DOI:10.14778/2735461.2735468 |
| [7] |
ZHOU Junsheng, QU Weiguang, XU Juhong, et al. Research on the implementation of Chinese GIS natural language interface based on semantic analysis[J]. Journal of Chinese Information Processing, 2014, 28(6): 62-69. (in Chinese) 周俊生, 曲维光, 许菊红, 等. 基于语义解析的中文GIS自然语言接口实现研究[J]. 中文信息学报, 2014, 28(6): 62-69. |
| [8] |
BAHDANAU D, CHO K.Neural machine translation by jointly learning to align and translate[EB/OL].[2019-12-10].https://arxiv.org/pdf/1409.0473.pdf.
|
| [9] |
DONG L, LAPATA M.Language to logical form with neural attention[EB/OL].[2019-12-10].https://arxiv.org/pdf/1601.01280.pdf.
|
| [10] |
XU Xiaojun, LIU Chang, SONG Dawen.SQLNET: generating structured queries from natural language without reinforcement learning[EB/OL].[2019-12-10].https://arxiv.org/pdf/1711.04436.pdf.
|
| [11] |
YU Tao, LI Zofan, ZHANG Zilin, et al.Typesql: knowledge-based type-aware neural text-to-SOL generation[EB/OL].[2019-12-10].https://arxiv.org/pdf/1804.09769.pdf.
|
| [12] |
SHI T, TATEAEADI K, CHAKRABARTI K, et al.IncSQL: training incremental text-to-SQL parsers with non-deterministic oracles[EB/OL].[2019-12-10].https://arxiv.org/abs/1809.05054.
|
| [13] |
WANG C, TATWAWADI K, BROCKSCHMIDT M, et al.Robust text-to-SOL generation with execution-guided decoding[EB/OL].[2019-12-10].https://arxiv.org/pdf/1807.03100.pdf.
|
| [14] |
HWANG W, YIM J, PARK S, et al.A comprehensive exploration on WikiSQL with table-aware word contextualization[EB/OL].[2019-12-10].https://arxiv.org/pdf/1902.01069.pdf.
|
| [15] |
DEVLIN J, CHANG M W, LEE K, et al.Bert: pre-training of deep bidirectional transformers for language understanding[C]//Proceedings of 2019 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies.Minneapolis, USA: Association for Computational Linguistics 2019: 4171-4186.
|
| [16] |
PENNINGTON J, SOCHER R, MANNING C.GloVe: global vectors for word representation[C]//Proceedings of IEEE Conference on Empirical Methods in Natural Language Processing.Washington D.C., USA: IEEE Press, 2014: 1532-1543.
|
| [17] |
HE P, MAO Y, CHAKRABARTI K, et al.X-SQL: reinforce schema representation with context[EB/OL].[2019-12-10].https://arxiv.org/abs/1908.08113v1.
|
| [18] |
LIU Xiaodong, HE Pengcheng, CHEN Weizhu, et al.Multi-task deep neural networks for natural language understanding[EB/OL].[2019-12-10].https://arxiv.org/pdf/1901.11504.pdf.
|
| [19] |
PETERS M E, NEUMANN M, IYYER M, et al.Deep contextualized word representations[EB/OL].[2019-12-10].https://arxiv.org/pdf/1802.05365.pdf.
|
| [20] |
WU Xukang, YANG Xuguang, CHEN Yuanyuan, et al. Topic combined word vector model[J]. Computer Engineering, 2018, 44(2): 233-237, 270. (in Chinese) 吴旭康, 杨旭光, 陈园园, 等. 主题联合词向量模型[J]. 计算机工程, 2018, 44(2): 233-237, 270. |
| [21] |
DONG L, LAPATA M.Coarse-to-fine decoding for neural semantic parsing[EB/OL].[2019-12-10].https://arxiv.org/pdf/1805.04793.pdf.
|
2021, Vol. 47
