Page 134 - 《软件学报》2025年第9期
P. 134
谢生龙 等: 基于多模态融合的软件缺陷协同分派方法 4045
通常活跃的开发者贡献了多数修复记录; 反之, 不活跃的开发者修复记录则很少. 开发者和修复记录数据的这
种不均衡性是数据集存在 bug 数据帕累托现象的一个直接原因. 因此, 实验分别采用 3 个数据集中记录数与 bug
和开发者数量乘积的比率所表示的密度, 即 密度 = # of records/(# of bugs∗# of Developers), 来反映其 bug 修复记
录的不均衡性. 最终, 3 个数据集的密度均在 0.02%–0.07% 之间, 且密度越小表示数据不均衡性越强.
本文选择推荐问题研究时广泛采用的 Recall@K 和 Hit@K 作为性能评价的指标, 具体计算如公式 (15) 和公
式 (16) 所示, 且 K 被设置为 5, 10, ..., 25 共 5 种情况.
Recall@K = (# of top K assignments that are relevant)/(# of all relevant bugs) (15)
其中, # of top K assignments that are relevant 表示前 K 个分派的结果与实际分派给相应开发者的 bug 相关的 bug
数量, 这里的“相关”通常指的是正确分派的 bug. # of all relevant bugs 表示实际上应该被分派给相应开发者的 bug
的总数. Recall@K 表示在前 K 个分派结果中, 有多少比例的 bug 被正确地分派给了相应的开发者. 通常, Recall@K
值在 0–1 之间, 越接近 1 表示方法在前 K 个分派结果中更好地覆盖了实际应该分派给相应开发者的 bug.
1 |B| ∑
Hit@K = 1 R(b i )⩽K (16)
|B|
i=1
其中, |B| 表示 bug 集合的大小, b i 表示第 个 i bug, R(b i ) 表示 bug b i 的推荐排名, 1 R(b i )⩽K 为指标函数, 当 R(b i ) ⩽ K 时,
1 R(b i )⩽K = 1, 表示 b i 在分派的前 K 个推荐中; 否则为 0, 即表示 b i 不在分派的前 K 个推荐中. 因此, Hit@K 表示在前
K 个推荐中, 有多少比例的相关 bug 被成功地包含在内. 很显然, Hit@K 值也在 0–1 之间, 越接近 1 表示模型在前
K 个分派推荐中更好地命中了与开发人员相关的 bug.
4.2 比较基线
为了从多角度分析 CBT-MF 的性能, 本文选取了基于 bug 报告文本模态分类、相关性匹配及 CF 推荐 3 个类
别, 共计 8 个较为先进的方法作为基线进行对比, 具体方法详见表 2.
表 2 基线方法
类别 方法
[5]
文本模态bug分类 CBR 、DBRNN-A [16]
相关性匹配 GRCNN [22] 、BERT [23]
基于CF推荐 LightGCN [29] 、NCF [30] 、CBCF [31] 、 SGL [40]
在表 2 仅采用 bug 报告单一模态类方法中, CBR 将 bug 文本转换为向量, 并使用一种半自动化的方法学习每
个开发人员解决的报告类型, 并将新记录的 bug 报告分派给合适的开发人员; DBRNN-A 提出了一种深度双向递
归神经网络, 其以无监督的方式从 bug 报告长单词序列中学习语法和语义特征. 在相关性匹配类方法中, GRCNN
以不同的时间周期学习开发人员在协作网络上节点的时空特征, 以得到 bug-开发人员相关性的表示; BERT 通过
调节所有层的左右上下文, 从未标记的数据中预训练深度双向表示, 帮助计算一个给定的 bug 和开发人员已修复
bug 之间的相关性; 在 CF 类方法中, NCF 可以使用一个神经网络模块, 比如多层感知神经网络, 来拟合相关匹配
函数; CBCF 采用内容增强的协同过滤, 将 CBR 和 CF 推荐器相结合, 提高了推荐质量; LightGCN 提出了一种
GCF 方法, 能够有效地聚合线性邻域; SGL 将结构性对比学习与 LightGCN 集成, 使 LightGCN 的性能得到了进一
步改进.
4.3 实验方案
实验利用 GC、MC 及 MF 数据集对选择的基线方法进行了复现, 并且为了不失公允性, 实验对所有比较的基
线方法模型参数都进行了一定程度的优化. 同时, 为了尽可能消除因优化方式差异而对比较方法产生性能影响, 所
有训练的模型均采用 Adam 优化器, 训练批大小设置为 8 192, 且采用默认的 Xavier 分布进行网络参数初始化, 向
量大小均为 64, 采用 10 步提前停止的策略以防止过拟合. 对于 CBT-MF, 默认图卷积层为 2 层, 采样尺度 s 设置
为 5. 此外, 为了在保持足够聚类细致度的同时, 避免设置过大的质心数及确保在整个方法中 bug 和开发者在聚类

