Page 228 - 《软件学报》2021年第7期
P. 228
2146 Journal of Software 软件学报 Vol.32, No.7, July 2021
层(hybrid attention).Wei 等人 [15] 将 CG(code generation)和 CS(code summary)两个任务作为对偶任务同时训练,
使用代码序列作为 CS 模型的输入,使用注释作为 CG 模型的输入,两个模型相互提升.通过与 CODE-NN、
DeepCom、RL+Hybrid2Seq 等模型的比较,证实了该模型在 CS 方面的优势.以上两种方法,RL+Hybrid2Seq 和
Wei 等人 [15] 提出的方法只利用了代码序列的信息,同时也未针对 OOV 问题作任何处理.Zhou 等人 [26] 强调了上
下文信息对生成代码注释的重要性,提出的 ContextCC 通过解析 AST 提取出包括方法和方法之间依赖性等的
上下文信息.此外,还基于预定义的模板和规则筛选代码和注释信息,以构建高质量的数据集,实验结果表明,
ContextCC 的性能优于 DeepCom 等方法.ContextCC 为了解决 OOV 问题,将标识符替换为其上下文信息,例如将
[8]
声明方法名的标识符替换为“METHODNAME”,这样的处理方式与 DeepCom 相似,会丢失标识符的所有
信息.
Huang 等人 [27] 提出了一种基于强化学习的方法 RL-BlockCom,同时提出了一种组合学习模型,该模型将强
化学习的 actor-critic 算法与编码器-解码器算法相结合.Wang 等人 [28] 提出了一种新的使用分层注意力网络
(hierarchical attention network)的代码摘要方法,该方法通过合并多个代码功能(包括类型增强的 AST 和程序控
制流)来实现,并将其引入到了深度增强学习框架中.LeClair 等人 [29] 提出的 ast-attendgru 使用了代码序列和 SBT
序列作为两个编码器的输入,实验结果表明,ast-attendgru 的表现优于 CODE-NN 和 DeepCom,但是 ast-attendgru
将两个编码器进行了串联,在效果上相当于只有一个编码器,其输入是 SBT 序列和代码序列拼接而成的序列,我
[6]
们认为这样做会使输入序列变得非常长,长序列的输入会降低 RNN 模型的性能.Hybrid-DeepCom 是
DeepCom 的改进版,将优化的源代码序列和 SBT 序列输入到两个编码器中,与 ast-attendgru 不同的是,Hybrid-
DeepCom 将两个编码器进行了并联,这样就有效地缩短了输入序列的长度.为了进一步解决输入序列中 OOV
词语义信息丢失的问题,对于源代码序列,Hu 等人根据 Java 的驼峰命名法对标识符进行了拆分,在保留了 OOV
词语义的同时大大减少了 OOV 词的比例.实验结果表明,Hybrid-DeepCom 的表现优于 DeepCom.Hybrid-
DeepCom 分解标识符虽然在一定程度上解决了输入端的 OOV 问题,但是我们认为,分解标识符会破坏源代码
的结构,从而造成两个输入之间出现不一致,本文将针对这一不足,通过额外增加一个编码器来解决这种不一致
问题.
1.3 其他方法
除了代码注释自动生成领域之外,还存在很多其他领域的方法,这些方法提出的对源代码的处理、特征提
取等思想,可统称为编程语言处理(programming language processing),对代码注释自动生成工作同样具有很大
的参考价值.
[7]
Marcus 等人 利用 LSI 技术对源代码和外部文档进行了分析,并从中提取了语义信息,将其用于自动识别
从系统文档到程序源代码的可追溯性链接.虽然并不是针对代码注释自动生成任务提出的方法,但是 Marcus 等
人提出的方法仍可用于该任务.刘亚姝等人 [30] 在对恶意代码特征提取中使用 LDA 获得汇编指令中潜在的“文
档-主题”“主题-词”的分布,设计恶意代码检测的工作框架,实现恶意样本的分类问题,并提出了困惑度的评价方
法,从而解决了 LDA 模型主题数目需要预先指定的问题.高原等人 [31] 在函数名称推荐模型中使用了 IR 技术,从
函数库中检索与输入函数相似的函数,首先对 Java 源代码的 AST 序列进行鹅卵石编码(shingles encoding) [32] ,
接着使用 Jaccard 系数对节点进行相似度度量,将相似节点封装成节点对用以进行语义分析,然后使用语义信息
计算每句代码和函数名称中词条的相关性,提取出特征代码,依据特征代码与词条的对应关系选出用于组成函
数名称的词条,然后按照规则对词条进行重组推荐给用户.
黄袁等人 [33] 在代码提交的关键类判定过程中,从代码耦合特征、代码修改特征以及提交类型特征这 3 个方
面提取了 21 种特征,然后提出了关键类识别的机器学习算法 ICC,建立特征向量与分类之间的映射关系,然后依
据训练好的模型,使用随机森林判定提交代码中的关键类.CommentAdviser [34] 致力于推荐注释点,同时为新手
程序员提供注释建议.CommentAdviser 从两个维度——代码自特征(intra-structural context feature)和代码间特
征(inter-structural context feature)提取了每个代码行的 11 种类型的结构上下文特征,同时,为了获取当前代码行
的上下文语义信息,还使用词嵌入技术从代码中提取语义上下文特征.将这两种特征向量相连就生成了当前代