Page 289 - 《软件学报》2024年第6期
P. 289

周光有 等: 基于关系图卷积网络的代码搜索方法                                                         2865


                 到代码片段对应程序依赖图的向量嵌入表示.
                    Liu  等人  [15] 提出的  GraphSearchNet 模型是最新的基于图神经网络的代码搜索框架. GraphSearchNet 将源代码
                 和查询文本分别编码成两个图, 用双向门控图神经网络来捕捉代码片段和查询文本的局部结构信息, 并通过多头
                 注意力机制得到代码或文本的全局上下文信息. 实验结果表明                     GraphSearchNet 能够有效刻画代码片段和自然语
                 言描述的深层语义. 虽然基于图神经网络的              GraphSearchNet 模型取得了目前最好的结果, 但还存在以下不足.
                    (1) 代码片段和自然语言描述是两种截然不同模态的数据, 语法规则和语言结构的不同导致了语义映射的困
                 难, 所以细粒度匹配对跨模态数据的搜索至关重要. GraphSearchNet 虽然通过双向门控图神经网络得到了代码和
                 文本的图节点嵌入表示, 但没有对代码图和文本图的节点做任何交互匹配操作, 缺乏细粒度对齐的数据导致了他
                 们的模型精度不够高.
                    (2) 全局视角下一对图的图级交互特征可能是学习图相似性的重要补充组件. GraphSearchNet 使用多头注意
                 力机制聚合代码和文本的序列语义信息, 补充了代码图和文本图节点由于长程依赖忽视的上下文信息, 但仍然没
                 有进一步对代码和文本的全局上下文信息进行比较和匹配, 忽视全局匹配的模型可能会因为丢失图级交互特征不
                 能捕捉到代码和文本的全局关系.
                    为了解决上述不足, 本文提出了基于关系图卷积网络的代码搜索方法                       GraphCS  模型. 首先构建了代码图和文
                 本图, 并使用关系图卷积网络学习代码图和文本图的节点嵌入. 不同于                      GraphSearchNet 在得到节点嵌入后就直接
                 进行相似度度量, GraphCS    基于提出的多视角匹配函数, 对代码图和文本图的所有节点对进行跨图匹配对齐, 基于
                 匹配后的特征更新节点嵌入表示, 其优点就是我们的模型能够捕捉到代码和文本的细粒度匹配关系, 有效解决了
                 GraphSearchNet 缺乏交互操作的第     1  个不足. 另外, 模型利用神经张量网络对代码图和文本图在多个维度上进行
                 交互匹配, 能够捕捉到代码和文本的全局关系, 有效解决了                  GraphSearchNet 忽略全局匹配关系的第       2  个不足. 在
                 公开数据集    FB-Java 和  CSN-Python 上进行实验, 与两个先进的基线模型       DeepCS  和  GraphSearchNet 相比, GraphCS
                 在通用的搜索指标       SuccessRate@1/5/10 以及  MRR 上均有较大的提升.

                  1   问题定义                           M  和

                    本文的研究目标面向自然语言输入的代码搜索, 是用文本搜索得到相应代码片段的过程. 本文从图数据可以
                 有效表征结构信息的角度来定义代码搜索任务. 给定一个源代码语料库                        P , 共有  |P| 个代码片段, 代码搜索的目标
                 是根据查询文本      q 从语料库中找到最匹配的代码片段            ˆ p . 定义代码搜索任务的表述如下:
                                                                        (    )
                                            ˆ p = argmax score(q, p) = argmax score G q ,G p          (1)
                                                p∈P             p∈P
                    这个代码搜索任务的核心是计算代码片段                p 和查询文本   q 之间的相似度分数       score(p,q) . 由于代码和文本都
                 可以基于提出的图构建方法表示成图结构, 我们进一步将                   score(p,q) 转化为   score(G p ,G q ) . 其中  G p  、  G q  分别是代
                 码和文本的图表示. 在本文中,         G p  和  G q  都表示为有向和有标记的多关系图, 不同的边类型由有标记的边表示. 具
                 体来说, 文本图    G q  表示为  (V q ,E q ,R q ) , 节点   q i ∈ V q  、边   (q i ,r,q j ) ∈ E q  , 其中  r ∈ R q  表示边的类型. 类似地, 代码图表
                 示  G q  为   (V q ,E q ,R q ) G q  和  G q  的节点数分别为   N  . 为了描述方便, 在表  1  中给出了本文所用到的主要符号及
                                 ,
                 其表示的含义.
                  2   GraphCS  模型介绍

                    本节详细介绍我们提出的方法, 具体来说, 基于关系图卷积网络的                    GraphCS  模型由  3  个关键阶段组成.
                    • 首先为图构建和图嵌入阶段, 将查询语句基于选区解析树表示成文本图, 将代码片段基于增强关系表示的抽
                 象语法树表示为代码图. 然后利用关系图卷积网络对代码图和文本图编码, 得到它们的初始节点嵌入表示.
                    • 核心阶段为语义匹配阶段, 语义匹配模块分为节点层面的匹配策略和图层面的匹配策略. 节点层面的匹配策
                 略基于多视角匹配函数, 对文本图和代码图的所有节点进行跨图匹配操作以进行信息交互, 更新后的节点嵌入具
   284   285   286   287   288   289   290   291   292   293   294