基于多尺度AST和特征融合的代码摘要生成方法及系统

文档序号:24983914发布日期:2021-05-07 23:00阅读:228来源:国知局
基于多尺度AST和特征融合的代码摘要生成方法及系统

本申请涉及代码摘要自动生成技术领域,特别是涉及基于多尺度ast和特征融合的代码摘要生成方法及系统。



背景技术:

本部分的陈述仅仅是提到了与本申请相关的背景技术,并不必然构成现有技术。

随着现代化技术的快速发展,出现了许多类型的应用软件,这些软件涵盖了人们各个方面,扮演着越来越重要的角色。为了提高这些软件的质量,开发人员通常会对应用软件进行定期的维护,但是在软件开发和维护期间,由于代码规模庞大,开发人员要花费大约60%的时间去查看和阅读源代码,需要耗费大量的时间和精力。针对上述存在的问题,程序员一般会通过代码中的注释来理解一段代码的含义,但是由于软件开发周期较长,一些注释容易丢失或过时。另一种方法就是使用代码摘要技术,使用这种方式自动生成摘要可以节省程序员阅读代码的时间。但由于代码的结构性较强,使用传统的摘要生成技术无法得到高质量的代码摘要,因此如何获得到质量的代码摘要仍是一个棘手的问题。

高质量的代码摘要可以在很大程度上提高程序员的效率,减少程序员理解代码的时间。因此通过将代码的结构信息更加完整的表达出来以获得高质量的代码摘要,并加快开发人员对软件的开发和维护,具有很大的现实意义。



技术实现要素:

为了解决现有技术的不足,本申请提供了基于多尺度ast和特征融合的代码摘要生成方法及系统;

第一方面,本申请提供了基于多尺度ast和特征融合的代码摘要生成方法;

基于多尺度ast和特征融合的代码摘要生成方法,包括:

获取目标代码;

针对目标代码,构建抽象语法树ast;

针对抽象语法树ast提取整个抽象语法树ast的节点嵌入向量;同时,针对抽象语法树ast分别提取每个节点的特征向量;

将整个抽象语法树ast的节点嵌入向量和每个节点的特征向量,输入到解码器中,输出生成的代码摘要。

第二方面,本申请提供了基于多尺度ast和特征融合的代码摘要生成系统;

基于多尺度ast和特征融合的代码摘要生成系统,包括:

获取模块,其被配置为:获取目标代码;

抽象语法树构建模块,其被配置为:针对目标代码,构建抽象语法树ast;

向量提取模块,其被配置为:针对抽象语法树ast提取整个抽象语法树ast的节点嵌入向量;同时,针对抽象语法树ast分别提取每个节点的特征向量;

代码摘要生成模块,其被配置为:将整个抽象语法树ast的节点嵌入向量和每个节点的特征向量,输入到解码器中,输出生成的代码摘要。

第三方面,本申请还提供了一种电子设备,包括:一个或多个处理器、一个或多个存储器、以及一个或多个计算机程序;其中,处理器与存储器连接,上述一个或多个计算机程序被存储在存储器中,当电子设备运行时,该处理器执行该存储器存储的一个或多个计算机程序,以使电子设备执行上述第一方面所述的方法。

第四方面,本申请还提供了一种计算机可读存储介质,用于存储计算机指令,所述计算机指令被处理器执行时,完成第一方面所述的方法。

第五方面,本申请还提供了一种计算机程序(产品),包括计算机程序,所述计算机程序当在一个或多个处理器上运行的时候用于实现前述第一方面任意一项的方法。

与现有技术相比,本申请的有益效果是:

(1)提出一种多尺度ast结构特征融合的方法。该方法通过将代码片段得到的ast生成邻接矩阵(a),再通过点乘的方式获得该邻接矩阵的二次幂(a2)和三次幂(a3)形式(即得到三个尺度的邻接矩阵),将这三个矩阵分别输入到两层的图卷积神经网络(gcn)中得到三个特征矩阵,将它们再通过相加的方式进行融合,最终得到ast节点的特征向量,可以更好地提取抽象语法树(ast)中边的特征信息。

