Page 125 - 《软件学报》2026年第2期
P. 125
604 软件学报 2026 年第 37 卷第 2 期
c
数源代码 c 相似的函数源代码 c i 及其注释 ; 随后, 其将 和 (c i , s i ) 共同作为深度神经网络模型 F 的输入来生成 c
s i
ˆ s = F (c,(c i , s i )).
的注释
尽管上述方法取得了一定效果, 但目前尚缺乏一种通用且有效的代码注释自动生成方法. 具体而言, 基于信息
检索的方法和基于深度学习的方法各有优劣, 二者均有各自擅长处理的代码情况 [16] . 虽然基于集成的方法对基于
信息检索的方法和基于深度学习的方法进行了集成, 但是现有基于集成的方法仍主要依赖于深度神经网络模型来
进行代码注释生成 [12−15] , 这极大地限制了信息检索技术所能发挥的作用. 同时, 为了利用信息检索得到的内容, 现
有基于集成的方法还需对深度神经网络模型的结构和训练方式进行设计 [12−15] , 这同样限制了现有基于集成的方法
的泛化性. 鉴于此, 本文的目标是探索一种全新的集成方法, 以最大化利用信息检索技术和深度学习技术在代码注
释生成任务上的优势, 实现更高质量的代码注释自动生成.
1.2 重排序
重排序是信息检索系统中的一个重要步骤, 它发挥着优化检索结果的关键作用 [18] . 重排序一般发生在检索流
程的最后阶段. 在进行重排序之前, 检索系统往往会首先进行一次前置检索来从数据库中提取一组初步的候选文
档. 随后, 重排序计算这组候选文档与查询的语义匹配度, 并根据语义匹配度对候选文档进行优化排序, 从而提升
信息检索的精度和用户满意度. 从上述重排序的工作流程可以看出, 重排序非常适合用于合并和排序来自不同检
索系统的结果. 受此启发, 本文尝试利用重排序技术来对基于信息检索的代码注释生成方法和基于深度学习的代
码注释生成方法进行集成. 通过将这两种方法视为前置检索过程 (即, 分别独立地使用这两种方法生成代码注释),
我们可以使得这两种方法在代码注释生成过程中互不干扰, 从而实现对这两种方法优势的最大化利用. 同时, 通过
对这两种方法所生成的代码注释进行重排序, 我们可以从中选择出最优代码注释, 从而为目标函数源代码提供高
质量注释.
2 基于语义重排序的代码注释生成方法 SRBCS
2.1 方法概览
设计理念: 如第 1.1 节中所述, 基于信息检索的代码注释生成方法和基于深度学习的代码注释生成方法擅长
应对不同类型源代码的注释生成. 因此, 如果能够集成这两种方法的能力, 那么我们可以实现更高质量的代码注释
生成. 现有基于集成的代码注释生成方法主要从深度学习的视角出发对基于信息检索的方法和基于深度学习的方
法进行集成, 使得现有基于集成的方法仍主要依赖于深度神经网络模型进行代码注释生成, 无法充分发挥信息检
索技术的能力. 为了更有效地集成信息检索技术和深度学习技术, 实现高质量的代码注释自动生成, 我们提出从信
息检索的角度对基于信息检索的代码注释生成方法和基于深度学习的代码注释生成方法进行集成. 具体而言, 我
们将基于信息检索的方法和基于深度学习的方法视为检索系统中的前置检索过程, 分别利用这两种方法生成一组
候选代码注释. 然后, 通过度量候选代码注释和目标源代码的语义相关度, 利用语义重排序模型对候选代码注释进
行优化排序, 从而选择出最佳代码注释作为目标源代码的注释. 相较于现有利用信息检索增强深度神经网络模型
输入的集成方式, 所提出的方法分别利用信息检索技术和深度学习技术进行代码注释生成, 避免了这两种技术的
优势被相互抑制, 从而可以在代码注释生成过程中更好地发挥这两种技术的优势. 此外, 由于仅需对不同方法所生
成的代码注释进行重排序, 本文方法可以快捷地对多种不同方法进行集成而无需在集成新方法时重新设计和训练
模型. 这也避免了现有基于集成的方法存在的额外训练开销、可扩展性差等问题.
对于语义重排序模型的构建, 我们利用对比学习来训练语义重排序模型. 语义重排序模型旨在区分与目标源
代码语义相关的注释和语义无关的注释, 以有效衡量候选代码注释与目标源代码的语义相关性, 并对其进行排序.
对比学习的目标是学习一个特征表示空间, 在该空间中, 同类型数据具有相似的特征表示, 而不同类型数据的特征
表示尽可能不同 [19] . 这一目标与语义重排序模型的目标一致. 因此, 可以通过对比学习对语义重排序模型进行训
练, 使目标源代码和其语义相关的注释具有相似特征表示, 而语义无关的注释则具有不同的特征表示, 从而实现对
语义相关和语义无关注释的区分.

