Page 128 - 《软件学报》2026年第2期
P. 128
李重 等: 基于语义重排序的代码注释生成方法 607
除了上述形式相近且语义相似的源代码外, 现实场景中通常还存在由于不同开发人员的不同编程习惯而导致
的形式相异但语义相似的源代码, 这部分代码的注释同样有助于语义重排序模型的对比学习. 因此, 我们进一步利
用语义检索来采样这类数据. 具体来说, 首先利用 Hugging Face [25] 提供的 Flax 模型 (https://huggingface.co/flax-
sentence-embeddings/st-codesearch-distilroberta-base) 来提取代码语义特征以构建语义检索库. 该 Flax 模型在
CodeSearchNet [29] 数据集上进行了预训练, 可以有效用于代码搜索任务. 随后, 基于提取到的特征, 我们使用余弦相
似度来计算锚点样本中源代码与检索库中代码的特征间相似度实现语义检索. 选择余弦相似度而非其他向量相似
度计算方法是因为余弦相似度被证明可以更有效地度量深度神经网络模型生成的特征表示间的相似度 [30] .
最终, 合并词法检索、语义检索和随机采样得到的数据, 便可进行对比学习中正负样本对的构造. 更具体地,
对于一个锚点样本, 分别使用词法检索、语义检索和随机采样检索得到 n 1 , n 2 和 n 3 条数据. 随后, 遵循现有工作 [16,31] ,
使用 BLEU 分数 [32] 对这 n 1 +n 2 +n 3 条数据中的注释进行评估以构造正负样本, BLEU 分数反映了这些注释相较于
锚点样本中注释的精度. BLEU 分数越高意味着该注释与锚点样本中的注释更接近, 因此可以更好地反映锚点样
本中源代码的功能. 所以, 对于检索得到的 n 1 +n 2 +n 3 条数据, 如果其 BLEU 分数大于一个阈值 τ, 则将其视为锚点
样本的正例样本; 否则将其视为负例样本.
模型训练: 基于上述构造得到的正负样本对, 便可通过对比学习对 XLM-RoBERTa 模型进行微调, 从而构建
+ − + − 的集合中
语义重排序模型. 给定一个锚点样本 (c, s), 其对应的正例样本集合为 S , 负例样本集合为 S . 从 S ∪S
采样出 K 个注释用于构建锚点样本的正负样本对集合 G c . G c 由一个从 S + 中采样的正例注释和 K −1 个从 S − 中采
样的负例注释组成. 从而, 用于训练模型的对比损失函数为:
c,+
exp(dist(c, s ))
ℓ = −log (1)
K ∑
exp(dist(c, s k ))
k=1
其中, c 表示锚点样本的源代码, s c,+ 表示正例注释, s k 表示集合 G c 中的第 个注释. dist(c,·) 表示语义重排序模型
k
中源代码 c 的特征表示和 G c 中注释的特征表示之间的相似度. 从公式 (1) 可以看出, 通过对比学习训练后的语义
重排序模型将使目标源代码和其语义相关的注释具有相似的特征表示, 而语义无关的注释则具有不同的特征表
示, 从而帮助更好地对候选代码注释按其与目标源代码的语义相关度进行排序, 实现最优代码注释的选择.
2.3 基于语义重排序的代码注释生成
基于语义重排序模型, 即可对基于信息检索的代码生成方法和基于深度学习的代码生成方法所生成的代码注
释进行筛选, 从而实现对二者的集成, 提升代码注释生成的质量. 算法 1 给出了所提出的基于语义重排序的代码注
释生成方法的基本流程.
算法 1 以待生成代码注释的目标函数源代码 c 为输入, 同时考虑两种基于信息检索的代码注释生成方法:
词法检索 (LexReDatabase) 和语义检索 (SemReDatabase), 以及一种基于深度学习的代码注释生成方法 (CodeSum-
c 的代码注释 . 在算法 1 中, 首先初始化一个空的候选代码注释集合
ˆ s
Model). 算法最终输出目标函数源代码
CandidateSummaries (第 1 行); 随后, 分别使用两种基于信息检索的代码注释生成方法, 即基于 BM25 的词法检索
方法 (第 3–5 行) 和基于余弦相似度的语法检索方法 (第 6–9 行), 生成候选代码注释, 并将其添加到候选代码注释
集合 CandidateSummaries 中. 更具体地, 在 SRBCS 中, 复用语义重排序模型中的词法检索方法和语义检索方法来
检索相似代码, 并利用检索到的相似代码的注释作为目标源代码注释. 然后, 同样使用基于深度学习技术的代码注
释生成方法生成 (第 10–13 行) 候选代码注释并将其添加到候选代码注释集合 CandidateSummaries 中. 更具体地,
[33]
在 SRBCS 中我们使用 CodeT5 这一被广泛使用的代码模型来生成代码注释. 最终, 使用语义重排序模型 Reranker
对添加到候选代码注释集合 CandidateSummaries 进行排序, 从而筛选得到目标函数源代码 c 的代码注释 ˆ s. 需要特
别指出的是, 尽管在当前版本的 SRBCS 中, 主要考虑对基于 BM25 的词法检索方法、基于余弦相似度的语法检
索方法和基于 CodeT5 的代码注释生成方法进行集成. 但是, SRBCS 可以轻松地对更多代码注释生成方法进行集
成而无需额外的训练. 具体而言, 对于一种新的代码注释方法, 只需将其生成的代码注释扩充到候选代码集合
CandidateSummaries 中, 即可使用语义重排序模型对该方法生成的代码注释进行筛选, 实现对该方法的集成.

