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

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


                 分数和   METEOR  分数均优于所有      14  种被比较的代码注释生成方法. 此外, 我们还进一步研究了所提出的基于多
                 维度正负样本对构造方法的对比学习的有效性, 结果表明该方法可以帮助语义重排序模型更好地进行候选代码注
                 释排序.
                    综上所述, 本文的主要贡献包含以下            3  个方面.
                    (1) 提出了一种从信息检索视角出发的不同代码注释生成方法的集成策略, 为代码注释生成方法的设计提供
                 了新思路.
                    (2) 提出了一种基于语义重排序的代码注释生成方法                SRBCS. 该方法通过语义重排序模型对不同代码注释生
                 成方法所生成代码注释进行排序选择来实现代码注释生成.
                    (3) 通过大量的实验评估验证了         SRBCS  的性能. 实验评估结果表明        SRBCS  可以有效地对不同代码注释生成
                 方法进行集成, 实现了优于现有         14  种代码注释生成方法的性能.
                    本文第   1 节介绍本文工作的相关背景知识. 第           2 节介绍所提出的基于语义重排序的代码注释生成方法                  SRBCS
                 的整体架构设计. 第      3  节通过实验展示    SRBCS  的性能. 第  4  节讨论  SRBCS  框架设计与实现中的一些局限性. 第
                 5  节回顾相关工作. 第    6  节对本工作进行总结.

                  1   基础知识

                  1.1   代码注释自动生成
                    在本文中, 遵循现有工作        [16] , 我们重点关注如何为一段函数自动生成其自然语言描述的注释. 如图                   1  所示, 给
                 定一段函数代码, 我们的目标是自动生成其注释“convert an iterable stream into one last item of the stream”. 更具体
                                                                c
                                                                                                      ˆ s
                 地说, 给定一段函数源代码        c, 代码注释自动生成的任务是为   生成一段注释             ˆ s = (t 1 ,t 2 ,...,t T ), 其中  t i  表示注释   中
                 的一个字/词.

                                           // convert an iterable stream into one last item of the stream
                                           Public Optional<T> last(){
                                               Iterator<T> iterator = iterator();
                                               T value = null;
                                               While (iterator.hasNext())
                                                  value = iterator.next();
                                               return Optional.of(value);
                                           }
                                                   图 1 代码注释生成示例

                    如前所述, 现有代码注释自动生成方法大致分为基于信息检索的方法、基于深度学习的方法和基于集成的
                 方法.
                    基于信息检索的方法        [1,4−6] 旨在利用相似代码的注释来为目标函数源代码生成注释. 为此, 基于信息检索的方
                                                     N                              c i  对应的注释. 随后, 给定
                 法通常会首先构造一个代码数据集             D = {(c i , s i )} , 其中  c i  表示一段函数源代码,   s i  表示
                                                     i=1
                                                                                              c i  所对应的注
                 一段函数源代码      c, 基于信息检索的方法从       D 中检索得到一段与      c 相似的函数源代码  , 并选择使用
                                                                                  c i
                        c
                 释  s i  作为   的注释. 常见的用于度量代码间相似度的方法包括: (1) 文本相似度. 该方式简单地度量代码中词元的
                 相似度来计算代码间相似度; (2) 语义相似度. 该方式利用深度神经网络模型将函数源代码编码为特征向量并使用
                 向量间距离来计算代码间相似度.
                    基于深度学习的方法        [7−11] 将代码注释自动生成问题建模为神经机器翻译问题, 并利用深度神经网络模型来完
                                                                                           N
                 成函数源代码到注释的翻译. 具体而言, 基于深度学习的方法的目标是在代码数据集                           D = {(c i , s i )} i=1  上训练一个深
                 度神经网络模型      F. 从而, 给定一段函数源代码        c, 深度神经网络模型      F  可以直接输出其注释      ˆ s = F (c). 一般而言,
                 深度神经网络模型       F  的训练可以从零开始进行或基于预训练模型利用迁移学习进行.
                    基于集成的方法      [12−15] 则是上述两种方法的结合. 这种方法通常首先利用信息检索技术从                   D 中检索与给定函
   119   120   121   122   123   124   125   126   127   128   129