1.一种基于递归神经网络模型的代码注释生成方法,其特征在于,包括如下步骤:
s1、使用scrapy从开源社区上爬取评分高的代码项目,获得java数据集;
s2、对步骤s1获得的java数据集进行筛选和处理,剔除简单的注释和方法,优化java数据集;
s3、将步骤s2处理过的java数据集输入seq2seq模型中,进行信息编码;
s4、将步骤s3输出的信息编码输入attention机制层和copy机制层得到上下文向量;
s5、将信息编码和上下文向量输入解码层,生成代码注释。
2.根据权利要求1所述的基于递归神经网络模型的代码注释生成方法,其特征在于,步骤s1的具体步骤为:
s1.1、根据github上的编程语言流行指标,选择排名靠前的java语言作为代码注释的目标;
s1.2、从github上爬取评分较高的java项目,获得java数据集。
3.根据权利要求1所述的基于递归神经网络模型的代码注释生成方法,其特征在于,步骤s2的具体步骤为:
s2.1、对获得的java数据集进行筛选和处理:在每个存储库中选择具有相应javadoc的java方法,并将javadoc中的第一句话用作java方法的目标注释,并且采用serializable接口技术,对面目标注释进行向量化处理,使得注释可以很好的保存上下文的信息,获得目标注释序列;
s2.2、优化java数据集:省略java数据集中基本测试方法的注释和方法,手动检查处理后的样本,并省略覆盖方法以减少重复。
4.根据权利要求1所述的基于递归神经网络模型的代码注释生成方法,其特征在于,步骤s3的具体步骤为:
s3.1、在对数据集进行预处理之后,得到的方法序列生成抽象语法树ast:第一步进行词法分析,读取代码从java方法中提取tokens,标记化方法体,使用camelcase分类每个token并且删除重复的token,最后将代码分割成一个tokens列表;第二步进行语法分析,将词法分析所得到的tokens列表转化成树形的表达形式;
s3.2、使用一种平衡二叉搜索树avl来遍历抽象语法树ast,查找token节点类型中代码词典,生成代码序列;
对于每一个结点调用insert()函数,在执行完insert()操作后,avl的性质不满足,再调用maintain()函数来修复avl;
s3.3、调用serialize()函数对ast进行序列化操作,将得到的ast序列输入到seq2seq模型之中;
s3.4、seq2seq模型的主流是编码器-解码器架构,并且融入attention机制和copy机制,编码器是一个两层双向lstm网络,解码器是一个单层lstm网络,对于给定的输入x=(x1,x2,…,xt),在t时刻的状态信息xt和上一状态隐含状态st-1经过长短记忆神经网络lstm模型,生成当前隐含状态序列st和状态信息xt的编码输出ht。
5.根据权利要求4所述的基于递归神经网络模型的代码注释生成方法,其特征在于,步骤s3.4的具体步骤为:
s3.4.1、假设eij为当前隐藏状态序列si-1和上一状态信息的编码输出hj的匹配程度的记号,计算公式如下:
eij=a(si-1,hj)式(ⅰ),
其中,si-1为第i-1位置的隐藏状态序列,hj为第j位置状态信息的编码输出;
s3.4.2、定义α为归一化概率权重,表示输入的第j个信息和当前输出的关系概率:
其中,eij为si-1和hj之间匹配程度的记号;
s3.4.3、权重α和编码输出hj之间的匹配程度得到上下文向量c,c的计算公式如下:
其中,αij为归一化概率权重,hj为第j时刻的编码输出;
s3.4.4、为了解决得到的上下文向量c中出现的未知词汇,融入copy机制,采用generate-mode©-mode两个模式,对未知词汇采用直接copy-mode的方式从源代码词汇中直接复制词汇,来缓解未知词汇的问题,提高上下文向量c中的有效词汇,对于已有的词汇采用generate-mode模式直接从词汇中生成;最后,将generate-mode©-mode输出的概率进行加和,作为最终词的概率分布。
6.根据权利要求1所述的基于递归神经网络模型的代码注释生成方法,其特征在于,步骤s5中将信息编码和上下文向量输入解码层,由源代码注释和序列概率分布生成输出序列,概率分布计算公式如下:
p(yt|y1,y2,…,yt-1,c)=g(yt-1,hi,c)式(ⅳ),
其中,yt为t时刻预测的结果,c为上下文向量,hi为第i个时刻的编码输出,g()为yi时刻的概率。