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 |
   206   207   208   209   210   211   212   213   214   215   216