(2)提出一种将ast节点的特征向量和ast节点嵌入向量进行融合的方法。该方法将ast的节点嵌入向量作为初始背景向量与经过一个注意力机制分配权重(如:对连接较多边的节点分配较大的权重)的ast节点的特征向量一同输入到解码器中进行融合,最终输出目标代码摘要,通过该方法生成的摘要信息更加准确。

本发明附加方面的优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。

附图说明

构成本申请的一部分的说明书附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。

图1为本申请实施例一所用的总框架图;

图2为本申请实施例一多尺度融合过程的示意图;

图3为本申请实施例一ast节点嵌入的示意图;

图4为本申请实施例一所生成的ast示意图;

图5为本申请实施例一解码器模块示意图;

图6为本申请实施例一的两层图卷积神经网络结构示意图。

具体实施方式

应该指出,以下详细说明都是示例性的,旨在对本申请提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本申请所属技术领域的普通技术人员通常理解的相同含义。

需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本申请的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。

实施例一

本实施例提供了基于多尺度ast和特征融合的代码摘要生成方法;

如图1所示,基于多尺度ast和特征融合的代码摘要生成方法,包括:

s101:获取目标代码;

s102:针对目标代码,构建抽象语法树ast;如图4所示;

s103:针对抽象语法树ast提取整个抽象语法树ast的节点嵌入向量;同时,针对抽象语法树ast分别提取每个节点的特征向量;

s104:将整个抽象语法树ast的节点嵌入向量和每个节点的特征向量,输入到解码器中,输出生成的代码摘要,如图5所示。

作为一个或多个实施例,如图3所示,所述s103:针对抽象语法树ast提取整个抽象语法树ast的节点嵌入向量;具体步骤包括:

首先,针对抽象语法树ast,提取ast每个节点的词向量;

其次,对ast所有节点,进行最大池化操作,得到整个抽象语法树ast的节点嵌入向量。

进一步地,所述针对抽象语法树ast,提取ast每个节点的词向量;具体步骤包括:

针对抽象语法树ast,采用word2vec提取ast每个节点的词向量。

进一步地,所述对ast所有节点,进行最大池化操作,得到整个抽象语法树ast的节点嵌入向量;具体是采用最大池化层来实现最大池化操作。

作为一个或多个实施例,如图2所示,所述s103:针对抽象语法树ast分别提取每个节点的特征向量;具体步骤包括:

针对抽象语法树ast,生成初始邻接矩阵;

对初始邻接矩阵进行尺度点乘处理,得到二次幂邻接矩阵;

对初始邻接矩阵进行尺度点乘处理,得到三次幂邻接矩阵;

针对抽象语法树ast的每个节点,进行初始化向量表示,得到每个节点的特征矩阵;

对初始邻接矩阵和每个节点的特征矩阵,进行特征提取,得到每个节点的初始特征向量矩阵;

对二次幂邻接矩阵和每个节点的特征矩阵,进行特征提取,得到每个节点的二次幂特征向量矩阵;

对三次幂邻接矩阵和每个节点的特征矩阵,进行特征提取,得到每个节点的三次幂特征向量矩阵;

对每个节点的初始特征向量矩阵、二次幂特征向量矩阵和三次幂特征向量矩阵进行特征融合,得到每个节点的特征向量矩阵;

对每个节点的特征向量矩阵进行转置,得到每个节点的特征向量。

进一步地,所述对初始邻接矩阵和每个节点的特征矩阵,进行特征提取,得到每个节点的初始特征向量矩阵;与对二次幂邻接矩阵和每个节点的特征矩阵,进行特征提取,得到每个节点的二次幂特征向量矩阵;与对三次幂邻接矩阵和每个节点的特征矩阵,进行特征提取,得到每个节点的三次幂特征向量矩阵;所采用的特征提取方式是一样的。

进一步地,所述特征提取均采用两层图卷积神经网络来实现。两层图卷积神经网络使用串行的方式将两层图卷积神经网络进行连接,将第一层图卷积的输出作为第二层图卷积的输入。这里使用两层的图卷积神经网络可以更好地提取ast节点的特征向量。两层图卷积神经网络结构示意图如图6所示。

