CN115826988A - 一种基于数据流分析和注意力机制的Java方法注释即时自动更新方法 - Google Patents

一种基于数据流分析和注意力机制的Java方法注释即时自动更新方法 Download PDF

Info

Publication number
CN115826988A
CN115826988A CN202211587140.4A CN202211587140A CN115826988A CN 115826988 A CN115826988 A CN 115826988A CN 202211587140 A CN202211587140 A CN 202211587140A CN 115826988 A CN115826988 A CN 115826988A
Authority
CN
China
Prior art keywords
code
annotation
old
attention
sequence
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202211587140.4A
Other languages
English (en)
Inventor
许蕾
朱泓全
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University
Original Assignee
Nanjing University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nanjing University filed Critical Nanjing University
Priority to CN202211587140.4A priority Critical patent/CN115826988A/zh
Publication of CN115826988A publication Critical patent/CN115826988A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

本发明的主要工作是提出一种基于数据流分析和注意力机制的Java方法注释即时自动更新方法:首先,通过代码差异分析模块识别新旧代码之间的变更内容并表示成编辑序列;其次,通过语法分析模块分析语法节点的变化信息;然后,通过数据流分析模块对Java方法进行数据流依赖分析,得到变量节点间的数据流依赖关系;接着,使用代码文本编码神经网络模块将代码编辑序列转换为向量中间表示,使用代码结构编码神经网络将新代码抽象语法树转换为向量中间表示,使用自然语言编码神经网络模块将Java方法对应的旧注释编码为向量中间表示;最后,融合代码变更序列、代码结构、代码旧注释三方面的中间表示,通过注意力导向的解码模块生成对旧注释的操作序列。

Description

