Page 130 - 《软件学报》2025年第9期
P. 130
谢生龙 等: 基于多模态融合的软件缺陷协同分派方法 4041
{
t ij = 1, if b i is assigned to d j (3)
0, if b i is not assigned to d j
因此, 本文所述的 bug 分派任务是确定 bug b i 和开发人员 d j 之间的相关性 . 若分派预测结果 t ij = 1, 则表示
t ij
将 bug b i 分派给开发人员 ; 否则, 不予分派.
d j
2.2 向量初始化
bug 报告文本通常由图 1 所示的相关字段组成. 在 bug 报告提交时, bug 跟踪系统会要求填写一个表单以说明
与该 bug 有关的信息. bug 被分派后, 开发人员会根据表单中的信息去解决该 bug. 此类表单一般包含对 bug 观察
到的摘要、详细描述、bug 报告或修改的时间戳, 有时还包括 bug 执行的堆栈等信息. 因此, bug 报告文本数据的
规模较大, 可能会给预测模型带来噪声和维度灾难. 根据相关研究的建议 [46] , 本文先对 bug 报告文本做两个方面
必要的预处理.
一方面, 首先将 bug 摘要和描述字段合并为一个文档, 作为新的 bug 报告文本; 其次, 通过删除十六进制代码
和出现频率高但对预测模型毫无意义的停用词噪声文本, 例如, 删掉“the”“in”“that”等; 并使用自然语言工具包
(NLTK) 对摘要和描述信息进行标点符号过滤, 例如, 将 Client_Conect_Server_Failure, 转换为 ClientConect-
ServerFailure; 再根据 CamelCase 命名约定将其拆分为单个词, 例如, 将 ClientConectServerFailure 拆分为 Client、
Conect、Server 和 Failure; 最后, 将所有文本都转换为小写. 另一方面, 从 bug 报告中提取开发人员的邮箱、性别、
年龄及学历等字段信息, 并采用与 bug 报告类似的处理过程进行预处理. 例如, 邮箱地址 RonaldReagan890721@
gmail.com, 经过预处理后得到了 ronald、reagan890721、gmail 及 com 等去噪后的开发者 ID 信息.
按照上述预处理过程得到的词规模仍然较大, 这会导致词向量矩阵的维数很高. 接下来, 采用 Word2Vec 方
法 [47] 在维基百科语料库上预先训练的 Skip gram 模型 [48] 来获取词向量. 对于语料库中不存在的词, 采用随机化的
方法进行初始化. 最终对于每个 bug b i 都会提取一个 w 维语义向量 p . 本文参考文献 [49], 将 w 设置为 5. 同样, 对
0
b i
于开发人员向量, 用表示其 ID 的 E-mail 将其初始化为一个单向量 q . 如果还获取到了开发者性别、年龄、专业、
0
d j
学历及偏好等其他开发人员属性, 则根据需要, 也可以将这些属性按照同样的方式进行编码后连接在一起.
这种初始化方式虽然简单, 但可以从特定项目和维基百科语料库中补充与 bug 分派具有相关性的词向量, 有
助于在后续的模型学习中获取与开发人员编程能力等有关的特征表示. 举一个简单的例子, 对于 Google Chromium
bug 1485528 报告 (https://bugs.chromium.org/p/chromium/issues/detail?id=1485528) 的摘要“gclient installhooks did
not proceed automatically”, 若将 Word2Vec 维度设置为 5 时, 其被转换后最终可获得如下所示的语义向量:
gclient −0.018 928 03 0.115 371 47 −0.150 432 75
[−0.068 107 32 −0.078 722 07]
[0.146 235 32
installhooks 0.101 405 24 0.135 153 86 0.015 257 31 0.127 017 81]
did [−0.036 320 35 0.057 531 6 0.019 837 47 −0.165 704 3
−0.188 976 36]
=
not [0.147 610 1 −0.030 669 43 −0.090 732 26 0.131 081 03
−0.097 203 21]
proceed [−0.142 336 17 0.129 177 45 0.179 459 77 −0.100 308 56
−0.075 267 43]
automatically [−0.010 724 54 0.004 728 63 0.102 066 99 0.180 185 47 −0.186 059]
6×5
3 CBT-MF 方法设计
如前文图 2 所示, 本文提出的 CBT-MF 方法核心包含了 4 个模块: 数据预处理、数据增强、协同分派建模及
协同分派推荐. 其中, 每一个模块对应一个关键步骤, 接下来将对其进行逐一介绍.
3.1 数据预处理
CBT-MF 使用了 bug 报告的文本模态数据和 bug 跟踪系统中已修复记录所构造的 bug-开发人员二部图模态
数据. 首先, 将全部的 bug 报告文本经过第 2.2 节描述的过程进行预处理并完成初始化, 最终转换为矩阵向量, 从
而形成 bug 报告文本模态的数据表示; 然后, 根据 bug 跟踪系统中的修复记录, 将所有 bug 作为一个节点集 B, 所
有开发人员作为另一个节点集 D, 并将每个 bug 节点 b i 与相关开发人员节点 d i 连接后形成代表修复关系的边 e ij ,
e ij 基于式 (3) 的 t ij 表示了该 bug 与这些开发人员的相关性. 此时, 可以初步构建一个表达 bug 和开发人员信息及

