Page 226 - 《软件学报》2021年第7期
P. 226
2144 Journal of Software 软件学报 Vol.32, No.7, July 2021
中的索引,但是词库无法覆盖验证、测试和预测中出现的所有单词,并且由于时间、内存等限制,词库的大小通
常是固定的,这就需要删除词库中在训练数据集中不常出现的单词,因此,在训练、验证、测试和使用模型进行
预测时,会存在单词不在词库中的情况,从而导致了 OOV(out-of-vocabulary)问题.解决方法是将所有的 OOV 词
都映射到词库中的一个表示未知单词的特殊符号“UNK”,而这种方法会在模型的输入端和输出端都造成影
响.输入端的代价就是在编码时,模型无法知道该 OOV 词的真正含义,因此丢失了该词的语义信息;输出端的代
价就是在解码时,模型选择的是词库中概率最高的单词作为当前时刻的输出,因此 OOV 词也无法在生成的语句
中出现,这两方面的代价在一定程度上降低了模型的性能.OOV 问题对于机器翻译等输入输出都是自然语言的
任务影响较小,因为自然语言中很少出现不常用的偏僻词汇.但是,对于注释自动生成任务的影响较大,源代码
中会出现各种各样的变量名、方法名等缩写、简写或由多个单词拼接而成的单词,称为标识符(identifier),标识
符通常也会出现在对应的注释中,但是,由于它们一般只会出现在一个样本中,所以出现次数极少,很有可能在
词库中被裁剪掉,结果就是这些标识符会在词库中被表示为“UNK”,从而丢失了语义信息.并且,在生成的注释
[4]
中也无法出现这些标识符.上述 Tashtoush 等人 的研究结果表明,在许多代码特征中,对于提升源代码可读性的
积极性最高的就是有意义的名称.另一项研究表明,软件代码中 70%均为标识符 [19] .同时,注释中出现的标识符
可以使开发者更好地定位注释当前所指的对象,因此无论是在源代码中还是在注释中,将标识符表示为
“UNK”都会极大地影响源代码和注释的可读性.
[6]
Hybrid-DeepCom 是当前代码注释自动生成领域最先进的方法,它使用了两个编码器,分别将优化过的源
代码序列和对应的序列化的抽象语法树作为模型的输入,提取出源代码的语义信息和结构信息,再对提取到的
信息进行解码,从而生成对应的注释,其性能相对于之前基于神经网络的方法(即,基于 Attention [20] 的 seq2seq [18]
[9]
[6]
模型、DeepCom 和 CODE-NN [11] )有了明显的提升 ,其中,CODE-NN 的性能优于基于 IR 的方法 [11] .然而,
Hybrid-DeepCom 仍然存在不足,为了解决输入端的 OOV 问题,其对源代码序列进行的优化破坏了代码的语法
结构特征,导致两个输入之间的不一致,从而削弱了模型的部分性能.本文首先通过额外添加完整的源代码编码
器解决了 Hybrid-DeepCom 存在的不一致问题,提出了无指针生成网络的 CodePtr(CodePtr-PGN),实验结果表明,
提升后的模型在大部分情况下的表现优于 Hybrid-DeepCom.同时,我们进一步针对输出端的 OOV 问题,引入了
See 等人 [21] 提出的指针生成网络(pointer-generator network),指针生成网络在解码阶段的每一步都会计算出一
个概率用于进行软切换,即确定当前步骤是取词库中条件概率最大的单词作为当前时刻的输出,还是从输入序
列中直接将指针指向的单词作为当前时刻的输出.
在实验验证环节,本文将在 Hybrid-DeepCom 提供的数据集上对 Hybrid-DeepCom、无指针生成网络的
CodePtr(CodePtr-PGN)和 CodePtr 进行对比实验,由于 OOV 问题对模型的影响与词库的大小密切相关,实验将在
不同的词库大小下分别进行.实验中将使用广泛用于机器学习、文本摘要等领域的评分标准 BLEU(sentence-
level BLEU 和 corpus-level BLEU)和 METEOR 对结果进行评估.结果表明,CodePtr-PGN 在大部分情况下优于
Hybrid-DeepCom,而 CodePtr 在不同的词库大小下,均比 Hybrid-DeepCom表现得更为出色,在大多数情况下优于
CodePtr-PGN.此外,本文通过对比 3 个模型生成的注释,发现引入指针生成网络后,CodePtr 生成的注释中
“UNK”标签的数量明显少于引入指针生成网络之前的两个模型(CodePtr 的源代码开源已在 https://github.
com/NougatCA/CodePtr 中给出).
本文的主要贡献可总结如下:
(1) 针对 Hybrid-DeepCom 对源代码的预处理可能破坏语法结构特征这一不足,通过额外增加一个源代码
编码器解决了输入之间的不一致问题.
(2) 为了解决输出端的 OOV 问题,将指针生成网络引入 CodePtr,这也是代码注释自动生成领域首次引入指
针生成网络.
(3) 在大型的数据集上进行了实验.对比并分析了 CodePtr-PGN、CodePtr 和 Hybrid-DeepCom 的性能表现,
证明了额外添加的编码器消除了不一致性以及指针生成网络的有效性.
(4) 分析了词库大小对模型性能的影响,提出了今后的研究方向.