Page 211 - 《软件学报》2026年第5期
P. 211
2090 软件学报 2026 年第 37 卷第 5 期
语法树的差异类型节点. 通过分析变更语法树的变更节点, 突出显示细粒度代码变更的差异, 使得模型可以学习
AST ol 到 d AST ne 的转换过程, 从而学习 AST ol 和 d AST ne 之间的差异. 通过为原始代码节点添加编辑标签, 将编辑
w
w
信息融入抽象语法树中, 得到带有编辑信息的抽象语法树, 其本质上是一组带有每个代码变更块基本语义和编辑
信息的有向无环图 [26] .
为了将上述有向无环图作为图 Transformer 的输入, 我们定义有向无环图 G = (V,E,X), 其中节点集为 V, 图中
的每个节点 v i ∈ V 有 value 和 flag 两个属性, value 属性表示节点 v i 的语义信息, flag 属性标明节点 v i 的编辑类型
,
信息. E 为有向边集合. X v ∈ R N×d 表示代码图节点 v 的初始节点特征向量, 特征维数为 N×d X e ∈ R N×d 表示节点编
辑标签的初始嵌入向量, 特征维数为 N×d. 编辑标签仅在训练局部变更节点特征时使用. 由于深度编码存在于每个
节点中, 我们只需将其做点积并将输出添加到节点特征中. 定义节点 v 的初始化向量表示为:
e
(0)
d
x
h = [h |h |h ] (5)
v v v v
其中, 上标为 x、d、e 的 h 向量分别表示节点 v 的初始 token 嵌入、节点的深度嵌入、节点的编辑类型嵌入. h (0)
v
由 3 个嵌入拼接获得. 将初始嵌入输入图 Transformer 模型中, 经过训练, 得到局部变更节点的特征向量表示:
(0)
h v = GF(h ) (6)
v
同时, 对于图表示任务, READOUT 函数旨在将最终迭代的节点特征聚合到整个图 G 的表示中, 获得变更代码
块的整体嵌入 H ol 和 d H new :
({ })
(L)
H old ,H new = READOUT h |v i ∈ G (7)
i
READOUT 函数为平均池化操作. 其次, 错误报告由自然语言描述组成, 在处理给定的错误报告时, 将问题的
描述分解为 L 个单词. 这些单词随后被输入到图 Transformer 网络中. 可以将第 t 个单词的特征向量 q t 表示为:
q t = GF(X t ) (8)
同样的, 使用 READOUT 函数获得错误报告的整体嵌入 Q g .
2.2 相似度计算
在得到变更和错误报告的整体和局部特征表示后, 本文采用多维度向量相似度方法, 通过在多个维度上描述
d y ∈ R , 它们之间的相
d
和比较对象特性, 能够更全面地捕捉代码与文本间的复杂关系. 我们定义两个向量 x ∈ R 和
似度函数定义为:
2
W|x−y|
f sim (x,y,W) = (9)
2
||W|x−y| || 2
2
其中, |·| 表示元素级方差, ||·|| 2 表示 L2 正则化手段, W ∈ R m×d 是 m 维相似向量的可学习参数矩阵.
2.2.1 全局相似度表示
在全局相似度表示中, 使用全局特征 H old , H ne 和 w Q g 依据公式 (8) 相似性计算函数计算代码片段和错误报告
的全局相似度表示:
g g
S = f sim (H old ,Q g ,W )
old old (10)
S = f sim (H new ,Q g ,W )
g g
new new
g
其中, W g ∈ R m×d 、 W new ∈ R m×d 旨在学习全局相似性表示.
old
2.2.2 局部相似度表示
在局部相似度表示中, 本文关注匹配的细节. 具体而言, 精准匹配的内容对于定位代码中的错误部分具有极高
的价值, 因为这些匹配部分往往直接关联代码中的潜在问题. 相反, 不匹配的内容则可能意味着该部分的代码变更
与代码错误之间的关联性较弱, 甚至完全无关. 值得注意的是, 我们并不主张简单地弱化或忽略这些不匹配的更改
部分, 而是应该正视其可能存在的负面作用 [27] . 具体而言, 首先计算出所有代码节点和错误词语的语义相关性分
数矩阵 S i,t :
T
h q t
S i,t = i , i ∈ [1,n],t ∈ [1,L] (11)
T
|h i ||q t |

