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
                    如果代码节点
                 为全局信息足以表达未更改信息. 为了模型能够理解这两个版本之间的差异, 并学习代码的变更信息, 仅保留变更
   205   206   207   208   209   210   211   212   213   214   215