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

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

                                     Table 1    Scores of each model under different vocabulary size
                                              表 1   不同词库大小下各模型的得分
                                  词库大小      评估方法      Hybrid-DeepCom  CodePtr-PGN  CodePtr
                                            C-BLEU        37.14         36.68      40.11
                                   5 000    S-BLEU        35.47         35.18      39.24
                                            METEOR        48.06         48.01      50.86
                                            C-BLEU        40.27         40.93      43.14
                                   10 000   S-BLEU        38.98         39.49      42.41
                                            METEOR        50.85         51.51      53.33
                                            C-BLEU        41.73         44.30      47.94
                                   30 000   S-BLEU        40.92         43.72      47.76
                                            METEOR        52.21         54.30      57.00
                                            C-BLEU        40.45         42.74      42.02
                                   50 000   S-BLEU        39.49         42.27      41.50
                                            METEOR        51.42         53.37      52.84

                    可以看到,在词库大小为 5 000~30 000 时,CodePtr 的得分明显高于前两个模型,在词库大小为 50 000 时与
                 CodePtr-PGN 接近,两者均高于 Hybrid-DeepCom.CodePtr-PGN 与 Hybrid-DeepCom 相比,两者在词库大小为
                 5 000 时得分相近,在 10 000~50 000 时前者高于后者.
                    Hybrid-DeepCom、无指针生成网络的 CodePtr 和 CodePtr 的参数数量分别为 25.64M、34.24M 和 39.37M.
                 在模型的运行开销方面,在词库大小为 30 000 的情况下,Hybrid-DeepCom 在第 18 轮由于达到了早停条件而终
                 止训练,总运行时长约为 23.5 小时;CodePtr-PGN 在第 17 轮终止了训练,总运行时长约为 27.5 小时;CodePtr 则在
                 第 17 轮终止了训练,总运行时长约为 26.5 小时.我们将在下面的小节中回答所提出的 3 个研究问题.
                 3.4.2    RQ1:加入 Source Encoder 是否可以提升模型的性能?
                    之前我们提出了 Hybrid-DeepCom 的缺点,就是 Code Encoder 的输入和 AST Encoder 的输入之间存在不一
                 致,我们认为这是 Code Encoder 在 Hybrid-DeepCom 中担任两个角色造成的.其两个角色中,第 1 个是提取代码
                 序列特征的角色,需要通过 RNN 提取出代码序列的语义信息;第 2 个是提供注意力的角色,Attention 机制需要通
                 过给 Code Encoder 的输入的不同权重来决定当前的输出.我们认为,Hybrid-DeepCom 通过分解标识符增强了其
                 作为第 1 个角色的作用,但却破坏了代码结构,削弱了其作为第 2 个角色的作用,这两个作用在这里是无法同时
                 提升的.因此我们在此基础上再增加一个输入,即分解标识符之前的代码序列,分担 Code Encoder 的第 2 个角色,
                 提出了 CodePtr-PGN,将 Hybrid-DeepCom 中 Code Encoder 的第 2 个任务由过新的编码器 Source Encoder 来承
                 担,我们认为这样可以使模型中的每个编码器只有一个角色,并专注于一个任务,从而在一定程度上提高了模型
                 的表现.
                    我们将 Code-PGN 与 Hybrid-DeepCom 在不同词库大小下的表现进行对比,分析不同词库大小下,加入
                 Source Encoder 是否会提升模型的表现,如果带来了提升,我们将进一步分析提升的原因.
                    表 1 中的实验结果表明,在词库大小为 5 000 时两者得分相近,在 10000~50000 时 CodePtr-PGN 高于
                 Hybrid-DeepCom.对于两者在词库大小为 5 000 时得分相近的原因,我们认为是上述 Source Encoder 为 CodePtr-
                 PGN 带来的优势在较小的词库大小下并没有产生作用,因为对于含有较多 OOV 词的分解前的源代码,在较小
                 的词库大小下,Source Encoder 的输入包含了大量的“UNK”标签,这些大比例的无意义信息使得 Source
                 Encoder 无法给模型带来实际的提升.这也是当词库大小为 30 000 和 50 000 时,CodePtr-PGN 与 Hybrid-
                 DeepCom 的分差比在 10 000 时要大的原因.
                    表 2 显示了在词库大小为 30 000 时 CodePtr-PGN 和 Hybrid-DeepCom 在所示样本上的输出,其中加粗的单
                 词表示 Source Encoder 和 Code Encoder 输入之间的差异.
                    从表中可以看出,Code Encoder 的输入将类名“NinePatchBorder”根据驼峰命名法分解为了“nine”“patch”和
                 “border”.而对于两个模型的预测输出,Hybrid-DeepCom 和 CodePtr 分别输出了“instantiates the nine  setting.”和
                 “instantiates a new nine patch border.”.通过参考注释,我们可以看出,两个模型都正确地判断出了源代码的意图,
                 就是实例化(“instantiates”)一个类.而对于类的名称,在两个模型都没有指针生成网络的情况下,Hybrid-
                 DeepCom 生成的注释中仅有“nine”,而 CodePtr-PGN 则生成了该类名分解后的所有单词.图 5 显示了两个模型
   233   234   235   236   237   238   239   240   241   242   243