Page 240 - 《软件学报》2021年第7期
P. 240

2158                                     Journal of Software  软件学报 Vol.32, No.7,  July 2021

                 AST 信息,使其在生成类名时只关注到了 AST 信息中指向的类名“nine”.而 CodePtr-PGN 则将匹配 AST 信息的
                 任务分给了 Source Encoder,使 Code Encoder 可以专注于提取语义信息,而不需要在一定程度上互斥的两个任务
                 之间加以权衡.从图 5(b)可以看出,这一改进使 Code Encoder 更加准确地注意到了类“NinePatchBorder”的完整
                 名称.此外,通过观察图 5(a)和图 5(c)中 Attention 权重的局部分布特征,可以发现两者在某些局部的分布有一定
                 的相似性,并且这些特征是图 5(b)中所没有的,例如上方和右下方,因此我们有理由相信,CodePtr-PGN 的 Source
                 Encoder 的确分担了 Hybrid-DeepCom 中 Code Encoder 的一部分任务.
                    本小节举例分析了 CodePtr-PGN 相较于 Hybrid-DeepCom 的优势,证明了引入的 Source Encoder 在大部分
                 情况下对模型的表现带来了提升,并具体分析了带来提升的原因.
                 3.4.3    RQ2:指针生成网络能否解决输出端的 OOV 问题?
                    指针生成网络可以帮助 CodePtr 在注释中生成 OOV 词,我们对比分析了 CodePtr 与 CodePtr-PGN 和
                 Hybrid-DeepCom 在测试集上生成的注释,统计出了与 OOV 相关的信息,具体结果见表 3.表中 OOV 比例是指在
                 训练阶段,词库中被裁剪掉的 OOV 词占裁剪前词库大小的比例,Source 是指未经驼峰分解的词库,Code 是指经
                 驼峰分解的词库,Comment 是指根据注释构建的词库,SBT 序列由于只保留了类型,加上括号和一些特殊符号,
                 对应的词库大小仅为 58,不需要裁剪.生成的注释中“UNK”数量是指两个模型针对 19 431 个样本的测试集上
                 生成的注释中“UNK”标签的总数,CodePtr 生成的 OOV 词数量等于 CodePtr 在解码过程中输出 OOV 词的总
                 次数,Hybrid-DeepCom 和无指针生成网络的 CodePtr 无法在注释中生成 OOV 词,因此其生成的 OOV 词数量
                 为 0.
                              Table 3    OOV related statistics on test dataset of Hybrid-DeepCom and CodePtr
                                   表 3   Hybrid-DeepCom 与 CodePtr 在测试集上的 OOV 相关数据
                                      OOV 比例(%)            生成的注释中“UNK”的数量           CodePtr 生成的
                         词库大小
                                  Source  Code  Comment  Hybrid-DeepCom  CodePtr-PGN  CodePtr  OOV 词数量
                           5 000   98.95  88.50   90.70   5 329       6 126     4 53     1 093
                          10 000   97.90  77.00   81.41   2 756       3 272    18 17      801
                          30 000   93.70  31.00   44.22    670         896      397       232
                          50 000   89.51  0.00   7.04      92          107      12        24

                    从上表可以看出,相比于 Hybrid-DeepCom 和 CodePtr-PGN,CodePtr 生成的注释中“UNK”的数量有明显的
                 降低,并且随着词库大小的减少,OOV 比例的升高,CodePtr 生成的 OOV 词就越多.同时我们也发现,CodePtr-PGN
                 生成的注释中“UNK”的数量比 Hybrid-DeepCom 要多,我们分析是因其加入的 Source Encoder 的输入为分解
                 前的源代码序列,从表中“OOV 比例”栏目下“Source”一列可以看出,其中含有大量的“UNK”标签,对 CodePtr-
                 PGN 造成了干扰,因此可以看到,随着词库大小的增大,两者生成“UNK”的数量差距在逐渐缩小.
                    表 4 中,我们挑选了测试集上的一些样本,并给出了 Hybrid-DeepCom、CodePtr-PGN 和 CodePtr 两个模型
                 在词库大小为 30 000 情况下生成的注释,受篇幅所限,代码中的具体字符串使用“STR”替代,注释中加粗的单
                 词为 OOV 词.
                    可以看到,通过引入指针生成网络,CodePtr 可以在注释中生成 OOV 词,绝大部分均为属性名、方法名、
                 类名等标识符,大大提高了注释的可读性.例子 2 中,CodePtr 生成了比参考句子更正确的注释,虽然出现了重
                 复,但是可读性更高,Hybrid-DeepCom 出现了两处重复,可读性并不高,CodePtr without  PGN 虽然没有出现重
                 复,但却缺失了关键的标识符名称和“list”关键词.例子 8 中,相比于参考注释中的变量名,CodePtr 生成了正确
                 的变量名,Hybrid-DeepCom 生成了看似不相关的注释,CodePtr-PGN 虽然正确地捕捉到了程序的意图,但在变
                 量名处生成了“UNK”标签.我们还注意到例子 2 中的 CodePtr 和 Hybrid-DeepCom,例子 5 中的 CodePtr
                 without PGN 和 CodePtr,都生成了重复的一个或多个单词,这是在基于 Attention 机制的 seq2seq 模型中普遍
                 存在的问题    [46,47] .在解码过程中,由于 Attention 机制,生成的单词很大程度上依赖于输入序列的相关部分,并
                 且输入序列中的单词参与到了每个输出单词的生成过程中,因此会出现过度翻译(over-translation)和翻译不
                 足(under-translation)的问题 [46] ,在输出结果中出现重复就是出现了过度翻译的问题,即对输入序列中的某个
                 单词或片段过度关注        [47] .
   235   236   237   238   239   240   241   242   243   244   245