Page 191 - 《软件学报》2026年第2期
P. 191
670 软件学报 2026 年第 37 卷第 2 期
RQ1: 与一些最先进的 baseline 方法相比, DHCS 是否能提高代码注释的性能?
RQ2: 与直接解码方法相比, 主题感知复制机制对模型性能的影响如何?
RQ3: 与非自监督训练方法相比, 掩码子函数预测任务对模型性能的影响如何?
RQ4: 与最先进的基准方法相比, DHCS 的分层结构是否增加了计算复杂性?
本文提出 RQ1, 以评估所提出的 DHCS 模型在包含子函数调用的情况下, 是否优于其他最先进的 baseline 方
法. 本文提出 RQ2 和 RQ3, 以评估 DHCS 模型中的每个组件. 同时还提出 RQ4, 以评估 DHCS 提出的分层结构是
否增加了计算复杂性.
5.2 数据集
[8]
常用于代码生成注释任务的数据集主要包含 Nematus [56] 、Funcom 和 CodeSearchNet [57] , 它们包含 6 种编程
语言 (Python、Java、JavaScript、Ruby、Go 和 PHP). 然而, 这些数据集中的目标函数被视为独立函数, 因此无法
支持本文的研究问题.
为了解决代码生成注释中上下文依赖的问题, 本文引入了 3 个新的数据集, 分别针对 Python、Java 和 Go 语
言. 具体来说, 在 CodeSearchNet 数据集中, 本文发现每个样本包含一个目标函数及其对应的注释, 并且在目标函
数的函数体内, 往往会出现一个或多个子函数调用. 因此, 本文通过 CodeSearchNet 中提供的 url 信息, 收集和抓取
了这些被调用的子函数. 在收集过程中, 选择保留包含一个或多个子函数调用的样本, 并过滤掉那些没有此类依赖
关系的样本. 值得注意的是, 本文重点收集了 Python、Java 和 Go 语言的子函数数据, 因为这 3 种语言是目前最常
用且最具代表性的编程语言. 本研究计划在未来的研究中继续对其他 3 种语言的数据集进行构建.
本文构建的 3 个新数据集分别包含了 Python、Java 和 Go 语言的 43 484、34 670 和 52 922 个样本. 本文将
Python 数据集分为 38 175 个训练集、2 441 个验证集和 2 868 个测试集; Java 数据集分为 29 670 个训练集、2 500
个验证集和 2 500 个测试集; Go 数据集分为 47 558 个训练集、2 332 个验证集和 3 032 个测试集.
在表 1 中, 本文展示了数据集的关键信息统计, 包括目标函数中的平均代码 token 数、子函数中的平均代码
token 数, 以及目标函数中平均的子函数调用次数. 值得注意的是, 本文的数据集每个样本中包含至少一个子函数
的调用.
表 1 数据集的关键信息统计
编程语言 数据集 样例数量 子函数平均数 目标函数的平均token数 子函数的平均token数
训练集 38 175 1.44 134.8 148.1
Python 验证集 2 441 1.40 134.9 153.3
测试集 2 868 1.49 132.9 152.7
训练集 29 670 1.36 131.0 138.7
Java 验证集 2 500 1.56 151.9 151.9
测试集 2 500 1.43 132.1 140.0
训练集 47 558 1.64 137.5 100.8
Go 验证集 2 332 1.76 120.5 94.4
测试集 3 032 1.69 131.7 104.1
此外, 本文提供了基于子函数数量的样本分布的深入分析. 如后文图 3 所示, 外圈为训练集, 中圈为验证集, 内
圈为测试集. 可以观察到, Python 语言中包含多个子函数的样本占比为 27.8%、25.7% 和 30.3% (训练集、验证集
和测试集), 而 Java 语言和 Go 语言的比例则分别为 23.4%、36.7%、26.4% 和 35.0%、37.1%、38.6%.
5.3 评估指标
5.3.1 自动评估指标
在评估代码注释生成模型时, 本文采用了 3 种广泛认可的评估指标: BLEU [58] 、METEOR [59] 和 ROUGE-L [60] . 为
了计算每个指标在测试集上的得分, 计算了所有生成注释的平均得分. 需要注意的是, 这些指标的得分越高, 表示
模型的表现越好. 接下来, 将详细介绍这 3 种指标.