一种基于数据流分析和注意力机制的Java方法注释即时自动 更新方法
技术领域
本发明属于计算机技术领域,尤其是软件技术领域。本发明提出了一种基于数据流分析和注意力机制的Java方法注释即时自动更新方法,通过分析用户对Java方法的修改,自动将旧注释更新为符合修改后的代码的新注释。本发明有效预防了项目中出现注释不规范、代码与注释不一致等问题,从而节省了开发人员的工作量并提高了代码的可读性和可维护性。
背景技术
随着软件项目的复杂性和软件产品迭代频率的不断提高,程序理解在整个软件开发过程中变得越来越重要。代码注释是软件项目的重要组成部分,除了源代码,注释被认为是程序理解和维护的最基本要素。代码的各种信息,例如:为什么实现一个函数、如何实现一个函数、如何使用一个API、两个代码片段之间的关系是什么以及一个代码段是如何演变的,都可以用自然语言描述(也就是注释)记录在源代码文件中。这些注释可以帮助后续开发人员理解源代码,支持并促进不同开发人员之间的交流。因此,结构良好、内容正确的注释对代码审查、软件维护与演化起着至关重要的作用。
作为源代码的重要参考内容,注释需要与相应的代码片断共同演化。然而,在实践中,开发人员可能会在改变源代码的同时忽略更新注释,从而导致注释过时。这样的注释会误导开发者,使代码审查复杂化,甚至可能导致错误的引入,并对软件系统的健壮性产生负面影响。因此,有必要及时修复过时的注释,甚至避免其引入。近年来,深度学习技术不断发展,受序列到序列模型和注释自动生成工作的启发,通过神经网络对代码片段进行编码,再用另一个神经网络将该隐藏状态解码成连贯的句子,这样生成的注释往往具有不错的效果,优于传统方法所生成的注释。因此,可以使用序列到序列模型来构建特殊映射,通过训练不断优化模型,最终将代码变更和旧注释输入到训练好的模型并输出所生成的新注释。
先前已经有相关工作使用上述思路来自动更新注释。但是先前的工作并未充分利用代码的结构信息,并且和注释生成工作一样令模型从头生成新注释,导致生成的注释准确率不高;另一方面,也有工作提出了启发式方法,根据一定的规则来实现代码修改后自动更新注释,但只能处理一些简单的实例。
因此,本发明的主要目标是基于混合分析并充分利用项目中所有对注释更新有利的信息(包括代码的变更信息、代码的结构信息和旧注释),随后基于深度学习领域的序列到序列模型生成注释的更新操作序列,从而实现对旧注释的自动更新,减轻程序员的开发负担,实现开发效率和质量的提高。
发明内容
本发明的主要工作是提出一种基于数据流分析和注意力机制的Java方法注释即时自动更新方法,使用到深度学习领域的循环神经网络技术。首先,本发明关注的是Java方法。Java是软件开发中最受欢迎的语言之一,其语言特点有着丰富的结构、类型信息。此外,目前针对Java语言的程序分析技术较为成熟且广泛使用,能够比较方便地提取到生成注释所需要的基本信息。其次,本发明关注如何使用程序分析的结果进行模型训练,并使用训练好的深度学习模型进行注释生成。最后,本发明会对生成结果进行机器指标和人工指标评估,并和现有方法进行比较,力求更高的注释更新质量。
本发明的工作和贡献如下。
1.构建了一键式的自动化Java代码差异分析模块:代码差异分析模块将原始数据集中每个样本的新代码与旧代码之间的词汇进行对齐,从而识别出新代码相对于旧代码的增加、修改、删除及保持不变的部分,并为每个部分添加相应的标签,即增加、修改、删除或不变;然后,将添加了标签的代码序列按照原有的代码顺序依次拼接起来,形成代码编辑序列,作为训练时的输入;同理,对新注释与旧注释也进行同样的分析,形成注释编辑序列,作为训练时的标签。
2.实现了针对代码变更的语法分析模块和变更引导的注意力机制:语法分析模块将训练集中的Java语言方法级别的每一对新、旧代码样本,通过语法分析工具GumTreeDiff分析得到它们的抽象语法树,接着将两个抽象语法树进行合并,对变化的节点进行标记,形成变更引导的注意力矩阵,作为后续训练模型的特征信息。
3.实现了数据流分析方法,构建了数据流依赖引导的注意力矩阵,改进模型注意力机制:根据代码抽象语法树,针对方法中所有的变量节点,通过多种规则进行数据流分析,抽取变量之间的数据流关系,再通过数据流依赖引导的注意力矩阵记录变量之间的数据流依赖关系,从而保留代码上下文变量之间的长依赖信息。
4.实现了注意力导向的解码模块:注意力导向的解码模块是由单向GRU构成的解码器,以代码变更序列、代码结构、代码旧注释三方面的中间表示作为输入,并结合波束搜索算法,同时预测多个注释更新操作序列,通过综合考虑文本、结构信息,提高模型预测的综合精度;与一般的解码器不同,该解码器不直接生成完整的自然语言文本作为新注释,而是生成对旧注释的操作序列,从而减少了需要生成的序列长度,提高了预测的准确度。
为了增强结果的普适性和说服力,复现了当前现有的最好工作并在相同数据集下进行了验证。结果显示,本发明的各项指标均显著高于现有工作。
附图说明
图1为本发明基于结构引导的注意力机制示意图
图2为本发明基于序列-序列(Seq2Seq)模型的架构示意图
具体实施方式
本发明具体包括以下步骤:
1)对数据集中的代码变更进行差异分析,对新、旧代码中的差异部分进行标注,形成代码编辑序列,作为模型训练的输入数据;
2)对数据集中的代码变更进行语法分析,得到包含代码变更的抽象语法树,分析语法树中节点的变化信息,形成变更引导的注意力矩阵;
3)在语法分析得到的抽象语法树的基础上,提取该方法中所有的变量节点,应用数据流分析方法,得到节点间的数据流关系,形成数据流依赖引导的注意力矩阵;
4)分别构建针对代码文本、代码结构和旧注释的编码模块,用于将代码文本、代码结构和旧注释转换为向量中间表示,同时引入步骤2)和步骤3)中的两个注意力矩阵,构成结构引导的的注意力机制,实现自注意力机制层;
5)将步骤4)中得到的代码变更序列、代码结构和旧注释的三方面中间表示拼接成融合中间表示,将得到的融合中间表示输入到注意力导向的解码模块中,生成对旧注释的更新操作序列;
6)基于步骤4)的编码器和步骤5)的解码器,得到一个序列-序列(Seq2Seq)模型,在训练数据集上进行训练;为提高训练效率,使用GPU进行训练;训练结束后使用测试数据集中的数据输入模型测试,根据方法变更自动更新注释。
步骤1)数据集中的每个样本均由一个Java方法的新、旧代码对与新、旧注释对构成。首先,将新、旧代码片段分别转换为两个token序列;然后使用difflib2来将代码token序列对齐,识别出代码的变更内容。为了表示代码的变更,即如何把旧的代码片段编辑成新的代码片段,本发明将代码token序列加上编辑动作标签,即<Action>[tokens]</Action>。本发明中定义了四种类型的编辑动作:INSERT、DEL、UPDATE和KEEP。特别地,UPDATE动作必须包含更新前后的内容,从而明确指出旧注释中的哪些token将被新token替换。
步骤2)通过GumTreeDiff工具分别对训练集中的每个样本的新、旧代码对进行模块的语法分析,获得它们的抽象语法树,如有语法分析失败的样本,则丢弃之。接着使用层序遍历的方式分别遍历每个样本代码的新、旧语法树,将两个抽象语法树进行合并,对变化的节点进行标记,形成变更引导的注意力矩阵M,作为后续训练模型的特征信息。同时,在遍历抽象语法树的时候,保留抽象语法树的所有节点,包括节点值、节点类型等信息。为了能让深度神经网络模型学习到代码的语法变更信息,本发明引入的变更引导的注意力矩阵M定义为:
Figure BSA0000290805500000041
其中,A是如下定义的节点对集合:ni和nj是同一节点,或拥有相同值的节点,或ni和nj之间存在赋值关系;CN是所有变更节点的集合。通过这样的注意力矩阵,使模型能够重点关注结构上的变化节点。
步骤3)根据步骤2)得到的代码抽象语法树,提取该方法中的所有的变量节点,应用数据流分析方法,得到节点间的数据流关系,表1显示了具体的数据流依赖提取规则:
表1数据流依赖提取规则
Figure BSA0000290805500000042
表1中总结了10种语法上的输出及输入模式,其中,e∈E表示一个表达式;
Figure BSA0000290805500000043
表示一个变量对象;O(l)和O(r)分别表示左操作数和右操作数;M表示一个方法;OUT(M)是拥有输出流的变量对象的集合;根据这些模式规则,判断变量节点是属于OUT(M)或IN(M),对于IN(M)中的每个变量v,去查找最近一个属于OUT(M)的变量u,则有u→v,即v依赖于u;
在通过多种规则抽取出变量之间的数据流依赖关系后,再通过数据流依赖引导的注意力矩阵M记录变量之间的数据流依赖关系,从而保留代码上下文变量之间的长依赖信息,矩阵M定义为:
Figure BSA0000290805500000044
其中,<ni,nj>∈E表示第j个节点的值来自于第i个节点,即节点nj依赖于节点ni,因此,对于矩阵M来说,当节点nj依赖于节点ni时,Mij置为1,否则置为0。当数据流依赖引导的矩阵M被引入步骤5)时,通过Soffmax逻辑回归计算后,设置为1的部分将比设置为0的部分拥有更高的注意力分数,这表明模型将更加关注这些变量间的依赖关系。
步骤4)分别构建针对代码文本、代码结构和旧注释的三个双向GRU编码器,用于将代码文本、代码结构和旧注释转换为向量中间表示,同时实现自注意力机制层。例如,给定一个代码变更序列X=[x1,x2...,xn],代码文本编码器会将输入编码成隐藏状态向量序列H=[h1,h2...,hn],整个过程可以用ht=f(xt,ht-1)表示。
同理,另外两个编码器也能得到代码结构和旧注释在模型中的隐藏状态h′t。为了引导模型关注代码中的变化部分和依赖关系,捕获代码上下文之间的联系,本发明引入了自注意力机制层。自注意力机制层将编码器输出的隐藏状态向量H=[h1,h2...,hn]作为输入,并为其中的每个向量ht输出一个注意力向量ct,从而形成一个注意力上下文序列C=[c1,c2...,cn],ct是编码器的隐藏状态向量经过注意力层计算后的权重和。特别地,代码结构编码器将略有不同,它加入了步骤2)中定义的变更引导的注意力矩阵和步骤3)中定义的数据流依赖引导的注意力矩阵,来强化结构变更信息。
步骤5)将步骤4)中得到的代码变更序列、代码结构和旧注释三方面中间表示拼接成融合中间表示,将得到的融合中间表示输入到注意力导向的解码模块中,解码模块被设计用来生成目标注释更新序列Y=y1,y2...,yt,...ym。每个生成词yt由其前面的所有生成词y1到yt-1和输入X的条件概率决定,即
Figure BSA0000290805500000051
其中
Figure BSA0000290805500000052
是上下文向量ct和解码器中隐藏状态st拼接而成,即
Figure BSA0000290805500000053
训练阶段之后,得到最终模型M(X|X′),可预测任意给定一个代码片段X和一个传递代码片段X′,之前输出的所有单词为y<t的情况下输出每一个位置单词为yt的概率值p(yt|X,X′,y<t)。
步骤6)基于步骤4)的编码器和步骤5)的解码器,得到一个序列-序列(Seq2Seq)模型,在训练数据集上进行训练。为提高训练效率,使用GPU进行训练。训练结束后使用测试数据集中的数据输入模型测试,将解码器输出的token向量转化成单词,为旧注释生成注释更新操作序列,再将操作序列应用到旧注释上,从而实现对旧注释的自动更新。

