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  种指标.
   186   187   188   189   190   191   192   193   194   195   196