技术领域
本发明涉及程序理解技术领域,尤其涉及一种基于抽象语法树的程序理解方法及系统。
背景技术
本部分的陈述仅仅是提供了与本公开相关的背景技术信息,不必然构成在先技术。
程序理解是软件工程中的关键活动,也一直是软件工程领域的研究热点,它在软件开发、复用、测试及维护等任务中,都要发挥着重要作用。
程序结构上的复杂性是程序理解的面临的挑战。结构性是程序的重要特性,程序的语义也依赖不同语法结构的程序语句和表达式的组合来体现。例如,程序在语法结构上可以分解为顺序、分支与循环三种基本语法结构的组合,其功能也由这些基本的语法结构的组合来体现。因此要完成程序理解任务,必须对程序的结构信息进行充分的提取和抽象。
虽然神经网络模型在程序理解中已经取得了成功,但发明人认为,现有的进行程序分解的神经模型在训练时,依赖标注数据集,但是目前程序理解的标注数据集规模都比较小,而深度神经网络模型通常有大量的参数,较小的训练数据集会导致过拟合的出现,这限制了程序理解更好地表现。
发明内容
本公开为了解决上述问题,提出了一种基于抽象语法树的程序理解方法及系统,充分提取了程序代码中的语法结构信息和语义信息,缓解深度神经网络训练中对标注数据依赖过重的问题,提高程序理解的效率和准确率。
为实现上述目的,本公开采用如下技术方案:
第一方面,提出了一种基于抽象语法树的程序理解方法,包括:
获取程序代码;
将程序代码生成语法树;
提取每个语法树根结点到终端结点的路径;
根据屏蔽策略遮蔽路径中部分结点后形成路径表示向量;
根据屏蔽策略遮蔽程序代码中部分节点后形成词向量序列;
将路径表示向量和词向量序列输入程序理解模型中完成预训练任务,获取训练好的用于程序理解的程序理解模型。
第二方面,提出了一种基于抽象语法树的程序理解系统,包括:
程序代码获取模块,用于获取程序代码;
语法树生成模块,用于将程序代码生成语法树;
路径提取模块,用于提取每个语法树根结点到终端结点的路径;
路径表示向量生成模块,用于根据屏蔽策略遮蔽路径中部分结点后形成路径表示向量;
词向量序列生成模块,用于根据屏蔽策略遮蔽程序代码中部分节点后形成词向量序列;
模型训练模块,用于将路径表示向量和词向量序列输入程序理解模型中完成预训练任务,获取训练好的用于程序理解的程序理解模型。
第三方面,提出了一种电子设备,包括存储器和处理器以及存储在存储器上并在处理器上运行的计算机指令,所述计算机指令被处理器运行时,完成一种基于抽象语法树的程序理解方法所述的步骤。
第四方面,提出了一种计算机可读存储介质,用于存储计算机指令,所述计算机指令被处理器执行时,完成一种基于抽象语法树的程序理解方法所述的步骤。
与现有技术相比,本公开的有益效果为:
1、本公开提出了针对AST的混合预训练目标路径掩码语言建模(Path MaskedLanguage Modeling,PMLM)和结点顺序预测(Node Order Prediction,NOP),PMLM针对AST路径设计了一种新型的遮蔽策略,从而能联合训练编码器-解码器以提高生成任务的表现。NOP使模型注意到AST路径上的结点约束关系,以便更多代码结构特征可以被提取。
2、本公开在超大型代码数据集上进行训练,提供了一个基于编码器-解码器结构的预训练模型,该模型可以被微调后直接用于面向程序理解的下游任务,以提高其准确率。
3、本公开解决了神经网络方法在进行程序理解时容易受到数据规模限制的缺点,能够使得训练需要的标注数据更少,并大大提高程序理解下游任务的训练速度。
本发明附加方面的优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
构成本申请的一部分的说明书附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。
图1为本公开实施例1公开的基于抽象语法树的代码表示预训练任务流程示意图,其中深灰色表示该结点(或词)被遮蔽,v
图2为本公开实施例1公开的Transformer结构示意图;
图3为本公开实施例1所述的代码片段生成AST示意图;
图4为本公开实施例1所述的代码片段处理示意图。
具体实施方式:
下面结合附图与实施例对本公开作进一步说明。
应该指出,以下详细说明都是例示性的,旨在对本申请提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本申请所属技术领域的普通技术人员通常理解的相同含义。
需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本申请的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,当在本说明书中使用术语“包含”和/或“包括”时,其指明存在特征、步骤、操作、器件、组件和/或它们的组合。
在本公开中,术语如“上”、“下”、“左”、“右”、“前”、“后”、“竖直”、“水平”、“侧”、“底”等指示的方位或位置关系为基于附图所示的方位或位置关系,只是为了便于叙述本公开各部件或元件结构关系而确定的关系词,并非特指本公开中任一部件或元件,不能理解为对本公开的限制。
本公开中,术语如“固接”、“相连”、“连接”等应做广义理解,表示可以是固定连接,也可以是一体地连接或可拆卸连接;可以是直接相连,也可以通过中间媒介间接相连。对于本领域的相关科研或技术人员,可以根据具体情况确定上述术语在本公开中的具体含义,不能理解为对本公开的限制。
实施例1
在该实施例中,公开了一种基于抽象语法树的程序理解方法,包括:
获取程序代码;
将程序代码生成语法树;
提取每个语法树根结点到终端结点的路径;
根据屏蔽策略遮蔽路径中部分结点后形成路径表示向量;
根据屏蔽策略遮蔽程序代码中部分节点后形成词向量序列;
将路径表示向量和词向量序列输入程序理解模型中完成预训练任务,获取训练好的用于程序理解的程序理解模型。
进一步的,程序理解模型采用Transformer的编解码器结构,去掉解码器端的位置编码,并添加二分类器进行预测,其中编码器读入AST路径的集合并生成AST的表示,解码器利用该表示推测出AST对应的代码片段。
进一步的,对解码器的输出处理为:使用“INDENT”和“DEDENT”表示程序代码的开始和结束;使用“NEWLINE”代表程序代码换行;使用“_”代表程序代码中的空格;删除程序代码中的注释。
进一步的,程序理解模型训练时,训练损失为二分类交叉熵损失与多分类交叉熵之和。
进一步的,每个路径为一个结点序列。
进一步的,根据屏蔽策略遮蔽路径中部分节点,将路径中各结点表示为向量,对向量进行拼接后,形成路径表示向量。
进一步的,根据屏蔽策略遮蔽程序代码中部分节点后形成词向量序列的具体过程为:
将程序代码中与路径中被遮蔽的结点对应的结点保留;
将程序代码中其余结点遮蔽;
获取程序代码中各结点的词向量,形成词向量序列。
结合图1-4对本实施例公开的一种基于抽象语法树的程序理解方法中模型的训练过程进行详细说明。
如图1所示,本实施例公开的模型的训练过程包括:
采用大规模的、无标注的代码数据集,将其中的每一个代码片段转化为一个抽象语法树(Abstract Syntax Tree,AST),提取每个AST根结点到终端结点的路径,将AST中的值结点和代码片段中的所有词会通过字节对编码划分成子词。
按照路径掩码语言建模(Path Masked Language Modeling,PMLM)和结点顺序预测(Node Order Prediction,NOP)两个预训练任务的要求对AST和代码片段进行处理,表示成路径向量集合和对应的路径表示向量。
对代码片段进行处理,使用“INDENT”和“DEDENT”代替缩进,表示代码片段的开始和结束;使用“NEWLINE”代表代码片段换行;在代码片段中空格被替换为“_”;同时从训练数据中删除代码片段中的注释,将AST对应的处理好的代码片段做为程序理解模型中解码器的输出。
程序理解模型采用类似Transformer的编解码器结构,但去掉解码器端位置编码,并添加一个二分类器用于完成结点顺序预测(NOP)任务。将路径向量集合中的向量合并,然后通过全连接层表示成固定维度的向量作为模型编码器的输入,将对应的代码片段向量作为模型解码器的输入;
按照PMLM和NOP两个预训练任务对模型进行训练,从而获取训练好的用于程序理解的程序理解模型。
将代码数据集中的每一个代码片段转化为一个AST,提取每个AST根结点到终端结点的路径,AST中的值结点和代码片段中的所有词会通过字节对编码划分成子词。具体为:
(1)如图2所示,将代码片段转化为AST,AST树的结点分为两类,一类是类型结点,如”argument”,”Eptr”,使用符号v表示,另一类是值结点,即代码中的词,如“sys_path”,”join_path”,这类结点几乎都为终端结点,使用符号x表示。我们使用根结点到终端结点的路径表示AST,A={p
(2)利用字节对编码从语料库中学习AST中的值结点和代码片段中的所有词中频次最高的子词,对词进行切分,比如‘third_pirty’可能切分成’third‘,’_‘,’pirty‘,然后把频次最高的子词收集起来形成一个字典然后用于模型的训练。
我们使用构成每个词的所有子词的向量相加表示这个完整的词:
其中E
按照PMLM和NOP预训练任务对AST及其对应代码片段进行一定的处理,具体的处理步骤如下:
(1)按照PMLM的规则对AST的值结点和代码片段的部分词进行屏蔽,步骤如下:
(1-1)对AST路径中的部分值结点进行屏蔽,根据概率{q
其中i表示当前结点的层次,N为该路径上最大结点层次,减去N是为了防止数值溢出。
根据一定比例选出概率较大的结点集m
(1-2)在解码器端,对代码片段中的词进行遮蔽,我们保留m
C
(2)按照NOP的规则以0.5的概率决定是否随机交换A
在进入程序理解模型的编码器之前,需做如下运算:
为表示路径,我们合并路径上的各结点向量,然后应用全连接层压缩向量的维度:
其中W
对代码片段进行处理,使用“INDENT”和“DEDENT”代替缩进,表示代码片段的开始和结束;使用“NEWLINE”代表换行;在代码片段中空格被替换为“_”;同时从训练数据中删除代码片段中的注释,处理结果如图4所示,将AST对应的处理好的代码片段作为程序理解模型中解码器的输出。
如图2所示,程序理解模型采用Transformer的编解码器结构,但去掉解码器端位置编码,并添加一个二分类器用于完成结点顺序预测任务。
编码器包括多头注意力机制、残差连接、层归一化和前馈网络,将X
首先通过多头注意力机制,多头注意力拥有三个隐藏层,分别是查询矩阵Q、键矩阵K和值矩阵V,它们的值等于X
其中,
对head
其中,参数矩阵
依次执行残差连接和层归一化,具体为:
残差连接:
层归一化:
其中,α,β分别是可学习的拉伸参数和可学习的偏移参数;∈是为了防止除0。
通过编码器的最后一层前馈网络即可得到编码器的输出,前馈网络由GeLU激活函数及其两侧的线性变换组成。
解码器的第一层为多头注意,其中,K
通过PMLM和NOP预训练目标对程序理解模型进行训练,具体包括:
将编码器的输出通过全连接层,采用sigmoid损失函数将输出转换为0-1之间的概率分布,最后按照下式计算二分类交叉熵损失:
loss
其中y
将解码器的每一时间步的输出依次通过全连接层、Softmax函数后得到目标代码词,最后按照下式计算多分类交叉熵损失:
其中k表示共有k个标签值,第i个样本预测为第k个标签的概率为p
最后总的损失为以上两个损失值之和,即loss
程序理解模型训练完成后,将训练好的程序理解模型用于对程序代码的程序理解。在本实施例中,针对的编程语言为Java语言和Python语言,也可以拓展到其他语言。
本公开通过在已有数据本身上面开展假定任务进行表示学习,充分提取程序语言中的语法结构信息和语义信息,并缓解深度神经网络训练中对标注数据依赖过重的问题,从而使得训练需要的标注数据更少,而且能够起到加速训练的作用。
本公开提出了针对AST的混合预训练目标路径掩码语言建模(Path MaskedLanguage Modeling,PMLM)和结点顺序预测(Node Order Prediction,NOP),PMLM针对AST路径设计了一种新型的遮蔽策略,从而能联合训练编码器-解码器以提高生成任务的表现。NOP使模型注意到AST路径上的结点约束关系,以便更多代码结构特征可以被提取。
本公开在超大型代码数据集上进行训练,提供了一个基于编码器-解码器结构的预训练模型,该模型可以被微调后广泛用于面向程序理解的下游任务,以提高其准确率。
本公开解决了神经网络方法在进行程序理解时容易受到数据规模限制的缺点,能够使得训练需要的标注数据更少,并大大提高程序理解下游任务的训练速度。
实施例2
在该实施例中,公开了一种基于抽象语法树的程序理解系统,包括:
程序代码获取模块,用于获取程序代码;
语法树生成模块,用于将程序代码生成语法树;
路径提取模块,用于提取每个语法树根结点到终端结点的路径;
路径表示向量生成模块,用于根据屏蔽策略遮蔽路径中部分结点后形成路径表示向量;
词向量序列生成模块,用于从根据屏蔽策略遮蔽程序代码中部分节点后形成词向量序列;
模型训练模块,用于将路径表示向量和词向量序列输入程序理解模型中进行预训练,获取训练好的用于程序理解的程序理解模型。
实施例3
在该实施例中,公开了一种电子设备,包括存储器和处理器以及存储在存储器上并在处理器上运行的计算机指令,所述计算机指令被处理器运行时,完成实施例1公开的一种基于抽象语法树的程序理解方法所述的步骤。
实施例4
在该实施例中,公开了一种计算机可读存储介质,用于存储计算机指令,所述计算机指令被处理器执行时,完成实施例1公开的一种基于抽象语法树的程序理解方法所述的步骤。
以上仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求保护范围之内。
机译: 使用抽象语法树将基于注释的标准中的描述性资产包含到基于代码的库中的系统和方法
机译: 使用抽象语法树将基于注释的标准中的描述性断言封装到基于代码的库中的系统和方法
机译: 基于用户舒适度和地理区域确保程序理解的系统和方法