Claims (5)

1.一种基于数据流分析和注意力机制的Java方法注释即时自动更新方法,其特征在于包括如下步骤:
1)对数据集中的代码变更进行差异分析,对新、旧代码中的差异部分进行标注,形成代码编辑序列,作为模型训练的输入数据;
2)对数据集中的代码变更进行语法分析,得到包含代码变更的抽象语法树,分析语法树中节点的变化信息,形成变更引导的注意力矩阵;
3)在语法分析得到的抽象语法树的基础上,提取该方法中所有的变量节点,应用数据流分析方法,得到节点间的数据流关系,形成数据流依赖引导的注意力矩阵;
4)分别构建针对代码文本、代码结构和旧注释的编码模块,用于将代码文本、代码结构和旧注释转换为向量中间表示,同时引入步骤2)和步骤3)中的两个注意力矩阵,实现自注意力机制层;
5)将步骤4)中得到的代码变更序列、代码结构和旧注释的三方面中间表示拼接成融合中间表示,将得到的融合中间表示输入到注意力导向的解码模块中,生成对旧注释的更新操作序列;
6)基于步骤4)的编码器和步骤5)的解码器,得到一个序列-序列(Seq2Seq)模型,在训练数据集上进行训练;为提高训练效率,使用GPU进行训练;训练结束后使用测试数据集中的数据输入模型测试,根据方法变更自动更新注释。
2.根据权利要求1描述的基于混合分析和注意力机制的Java方法注释即时自动更新方法,其特征在于,步骤1)中所述的代码差异分析模块,具体如下:
代码差异分析模块首先将代码文本分割成token序列,旧代码片段和新代码片段被分别转换为两个token序列,再将新代码与旧代码之间的token进行对齐,从而识别出新代码相对于旧代码的增加、修改、删除及保持不变的部分,并为每个部分添加相应的标签,即增加、修改、删除或不变;最后,将添加了标签的token序列按照原有的代码顺序依次拼接起来,形成代码编辑序列。
3.根据权利要求1描述的基于混合分析和注意力机制的Java方法注释即时自动更新方法,其特征在于,步骤2)中所述的语法分析过程和变更引导的注意力矩阵,具体如下:
语法分析模块将训练集中的Java语言方法级别的每一对新、旧代码样本,通过语法分析工具GumTreeDiff分析得到它们的抽象语法树,接着将两个抽象语法树进行合并,对变化的节点进行标记,形成变更引导的注意力矩阵M,作为后续训练模型的特征信息,同时也保留代码的抽象语法树的所有节点,包括节点值、节点类型等信息,矩阵M定义为:
Figure FSA0000290805490000011
其中,A是如下定义的节点对集合:ni和nj是同一节点,或拥有相同值的节点,或ni和nj之间存在赋值关系;CN是所有变更节点的集合。
4.根据权利要求1描述的基于混合分析和注意力机制的Java方法注释即时自动更新方法,其特征在于,步骤3)中所述的数据流分析方法,并根据该方法构建了数据流依赖引导的注意力矩阵,具体数据流依赖提取规则如下:
输出流(Output-flow)规则:
(1)MethodParameter:其定义为
Figure FSA0000290805490000021
例如f(e1,...,en);
(2)PostfixExpression:其定义为
Figure FSA0000290805490000022
例如e++;
(3)Assignment(left-hand):其定义为
Figure FSA0000290805490000023
例如v=e;
输入流(Incoming-flow)规则:
(1)PrefixExpression:其定义为
Figure FSA0000290805490000024
例如f(e1,...,en);
(2)InfixExpression:其定义为
Figure FSA0000290805490000025
例如e1<e2
(3)PostfixExpression:其定义为
Figure FSA0000290805490000026
例如e++;
(4)ContainerAccess:其定义为
Figure FSA0000290805490000027
例如v[e];
(5)MethodInvocation:其定义为
Figure FSA0000290805490000028
例如v.f(e1,...,e2);
(6)ReturnStatement:其定义为
Figure FSA0000290805490000029
例如returne1,...,en
(7)Assignment(right-hand):其定义为
Figure FSA00002908054900000210
例如v=e;
规则中一共总结了10种语法上的输出及输入模式,其中,e∈E表示一个表达式;
Figure FSA00002908054900000211
表示一个变量对象;O(l)和O(r)分别表示左操作数和右操作数;M表示一个方法;OUT(M)是拥有输出流的变量对象的集合;根据这些模式规则,判断变量节点是属于OUT(M)或IN(M),对于IN(M)中的每个变量v,去查找最近一个属于OUT(M)的变量u,则有u→v,即v依赖于u;
在通过多种规则抽取出变量之间的数据流依赖关系后,再通过数据流依赖引导的注意力矩阵M记录变量之间的数据流依赖关系,从而保留代码上下文变量之间的长依赖信息,矩阵M定义为:
Figure FSA00002908054900000212
其中,<ni,nj>∈E表示第j个节点的值来自于第i个节点,即节点nj依赖于节点ni,因此,对于矩阵M来说,当节点nj依赖于节点ni时,Mij置为1,否则置为0,当数据流依赖引导的矩阵M被引入步骤5)时,通过Softmax逻辑回归计算后,设置为1的部分将比设置为0的部分拥有更高的注意力分数,这意味着模型将更加关注这些变量间的依赖关系。
5.根据权利要求1描述的基于混合分析和注意力机制的Java方法注释即时自动更新方法,其特征在于,步骤5)中所述的注意力导向的解码模块,具体如下:
注意力导向的解码模块是基于单向GRU解码器构建的,以步骤4)得到的代码变更序列、代码结构、代码旧注释三方面中间表示拼接成的融合中间表示作为输入,并结合波束搜索算法,同时预测多个注释更新操作序列,通过综合考虑文本、结构信息,提高模型预测的综合精度;与一般的解码器不同,该解码器不直接生成完整的自然语言文本作为新注释,而是生成对旧注释的操作序列,从而减少了需要生成的序列长度,提高了预测的准确度。
CN202211587140.4A 2022-12-09 2022-12-09 一种基于数据流分析和注意力机制的Java方法注释即时自动更新方法 Pending CN115826988A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211587140.4A CN115826988A (zh) 2022-12-09 2022-12-09 一种基于数据流分析和注意力机制的Java方法注释即时自动更新方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211587140.4A CN115826988A (zh) 2022-12-09 2022-12-09 一种基于数据流分析和注意力机制的Java方法注释即时自动更新方法

