本发明专利技术提供一种基于多重源码表示和循环神经网络的代码注释生成方法,包括如下步骤:S1、收集Java代码注释对,构建语料库;S2、在序列化处理层,将语料库中的源代码转换为token序列、SBT序列和API序列;S3、在编码器层,使用双向GRU作为编码器,为3个序列分别构建codeseq编码器、SBTseq编码器和APIseq编码器,学习源代码不同级别的信息;S4、在解码器层,使用单向GRU构建解码器,并利用teacher forcing策略训练模型;S5、在3个编码器中的每个编码器后添加注意力层,将三个编码器输入和解码器输入的注意力矩阵链接起来并用一个全连接层学习如何组合每个输入的代码,最终输出代码注释。本发明专利技术提高代码注释生成的准确性,提高软件开发人员在软件开发过程中的效率,节省开发时间。时间。时间。
【技术实现步骤摘要】
基于多重源码表示和循环神经网络的代码注释生成方法
[0001]本专利技术属于代码注释生成的
,具体涉及一种基于多重源码表示和循环神经网络的代码注释生成方法,主要用于为用户输入的源代码片段生成对应的注释。
技术介绍
[0002]在软件工程领域,软件人员面对数目众多的大规模软件和复杂系统需要快速、准确地读懂代码,高效地完成软件变更和维护等任务。代码注释可以帮助开发和维护人员更快地读懂源代码,更好地理解代码背后的设计思想和代码的行为,大大节省开发人员和维护人员的宝贵时间,提高工作效率。鉴于此,代码注释在整个软件声明周期中起着非常重要的作用。
[0003]手工编写注释代价高、效率低,因此人们试图利用计算机自动地为代码生产注释。近年来,基于神经网络的代码注释技术成为自动代码注释研究的主流技术和软件工程领域的研究热点。目前,自动代码注释生成的准确性不高是急需解决的技术问题。
技术实现思路
[0004]本专利技术要解决的技术问题是提供一种基于多重源码表示和循环神经网络的代码注释生成方法,提高代码注释生成的准确性,能够有效辅助软件开发人员提高在软件开发过程中的效率,节省开发时间。
[0005]为解决上述技术问题,本专利技术的实施例提供一种基于多重源码表示和循环神经网络的代码注释生成方法,包括如下步骤:
[0006]S1、收集Java代码注释对,构建语料库;
[0007]S2、在序列化处理层,将语料库中的源代码转换为token序列、SBT序列和API序列;
[0008]S3、在编码器层,使用双向GRU作为编码器,为token序列、SBT序列和API序列分别构建codeseq编码器、SBTseq编码器和APIseq编码器,学习源代码不同级别的信息;
[0009]S4、在解码器层,使用单向GRU构建解码器,并利用teacher forcing策略训练模型;
[0010]S5、在codeseq编码器、SBTseq编码器和APIseq编码器中的每个编码器后添加注意力层,将三个编码器输入和解码器输入的注意力矩阵链接起来并用一个全连接层学习如何组合每个输入的代码,最终输出代码注释。
[0011]其中,步骤S1包括如下步骤:
[0012]S1.1、在GitHub搜索并下载5颗star以上的开源项目,收集Java方法及其JavaDoc注释对;
[0013]S1.2、删除不含有JavaDoc注释的Java方法并选择JavaDoc注释的首句话作为Java方法对应的注释;
[0014]S1.3、过滤掉所有行数小于5行的Java代码及其注释对,并删除重复Java代码片段,构建语料库。
[0015]其中,步骤S2包括如下步骤:
[0016]S2.1、将Java代码的词元转换为token序列;
[0017]S2.2、利用Eclipse JDK工具获得源代码的对应的AST(Abstract Syntax Tree),然后利用SBT算法来生成AST的遍历SBT序列;
[0018]S2.3、利用Deep API方法提取源代码对应的API序列。
[0019]其中,步骤S3包括的步骤为:
[0020]在构建编码器层时使用联合编码器形式,将token序列、SBT序列和API序列视为不同级别的输入序列,为每个输入序列构建其单独的编码器,而不是将多个序列拼接成一个序列,经过嵌入层后,统一进入单一编码器中;
[0021]选用双向GRU作为编码器,对于一段序列X={x1,x2,...,x
n
},当使用GRU网络嵌入向量时,其公式如下:
[0022][0023]其中,x
t
是序列中x
t
的词嵌入向量,h
tT
是隐藏层状态值,最终隐藏层状态值h
nT
代表此序列的模态表示。
[0024]其中,步骤S4中,利用teacher forcing策略训练模型的步骤为:
[0025]利用teacher forcing策略训练模型,在训练期间,模型每次学习预测一个词元的摘要时,不使用自身上一时刻的预测值,而是利用正确的词元进行此次预测,将正确词元作为当前时刻的输入,在输入序列时,使用<st>、<et>标签标记序列的开始与结尾,若序列长度超过预设值就截去超范围部分,若长度不足,就用<pad>标签进行填充。
[0026]其中,步骤S5的步骤为:
[0027]S5.1、每个编码器后单独添加一个注意力层,计算源代码的每种序列的信息分别与其对应注释的注意力;注意力机制指考虑query(随意线索),将输入表示为一个value(值)和key(不随意线索)对,通过注意力池化层有偏向性的选择某些输入,例如,给定数据(x
i
,y
i
),i=1,...,n,并引入可以学习的w利用以下公式进行计算:
[0028][0029]其中,x为query(随意线索),x
i
为key(非随意线索),y
i
为value(权重);
[0030]S5.2、在训练完成后,得到模型,用户即可通过给予模型代码段获取其对应生成的注释。
[0031]本专利技术的上述技术方案的有益效果如下:
[0032]本专利技术提出了一种基于多重源码表示和循环神经网络的代码注释生成方法,通过构建语料库,搭建深度神经网络并对其进行训练获得模型,用户可通过将Java代码段输入模型最终获得对应注释。
附图说明
[0033]图1为本专利技术的流程图;
[0034]图2为本专利技术中AST树遍历示意图;
[0035]图3为本专利技术中基于联合编码器的代码混合表示示意图;
[0036]图4为本专利技术中模型整体框架图;
[0037]图5为本专利技术中用户获得注释的实例图。
具体实施方式
[0038]为使本专利技术要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。
[0039]如图1所示,本专利技术提供一种基于多重源码表示和循环神经网络的代码注释生成方法,主要用于帮助用户生成代码注释,包括如下步骤:
[0040]S1、收集Java代码注释对,构建语料库;
[0041]S2、在序列化处理层,将语料库中的源代码转换为token序列,SBT序列和API序列;
[0042]S3、在编码器层,使用双向GRU作为编码器,为三种序列分别构建codeseq编码器,SBTseq编码器和APIseq编码器,学习源代码不同级别的信息;
[0043]S4、在解码器层,使用单向GRU构建解码器,并使用”teacher forcing”策略训练模型;
[0044]S5、在每个编码器后添加注意力层,将三个编码器输入和解码器输入的注意力矩阵链接起来并用一个全连接层学习如何组本文档来自技高网...
【技术保护点】
【技术特征摘要】
1.一种基于多重源码表示和循环神经网络的代码注释生成方法,其特征在于,包括如下步骤:S1、收集Java代码注释对,构建语料库;S2、在序列化处理层,将语料库中的源代码转换为token序列、SBT序列和API序列;S3、在编码器层,使用双向GRU作为编码器,为token序列、SBT序列和API序列分别构建codeseq编码器、SBTseq编码器和APIseq编码器,学习源代码不同级别的信息;S4、在解码器层,使用单向GRU构建解码器,并利用teacher forcing策略训练模型;S5、在codeseq编码器、SBTseq编码器和APIseq编码器中的每个编码器后添加注意力层,将三个编码器输入和解码器输入的注意力矩阵链接起来并用一个全连接层学习如何组合每个输入的代码,最终输出代码注释。2.根据权利要求1所述的基于多重源码表示和循环神经网络的代码注释生成方法,其特征在于,步骤S1包括如下步骤:S1.1、在GitHub搜索并下载5颗star以上的开源项目,收集Java方法及其JavaDoc注释对;S1.2、删除不含有JavaDoc注释的Java方法并选择JavaDoc注释的首句话作为Java方法对应的注释;S1.3、过滤掉所有行数小于5行的Java代码及其注释对,并删除重复Java代码片段,构建语料库。3.根据权利要求1所述的基于多重源码表示和循环神经网络的代码注释生成方法,其特征在于,步骤S2包括如下步骤:S2.1、将Java代码的词元转换为token序列;S2.2、利用Eclipse JDK工具获得源代码的对应的AST(Abstract Syntax Tree),然后利用SBT算法来生成AST的遍历SBT序列;S2.3、利用Deep API方法提取源代码对应的API序列。4.根据权利要求1所述的基于多重源码表示和循环神经网络的代码注释生成方法,其特征在于,步骤S3包括的步骤为:在构建编码器层时使用联合编码器形式,将token序列、...
【专利技术属性】
技术研发人员:文万志,支宝,胡晨,楚加卫,王晨宇,陈义,祁佳篁,王楚越,胡彬,
申请(专利权)人:南通大学,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。