Page 126 - 《软件学报》2026年第2期
P. 126

李重 等: 基于语义重排序的代码注释生成方法                                                           605


                    SRBCS  工作流程概览: 图      2  展示了所提出的代码注释生成方法            SRBCS  的工作流程. 从图     2  中可以看出,
                 SRBCS  包含两个阶段: 候选代码注释生成和代码注释重排序. 给定一个目标函数源代码                       c, 在候选代码注释生成阶
                 段, SRBCS  首先分别使用基于信息检索的代码注释生成方法和基于深度学习的代码注释生成方法生成一组候选
                                              M  表示所考虑的代码注释生成方法的数量. 在随后的代码注释重排序阶段,
                 代码注释集合
                            ˆ S = {ˆs 1 , ˆs 2 ,..., ˆs M }, 其中
                 SRBCS  利用语义重排序模型, 根据候选代码注释和目标函数源代码                   c 之间的语义相关度, 对候选注释集合          ˆ S  中的
                                                   ˆ s i  作为目标函数源代码   的注释.
                                                                    c
                 候选注释进行排序, 并从中选择出最优注释

                                  阶段1: 候选代码注释生成                             阶段2: 代码注释重排序
                         目标函数源代码 c                                                     目标函数源代码注释 s i ̂
                     // Golden: computes the length of a vector
                                                                                       computes the length of
                     public static double length (double x, double y, double z){       a vector
                      return Math.sqrt(x*x +y*y + z*z);
                     }
                                                                               排序后代码注释集合 S ̂
                          基于信息检索的代码注释生成                                                computes the length of
                                                  候选代码注释集合 S ̂                         a vector
                                            ...
                        方法1         方法2                                                computes the euclidean
                                                 compute a magnitude                   length of a vector
                                                 of an x, y, z value
                     compute a magnitude  computes the euclidean      语义重排序模型           computes the Euclidean
                     of an x, y, z value  length of the arbitrary  ...  computes the Euclidean  length of the arbitrary
                                 vector components  length of the arbitrary
                                 passed in       vector components                      vector components
                                                                                        passed in
                                                 passed in
                          基于深度学习的代码注释生成                                                compute a magnitude
                                                 computes the euclidean                of an x, y, z value
                                            ...  length of a vector
                        方法3          方法4
                                                 computes the length of
                                                 a vector
                     computes the euclidean  computes the length of  ...          对比学习
                     length of a vector  a vector
                                                                                                基础模型
                                                                       训练后模型
                                                                                基于多维度采样的
                                                                                 训练数据构造
                                                                                                训练数据集
                                                                                 语义重排序模型构建
                                                  图 2 SRBCS  工作流程概览

                  2.2   语义重排序模型
                    概览: 图  2  中展示了语义重排序模型的构建流程. 语义重排序模型的目标是对基于信息检索的方法和基于深
                 度学习的方法所生成的候选代码注释进行排序, 以从中选择目标函数源代码的最优注释. 为了实现这一目标, 我们
                 利用对比学习对语义重排序模型进行训练, 使得模型可以有效区分与目标源代码语义相关的注释和语义无关的注
                 释. 具体而言, 使用对比学习进行语义重排序模型训练主要需要考虑以下                       3  个方面的关键设计: (1) 语义重排序模
                 型结构设计. 因为模型结构直接决定了模型的学习能力和表征能力                      [20] , 所以选择合适的模型结构可以保障模型更
                 好地学习、表征函数源代码和代码注释; (2) 对比学习训练数据构造. 对比学习主要通过正负样本对来对模型进行
                 训练以使得模型可以学习得到如何正确区分正负样本                   [19] . 因此, 对比学习过程中所使用的正负样本对对于最终的
                 模型性能起着至关重要的作用; (3) 模型训练. 在完成模型结构设计和训练数据构造之后, 我们便需要对语义重排
                 序模型进行训练, 以得到可以支撑候选代码注释重排序的模型. 下面将对上述                        3  个关键设计进行详细介绍和讨论.
                    模型结构设计: 对于语义重排序模型的结构, 我们选择使用                   XLM-RoBERTa 序列分类模型结构       [21] . 函数源代
                 码具有严格语法结构的同时存在着许多的代码特定字词                    (如关键字等), 而代码注释则是约束相对较松的自然语言
                 描述. 因此, 需要对函数源代码和代码注释进行独立处理, 这促使我们使用跨语言模型来学习、表征源代码和代码
                 注释. 而  XLM-RoBERTa  在众多跨语言迁移任务中展现出了出色的性能                 [22] , 所以在  SRBCS  中选择使用  XLM-
                 RoBERTa 来构建语义重排序模型. 此外, 遵循近年来预训练-微调的深度神经网络模型训练范式, 我们选择在经过
                 预训练的    XLM-RoBERTa 模型基础上来构建语义重排序模型而非直接从零开始训练模型. 相较于从零开始的模
                 型训练, 经过预训练的模型已经学习了大量代码和自然语言文本                     [23,24] , 这可以帮助语义重排序模型更好地理解源
                 代码和代码注释, 从而更高效地进行模型训练. 更具体地, 我们选择在                    Hugging Face [25] 提供的  BAAI/base-reranker-
   121   122   123   124   125   126   127   128   129   130   131