Publications (1)

Publication Number Publication Date
CN115826988A true CN115826988A (zh) 2023-03-21

Family

ID=85546402

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211587140.4A Pending CN115826988A (zh) 2022-12-09 2022-12-09 一种基于数据流分析和注意力机制的Java方法注释即时自动更新方法

Country Status (1)

Country Link
CN (1) CN115826988A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117435511A (zh) * 2023-12-20 2024-01-23 厦门市唯云网络科技有限公司 一种基于图神经网络的流量监测软件的测试方法和装置

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117435511A (zh) * 2023-12-20 2024-01-23 厦门市唯云网络科技有限公司 一种基于图神经网络的流量监测软件的测试方法和装置
CN117435511B (zh) * 2023-12-20 2024-03-19 厦门市唯云网络科技有限公司 一种基于图神经网络的流量监测软件的测试方法、装置及存储介质

Similar Documents

Publication Publication Date Title
CN107632981B (zh) 一种引入源语组块信息编码的神经机器翻译方法
CN108829722B (zh) 一种远程监督的Dual-Attention关系分类方法及系统
CN110489102B (zh) 一种从自然语言自动生成Python代码的方法
CN110442880B (zh) 一种机器翻译译文的翻译方法、装置及存储介质
CN113190219A (zh) 一种基于递归神经网络模型的代码注释生成方法
CN112835585A (zh) 一种基于抽象语法树的程序理解方法及系统
CN115048141A (zh) 一种基于图引导的Transformer模型代码注释自动生成方法
CN112162775A (zh) 一种基于Transformer和混合代码表示的Java代码注释自动生成方法
CN113657123A (zh) 基于目标模板指导和关系头编码的蒙语方面级情感分析方法
CN115543437B (zh) 一种代码注释生成方法和系统
CN116700780A (zh) 一种基于抽象语法树代码表征的代码补全方法
CN116151132A (zh) 一种编程学习场景的智能代码补全方法、系统及储存介质
CN113901847A (zh) 基于源语言句法增强解码的神经机器翻译方法
CN116661805A (zh) 代码表示的生成方法和装置、存储介质及电子设备
CN114692568A (zh) 一种基于深度学习的序列标注方法及应用
CN115826988A (zh) 一种基于数据流分析和注意力机制的Java方法注释即时自动更新方法
CN112380882B (zh) 一种具有误差修正功能的蒙汉神经机器翻译方法
CN112433754B (zh) 一种基于程序分析的Java函数注释自动生成方法
CN117573084B (zh) 一种基于逐层融合抽象语法树的代码补全方法
CN117573096A (zh) 一种融合抽象语法树结构信息的智能代码补全方法
CN117390189A (zh) 基于前置分类器的中立文本生成方法
CN112148879B (zh) 一种自动给代码打数据结构标签的计算机可读存储介质
CN116820557A (zh) 一种融合抽象语法树节点特征的代码摘要生成方法
CN114861627B (zh) 一种基于深度学习的选择题干扰项自动化生成方法及装置
CN114358021A (zh) 基于深度学习的任务型对话语句回复生成方法及存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination