Page 210 - 《软件学报》2026年第5期
P. 210
刘浩 等: 基于图 Transformer 的变更集错误定位方法 2089
节点可以根据图结构信息自适应地关注所有其他节点. 然后, 将初始化向量输入图 Transformer, 并按照以下的方
式进行注意力头 head 和隐藏状态 h 的学习:
(t)
h
h = FFN(concat(head 1 ,...,head i )W )
(4)
(t−1) Q (t−1) K (t−1) V
head a = attention(h W ,h W ,h W )
a a a
其中, FFN 为前馈神经网络, a 为注意力头的数目, W 、 W 、 W a V 是模型中可学习的权重矩阵. 为简化表述, 公式 (4)
K
Q
a
a
省略了残差连接, 退出策略和归一化策略. 本文使用图 Transformer 对错误报告和代码变更块进行全局和局部的特
征表示.
2 基于图 Transformer 的变更集错误定位方法 GTCL
在本节中, 我们详细阐述提出的基于图 Transformer 的代码变更-错误报告定位模型 GTCL. 模型的整体架构
如图 4 所示. 总体而言, 本模型分为 3 个模块: (1) 基于变更的语法树构建模块, 为历史提交中的变更块构建基于变
更的抽象语法树, 记录代码变更前后的信息并标注变更内容. (2) 图 Transformer 模块, 在这一模块中, 我们从局部
和全局两个角度分别提取错误报告与变更集的信息, 并使用图 Transformer 学习其嵌入表示. (3) 错误定位模块, 它
分别计算错误报告与变更集之间的局部和全局相似度, 并使用注意力机制调节全局和局部的相似度贡献程度, 用
以判断错误报告和变更集的相关性.
(1) 基于变更的语法树构建模块 (2) 图 Transformer 模块 (3) 错误定位模块
变更节点表示
局部信息 …
…
… …
∑
… 局部相似度计算 全连接层 损失
图 Transformer 注意力
缺陷报告 分词 缺陷报告的分词表示 … …
变更前抽象语法树 错误报告的 全局相似度 … …
全局表示
计算
前后抽象语
法树的全局 相关排序
表示
前 后 新的缺陷 变更集 历史
历史提交 变更集 变更后抽象语法树 全局信息 报告 提交
图 4 模型结构图
2.1 全局和局部特征表示
首先, 针对给定代码变更块进行解析并构建其变更前后的抽象语法树. 具体来说, 对于一个代码变更块, 获得
其变更代码 (code old , code new ), 然后获得这对变更代码的抽象语法树. 将更改之前的代码表示成 AST old , 更改之后的
代码表示成 AST new , 并使用抽象语法树工具 GumTree [18,19] 计算更改前后语法树节点的变化以识别两棵树之间的
差异. 具体的, 我们比较了单个代码变更块提交之前和之后的 AST 树中的变更节点, 将这些变更节点分为 4 种类
型 [20−25] , 分别如下.
d
w
• V add . 如果代码节点 v 存在于 AST ne 中但不存在于 AST ol 中, 则 v 是新增的节点, 为其添加编辑标签 add.
d
w
• V del . 如果代码节点 v 存在于 AST ol 中但不存在于 AST ne 中, 则 v 是删除的节点, 为其添加编辑标签 del.
w
• V move . 如果代码节点 同时存在于 AST ol 和 d AST ne 中, 并且其位置和子树的位置发生了变化, 则 v 是移动的
v
节点, 在 AST ne 中为其和其子树添加编辑标签 move.
w
V update . 如果代码节点 同时存在于 AST ol 和 d w v 是更新的节点, 在 AST ne 中
w
v
• AST ne 中, 并且其值发生更新, 则
为其添加编辑标签 update.
v 同时存在于 AST ne 和 AST ol 中, 并且其值和位置都保持不变, 为其添加标签 match. 本研究认
d
w
如果代码节点
为全局信息足以表达未更改信息. 为了模型能够理解这两个版本之间的差异, 并学习代码的变更信息, 仅保留变更

