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

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


                    (2) Facebook  团队提出的  UNIF [31] 通过词嵌入技术  fastText 嵌入代码和文本, UNIF  使用可学习的嵌入来映射
                 代码和查询, 为了生成它们的表示, 代码片段的所有令牌嵌入都通过注意力加权聚合, 余弦距离用作相似度度量.
                 将其作为基线模型进行实验时, 设置词嵌入的维度为                 100.
                    (3) DeepCS 从 [8]  3  个方面挖掘代码的语义信息: 方法名、代码中包含的           token、API 调用序列. 然后作者使用
                 LSTM  或  MLP  对  3  种不同的序列编码后融合, 对文本查询使用         RNN  嵌入. 由于他们对     API 调用序列的提取方法
                 是基于   Java 语言特有的启发式方法, 对其他编程语言不起作用. 因此在实验中只使用方法名和代码标记作为源代
                 码的语义特征.
                    (4) GraphSearchNet [15] 用双向门控图神经网络  (BiGGNN) 训练了两个独立的程序编码器和查询编码器, 并通过
                 多头注意力机制补充代码和文本的全局依赖信息. 作者将图的节点个数限制在                          200  个, 而本文将图的节点个数限
                 制在  300  个, 实验仍然遵循作者的原始设置.
                  3.5   与基线模型的对比

                  3.5.1    在测试集上的实验
                    为了证明我们提出的方法的有效性, 本节通过比较在                  FB-Java 数据集和  CSN-Python  数据集上的平均倒数排
                 名  MRR  和在  k 处的成功率  S@k 来定量评估模型. 表      4  和表  5  给出了与  7  种基线方法在两个公开数据集上的实验
                 数据对比. 黑体的数据表示最好的结果, 带有下划线的数据表示次好的结果. 最后两行                           GraphCS (margin loss) 和
                 GraphCS (circle loss) 表示将损失函数分别设置为    margin loss 和  circle loss [32] 的实验结果.

                     表 4    在  FB-Java 数据集上的实验结果 (%)             表 5    在  CSN-Python  数据集上的实验结果 (%)

                       Model        MRR   S@1   S@5  S@10            Model       MRR   S@1   S@5   S@10
                       NBoW         77.7  71.3  85.3  88.5           NBoW        66.0  56.2  78.3  83.2
                       BiRNN        71.7  63.0  83.2  88.6          BiRNN        62.7  52.8  73.1  81.6
                       1D-CNN       22.6  12.3  32.7  45.7          1D-CNN       18.4  10.5  25.1  33.6
                     Self-attention  65.3  54.4  79.1  84.2       Self-Attention  63.9  54.5  75.3  82.1
                        UNIF        84.8  78.1  92.5  95.7           UNIF        70.1  59.7  83.8  90.3
                       DeepCS    的概率是正确的代码片段, DeepCS                                               88.3
                                                                                 64.4
                                                                    DeepCS
                                                                                             78.2
                                                                                       52.2
                                                      94.2
                                          70.6
                                    78.9
                                                89.6
                    GraphSearchNet  71.3  64.5  88.6  89.6       GraphSearchNet  73.9  65.3  84.2  89.1
                  GraphCS (margin loss)  87.1  80.1  95.2  96.6  GraphCS (margin loss)  88.3  80.6  97.7  98.8
                   GraphCS (circle loss)  86.7  79.5  95.0  96.5  GraphCS (circle loss)  87.7  80.1  97.2  98.6
                    与所有的基线模型相比, 本文提出的            GraphCS  模型在两个数据集上的       4  个评价指标都展现了最好的性能. 可
                 以看到, MRR  指标在   FB-Java 数据集和   CSN-Python  数据集上都超过了    85%, 这意味着   GraphCS  可以很容易地找
                 到查询相关的代码片段. S@k 是代码搜索任务的一个重要评价指标. S@k 值越高, 表示在排名靠前的                            k 个返回结
                 果中存在正确结果的可能性越大. GraphCS          在两个数据集上达到了超过           95%  的  S@5  数值, 即它有  95%  的概率从
                 前  5  个返回的排名结果中得到正确的代码片段. 其他基线模型如                 DeepCS  和  GraphSearchNet 在  S@5  上都没有超
                 过这个数值. 另外     GraphCS  模型在指标  S@1  上也超过了    80%, 比其他模型至少高出了       10%, 即  GraphCS  模型找到
                 的  Top1  结果有  80%                           模型的   S@1  数值是  52.2%, GraphSearchNet 模型的  S@1
                 数值是   65.31%, 即第  1  个返回的代码片段有至少       35%  的概率不符合查询语句的要求, 或者返回的代码片段质量
                 不高. 综上所述, 在精确查找时        GraphCS  的搜索精度更高, 返回的首个代码片段与查询的语义相关性更强. 同时,
                 我们也发现采用      margin loss 的结果要稍微好于基于     circle loss 的结果.
                    另外, 基线模型对于不同编程语言的搜索结果差异较大, 在                  Python  数据集上的表现普遍低于在       Java 数据集上
                 的表现, 而本文的模型表现稳定. 这可能是因为各个基线模型使用的嵌入编码方式对                           Java 语言更适用, 语法简洁
                 函数短小的    Python  语言的深层结构信息更不易挖掘.
                  3.5.2    真实代码搜索的样例展示与分析
                    为了更好地评估模型性能, 本节评价            GraphSearchNet 和  GraphCS  模型在真实的用户查询上的表现, 使用了
   292   293   294   295   296   297   298   299   300   301   302