Page 227 - 《软件学报》2021年第7期
P. 227
牛长安 等:基于指针生成网络的代码注释自动生成模型 2145
本文第 1 节介绍代码注释自动生成的相关工作.第 2 节介绍本文提出的模型.第 3 介绍实验相关设置,进行
实验,并对实验结果进行对比和分析,验证模型的有效性.最后总结全文,并对下一步工作进行展望.
1 相关工作
早期的代码注释自动生成任务大多基于信息检索(information retrieval,简称 IR)算法,近年来,由于深度神经
网络在 NLP 领域突出的表现,相关研究大部分使用了神经网络(neural network,简称 NN),并取得了较好的成绩,
除此之外,还存在很多其他领域的方法,由于也是对源代码进行处理,因此同样值得参考.
1.1 基于IR的代码注释自动生成
基于 IR 的代码注释自动生成算法一般采用基于向量空间模型(vector space model,简称 VSM)、潜在语义
索引(latent semantic indexing,简称 LSI)、潜在 Dirichlet 分配(latent Dirichlet allocation,简称 LDA)等技术或代码
[5]
克隆检测(code clone detection)等相关技术 .
[8]
Kuhn 等人 利用 LSI 技术在源代码中寻找语言信息,例如,标识符、名称和注释等非正式语义信息,称这
些信息为语言主题,他们认为这些语言主题同样反映了代码的意图,并根据主题对源代码进行了聚类.Haiduc
[9]
等人 使用 VSM 和 LSI 分析源代码文本,提取并生成类和方法的自然语言摘要.在使用 VSM 为源代码生成提
取摘要时,根据所选权重选择源代码文档中最相关的术语.同时,还利用 LSI 技术计算语料库中每个词的向量与
要总结的源代码文档的向量之间的余弦相似度,然后生成不出现在要总结的方法或类中,但出现在语料库中的
高度相似的词.他们分析了 Java 项目中的方法和类源代码,并为其生成了简短而准确的文本描述.Movshovitz-
Attias 等人 [22] 使用主题模型、LDA 和 n-gram 模型来预测 Java 源代码的注释.他们利用训练过的 n-gram 模型、
LDA 模型和 link-LDA 模型,计算文档主题的后验概率,并据此进一步推断注释标记的概率,最后将概率较高的
注释标记作为源代码文件的注释.Wong 等人 [10] 应用代码克隆检测技术(使用最长公共子串)来发现相似的代码
段,并使用一些代码段中的注释来描述其他相似的代码段.
1.2 基于神经网络的代码注释自动生成
CODE-NN [11] 是首个完全由数据驱动的代码自动生成方法,使用了基于 Attention 机制的神经网络,据我们
所知,它是首个专门用于代码注释自动生成任务的神经网络模型.Iyer 等人将 CODE-NN 与基于语法的机器翻译
系统 MOSES [23] 和文本摘要模型 SUM-NN [24] 进行了对比,CODE-NN 的 METEOR 和 BLEU-4 得分均高于两者.
Tree-to-Sequence [25] 认为将顺序序列直接输入到编码器中并不能得到很好的结果,因为输入的结构信息同样重
要,因此 Tree-to-Sequence 使用了语法树作为编码器的输入,提出了一种新的模型,称为 Tree-to-sequence attention
NMT model.新模型基于树,可以获取序列中的语法信息.实验结果表明,引入结构语法信息对机器翻译有明显的
积极作用.
[9]
对于编程语言这种结构性强的语言,结构语法信息显得更加重要,因此 DeepCom 将 Java 代码转换为对应
的抽象语法树(abstract syntax tree,简称 AST),为了将树形的 AST 作为顺序序列输入到 DeepCom 中,Haiduc 等人
针对 AST 提出了一种新型的遍历方法 SBT(structure-based traversal),将 SBT 的遍历结果作为编码器的输入.
SBT 可以在保留树的结构信息的同时将树转换为顺序输入,不同于先序遍历等传统遍历方法无法从遍历结果
准确推出 AST,SBT 的遍历结果唯一对应一个 AST.同时,Haiduc 等人还针对输入端的 OOV 问题,提出如果 AST
中命名为“类型_变量名”的叶节点是 OOV 词,则将其名称替换为只有“类型”,保留一定信息的同时大大减少了
OOV 词的比例,但是由于“类型”的种类太少,同时标识符的名称里也存在很多有用的语义信息,这种方法依然无
法避免地丢失了很多信息.实验结果表明,DeepCom 相对于 CODE-NN 在百分制 BLEU 上的提升约为 13 分,
Haiduc 等人还通过实验证明了 SBT 的性能要优于先序遍历.
TL-CodeSum [13] 同时将代码序列和 API 序列作为输入,分别对应两个编码器,然后将两个编码器的输出结合
起来作为解码器的输入.Wan 等人 [14] 将称为 Actor-Critic 的深度强化学习框架引入到了代码自动生成任务,提出
了 RL+Hybrid2Seq,其使用两个编码器将代码序列和 AST 作为输入,针对两个编码器的输出使用了混合注意力