作为一个或多个实施例,所述s104:将整个抽象语法树ast的节点嵌入向量和每个ast节点的特征向量,输入到解码器中,输出生成的代码摘要;具体步骤包括:

采用注意力机制对每个ast节点的特征向量进行分配权重;

将整个抽象语法树ast的节点嵌入向量与分配权重后的每个ast节点的特征向量进行融合,得到融合向量;

将融合向量输入到训练后的gru解码器单元中,输出生成的代码摘要。

进一步地,所述训练后的gru解码器单元的训练步骤包括:

构建训练集,所述训练集包括:已知代码摘要和已知代码摘要对应的代码;

对已知代码摘要对应的代码进行预处理,得到整个抽象语法树ast的节点嵌入向量与分配权重后的每个ast节点的特征向量;

对已知代码摘要进行预处理,得到已知代码摘要的向量序列;

将已知代码整个抽象语法树ast的节点嵌入向量与分配权重后的每个ast节点的特征向量作为gru解码器单元的输入值,将已知代码摘要的向量序列作为gru解码器单元的输出值,对gru解码器单元进行训练;得到训练后的gru解码器单元。

首先将一代码片段转化成相应的抽象语法树(ast),其次通过word2vec词嵌入方法得到每个ast节点的词向量,再通过一个最大池化层(maxpooling)得到整个ast的节点嵌入向量;为了更好地提取ast中边的特征信息,将ast生成的邻接矩阵通过点乘的方式得到其二次幂、三次幂形式(即生成多个尺度的邻接矩阵),这三个矩阵反映了不同尺度的ast结构信息,将它们分别输入到两层图卷积神经网络(gcn)中,得到ast节点的特征向量。

为了融合ast的节点嵌入向量和ast节点的特征向量,使用一个注意力机制为ast中每个节点的特征向量分配不同的权重,将其和ast节点嵌入向量一并输入解码器中,输出相应的代码摘要。

基于多尺度ast结构特征融合的代码摘要自动生成方法,包括如下步骤:

本发明所用的源代码数据集是在github上获取的。

获取源代码数据集的代码片段,使用jdt编辑器(抽象语法树生成器)将其解析为相应的抽象语法树(ast),分别提取ast的节点信息和边的信息。

将ast通过word2vec词嵌入的方式生成每个节点的词向量,再通过一个最大池化层生成ast的节点嵌入向量,从而提取出ast的节点信息。

将ast生成的邻接矩阵(a)及通过点乘的方式得到其二次幂(a2)、三次幂(a3)(即得到多个尺度的邻接矩阵)输入到两层图卷积神经网络(gcn)中得到ast节点的特征向量。这里a2表示任意两个节点之间通过两条边到达有多少种方案,a3表示任意两个节点之间通过三条边到达有多种方案,通过该方法可以提取到ast中更多边的特征信息。

通过使用注意力机制为ast每个节点的特征向量分配不同的权重并与ast节点嵌入向量一同输入到解码器的门控循环单元(gru)中,输出代码片段的摘要信息。

由于邻接矩阵表示的是ast的结构信息,邻接矩阵的不同次幂表示多个尺度的ast结构信息,通过我们所提出的方法对多尺度ast的结构特征进行融合,可以更好地表示ast中各节点之间的关系,以便在后续任务中,可以判断某一节点在ast中的重要性。

一种基于多尺度ast结构特征融合的代码摘要自动生成方法的实施方式主要包括三个模块:多尺度ast融合模块、ast节点嵌入模块和解码器模块。

其中多尺度ast融合模块将代码的抽象语法树(ast)生成邻接矩阵及其二次幂和三次幂形式,再将三个矩阵分别输入到两层的图卷积神经网络(gcn)中得到ast节点的特征向量;ast节点嵌入模块将代码片段的ast通过词嵌入(word2vec)的方式生成每个节点的词向量,再通过一个最大池化层生成整个ast的节点嵌入向量;解码器模块通过将多尺度ast融合模块生成的ast节点的特征向量与ast节点嵌入向量进行融合,并采用了一种注意力机制对ast每个节点的特征向量分配不同权重,使解码器在输出时更加关注与其自身相关的信息,可以提高输出摘要的质量。

