Page 300 - 《软件学报》2024年第6期
P. 300
2876 软件学报 2024 年第 35 卷第 6 期
200, 300, 400, 500) vs. 实验结果的影响, 评价结果采用 MRR 和 S@K, 实验结果如图 6 所示.
从图 6 中可以看出, 当候选代码片段的大小设置为 100 时, 本文提出的方法在 FB-Java 和 CSN-Python 上均表
现出最好的结果. 当候选代码片段的大小设置为 200, 300, 400 或 500 时, 所有评价指标 MRR 和 S@K 并没有明显
的变化, 这表明本文提出的 GraphCS 具有良好的健壮性. 特别值得说明的是, S@5 和 S@10 的值始终保持在 95%
左右, 表明本文提出的 GraphCS 方法在面对实际场景的搜索时, 依然能够表现出良好的性能.
100 100
95 95
MRR and S@k (%) 90 MRR and S@k (%) 90
85
85
80
MRR
S@1 80 MRR
S@1
75 75
S@5 S@5
S@10 S@10
DeGraphCS
70 70
100 150 200 250 300 350 400 450 500 100 150 200 250 300 350 400 450 500
Numbers of candidate snippets Numbers of candidate snippets C
(a) FB-Java dataset (b) CSN-Python dataset
图 6 候选代码片段大小 C vs. 实验结果的影响
4 相关工作
近年来, 深度学习技术在许多不同领域取得巨大成功, 软件工程领域的研究者们应用自然语言处理方法提高
了源代码相关任务的性能. 源代码相关任务与深度学习紧密相连的活跃研究领域包括代码摘要 [33−36] 、代码生
成 [37−39] 和代码搜索 [8−15] 等, 这些任务的发展相互促进且都是有关联的, 预训练模型 CodeBERT [40] 支持自然语言代
码搜索和代码文档生成等多种下游任务, Chen 等人 [10] 提出的 BVAE 设计两个变分自动编码器用于生成更适合代
码搜索的代码摘要. 本文主要关注对代码复用至关重要的代码搜索任务. 根据相关文献的发表时间线, 代码搜索大
致经历了 3 个阶段: 2000 年以前基于软件工程规范和字符匹配的发展阶段, 2000–2016 年间基于信息检索技术的
增长阶段以及 2016 年以后基于经典机器学习方法和深度学习技术的阶段. 本节主要介绍 2016 年以后出现的代码
搜索技术.
ROSF [41] 对代码片段基于信息检索方法 BM25 先进行粗粒度排序, 多项式逻辑回归模式用于细粒度的重新排
序. Source Forager [42] 挖掘代码片段的所有可能特征类, 并采用二元分类支持向量机的监督学习技术来计算不同特
征类的相对重要性. SCOR [43] 利用 Word2Vec 技术和马尔可夫随机域的组合考虑代码片段语义和标记的顺序.
CodeMF [44] 是一种特征融合的方法, 它通过核主成分分析等技术挖掘 StackOverFlow 的帖子来搜索高质量的软件
库. 经典机器学习方法的应用从多个方面提升了代码搜索引擎的可信度和准确度, 但对文本和代码的理解还不够
深入. DeepCS 是第 1 个将深度神经网络应用于代码搜索任务的工作, 该方法利用 MLP 或 RNN 学习查询文本和
[8]
代码片段的表示, 解决了早期匹配技术对自然语言和代码片段语义理解的困难. 后续工作 [9−11,23,31] 和 DeepCS 较类
似, 即先用不同的序列编码器将代码片段和查询文本映射为同一嵌入空间的向量, 然后计算它们的余弦相似度.
基于图嵌入的方法更进一步学习了代码片段的结构语义, 弥补了序列编码模型的不足. Gu 等人 [45] 后续还提出
了一种基于图核的方法 CodeKernal 以选择合适的 API 使用范例, 它将源代码表示为对象使用图, 通过图核的方法
将图聚类到连续的空间. Zeng 等人 [46] 提出的 模型将源代码的数据流控制流整合到基于变量的图中,
并通过改进的门控图神经网络得到图节点的嵌入. 本文与这些工作的不同之处在于: 1) GraphCS 将代码和文本
都转化为图, 图结构在经过图神经网络学习之后可以通过全局视角进一步探索代码片段和文本查询的交互关系.
2) GraphCS 不仅可以捕获单个代码片段或查询文本的语义信息, 还能探索它们之间细粒度的语义匹配关系, 这有
利于实际搜索场景的精确查询.