所述方法所用的数据集为在github上获取的代码数据,此方法针对python语言,同时也适用于其他代码语言。

所述的多尺度ast融合模块是将源代码片段的抽象语法树(ast)生成节点的特征向量。具体步骤如下:

1)从在github上获取的源代码数据集。

2)将代码片段通过jdt工具生成相应的抽象语法树(ast)。

3)由于所生成的ast可看做无向图的形式,因此可以生成所对应的邻接矩阵a(a∈rnxn),将ast的每个节点进行初始化向量表示得到ast节点的特征矩阵h(0)(h(0)∈rnxf),这里n代表ast的节点个数,f表示每个节点向量的维度。将a和h(0)输入到两层的图卷积神经网络(gcn)中,gcn的每一层图卷积都使用以下公式:

h(l+1)=g(h(l),a)

这里l表示层数,h(l)表示上一层输出的特征向量矩阵。比如第一次层图卷积计算公式:

h(1)=g(h(0),a)

其中g(h(l),a)可以由以下公式进行计算:

这里加一个单位阵目的是考虑到自身节点的信息。的度矩阵σ为非线性激活函数(这里使用relu函数),w(l)为权重矩阵,通过上式进行两层图卷积运算后得到一个特征向量矩阵m1(m1∈rnxf)。

4)由邻接矩阵a通过点乘的方式可以得到其二次幂a2(a2∈rnxn),可将其看作第二个尺度,其含义为任意两个节点之间经过两条边能够到达的方案总数。将a2结合步骤3)所生成的特征向量矩阵m1(将其替换为步骤3)中的h(0))以步骤3)同样的方式输入两层图卷积神经网络(gcn)中,得到一个特征向量矩阵m2(m2∈rnxf)。

5)通过点乘的方式再次得到邻接矩阵的三次幂a3(a3∈rnxn),可将其看作第三个尺度,其含义为任意两个节点之间经过三条边能够到达的方案总数。使用步骤3)、步骤4)同样的方式得到一个特征向量矩阵m3(m3∈rnxf)。

6)将步骤3)、4)、5)步得到的不同尺度的特征矩阵通过相加的方式进行融合,可以提取到更多边的特征信息。由于随着邻接矩阵a指数级的增加,一条边的特征信息可能会被多次提取,因此将以上步骤得到的特征向量矩阵分别赋予不同的权重进行相加,可通过以下公式进行计算:

m=δ1m1+δ2m2+δ3m3

这里δ1,δ2,δ3为权重矩阵。

7)通过多尺度ast融合模块得到ast节点的特征向量矩阵m(m∈rnxf),然后再将m进行转置,可以得到ast节点的特征向量(每个节点的特征向量表示为z1,z2,...,zn)。

所述的ast节点嵌入模块是将源代码数据集中代码片段的抽象语法树生成ast节点嵌入向量。具体步骤如下:

1)获取多尺度ast融合模块所构造的抽象语法树(ast)。

2)将ast通过word2vec词嵌入的方式得到每个节点的词向量(k1,...,kn),这里设每个节点词向量的维度为f。

3)通过一个最大池化层(maxpooling)将ast的每个节点的词向量表示为整个ast的节点嵌入向量,使用以下公式计算:

其中(i=1,2,...,f),可以得到向量s([x1,...,xf]t)。这里的s为整个ast的节点嵌入向量。

所述的解码器模块通过将多尺度ast融合模块生成的ast节点的特征向量,ast节点嵌入模块生成的ast节点嵌入向量以及通过词嵌入(word2vec)方式生成的目标摘要向量序列(v1,...,vt)输入到解码器单元gru中,输出相应的摘要信息。融合公式如下:

h1=gru(c1,y0,s)

其中c1为上下文向量,y0为目标向量序列初始输入,可以设为sos,s为ast的节点嵌入向量。

之后每个时间步隐含层向量计算公式如下:

hi=gru(yi-1,ci,hi-1)

其中yi-1为解码器上一时刻的输出,ci为当前时刻的上下文向量,hi-1为上一时间步的隐含层向量。

在该过程中,对ast每个节点的特征向量使用了一个注意力机制,在每个时间步通过对每个节点的特征向量进行加权求和,进行权重分配,使得解码器在输出时更加关注与其自身相关的信息,以此生成当前时间步的上下文向量ci,输入到解码器中。计算过程如下:

这里αij为每个节点的特征向量分配的权重,表示输出端输出第i个单词时输入端第j个节点的注意力分配系数。zj表示第j个节点的特征向量。

αij由以下公式计算:

这里eij基于解码器上一时刻的隐藏状态hi-1和ast节点嵌入向量计算得到的。eij通过以下公式计算:

eij=a(hi-1,zj)

这里a表示第j个输入节点和第i个输出序列匹配的分数值。a的计算方式有三种,这里使用以下公式计算:

这里w为可训练的参数矩阵。

模型训练过程:

在解码器端将目标代码摘要通过词嵌入(word2vec)方式生成向量序列(v1,...,vt),将其与ast节点的特征向量(z1,...,zn),ast节点嵌入向量(s)进行联合训练。通过反向传播的方式进行训练,使用自定义的输出层和softmax运算来计算当前时间步的概率分布,并得到该序列的损失,计算公式如下:

p(yi|y1,...,yi-1,ci)=f(yi-1,hi,ci)

其中f使用softmax函数,用于评估生成单词yi的概率。

损失计算公式如下:

实施例二

本实施例提供了基于多尺度ast和特征融合的代码摘要生成系统;

基于多尺度ast和特征融合的代码摘要生成系统,包括:

获取模块,其被配置为:获取目标代码;

抽象语法树构建模块,其被配置为:针对目标代码,构建抽象语法树ast;

向量提取模块,其被配置为:针对抽象语法树ast提取整个抽象语法树ast的节点嵌入向量;同时,针对抽象语法树ast分别提取每个节点的特征向量;

代码摘要生成模块,其被配置为:将整个抽象语法树ast的节点嵌入向量和每个节点的特征向量,输入到解码器中,输出生成的代码摘要。

此处需要说明的是,上述获取模块、抽象语法树构建模块、向量提取模块和代码摘要生成模块对应于实施例一中的步骤s101至s104,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为系统的一部分可以在诸如一组计算机可执行指令的计算机系统中执行。

上述实施例中对各个实施例的描述各有侧重,某个实施例中没有详述的部分可以参见其他实施例的相关描述。

所提出的系统,可以通过其他的方式实现。例如以上所描述的系统实施例仅仅是示意性的,例如上述模块的划分,仅仅为一种逻辑功能划分,实际实现时,可以有另外的划分方式,例如多个模块可以结合或者可以集成到另外一个系统,或一些特征可以忽略,或不执行。

实施例三

本实施例还提供了一种电子设备,包括:一个或多个处理器、一个或多个存储器、以及一个或多个计算机程序;其中,处理器与存储器连接,上述一个或多个计算机程序被存储在存储器中,当电子设备运行时,该处理器执行该存储器存储的一个或多个计算机程序,以使电子设备执行上述实施例一所述的方法。

应理解,本实施例中,处理器可以是中央处理单元cpu,处理器还可以是其他通用处理器、数字信号处理器dsp、专用集成电路asic,现成可编程门阵列fpga或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。

存储器可以包括只读存储器和随机存取存储器,并向处理器提供指令和数据、存储器的一部分还可以包括非易失性随机存储器。例如,存储器还可以存储设备类型的信息。

在实现过程中,上述方法的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。

实施例一中的方法可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器、闪存、只读存储器、可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法的步骤。为避免重复,这里不再详细描述。

本领域普通技术人员可以意识到,结合本实施例描述的各示例的单元及算法步骤,能够以电子硬件或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。

实施例四

本实施例还提供了一种计算机可读存储介质,用于存储计算机指令,所述计算机指令被处理器执行时,完成实施例一所述的方法。

以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1