首页 > 科技 > SCOR:基于语义和排序的源代码检索

SCOR:基于语义和排序的源代码检索

1 引用

Shayan A. Akbar and Avinash C. Kak. SCOR: source code retrieval with semantics and order. In Proceedings of the 16th International Conference on Mining Software Repositories, 2019, 1-12.

2 摘要

word2vec 算法产生的单词嵌入为我们提供了一种强大的机制,可以根据单词之间的上下文关联程度来发现单词之间的关系。就其本身而言,像 word2vec 这样的算法并没有为我们提供一种对嵌入的单词表示施加排序约束的机制。本文的主要目标是利用从 word2vec 获得的语义词向量,以便在将查询中的单词序列与文件中的单词序列进行比较以进行源代码检索时,对它们调用排序约束。这些排序约束使用马尔可夫随机场 (MRF) 的逻辑,MRF 是以前用于基于词袋 (BOW) 假设来增强源代码检索引擎的精度的框架。我们在这里介绍的工作表明,通过将 word2vec 与 MRF 的能力相结合,可以在检索精度方面实现 6% 到 30% 的改进,而不是使用更传统的 MRF 应用于基于项和项间频率的表示法所能获得的最佳结果。对于只使用 iBugs 提供的错误报告标题的 Java AspectJ 库,性能提高了 30%,对于使用标题和 BUGLinks 提供的错误报告描述的 Eclipse 库,性能提高了 6%。

3 技术介绍

我们在本文中提出的检索框架对查询项和文件项调用基于 MRF 的排序约束,所述查询项和文件项使用 word2vec 生成的项的数字向量基于上下文语义进行匹配。这由我们称为“匹配层 1(ML1)”和“匹配层 2(ML2)”的两个“层”来促进。在 2D 数字数组的形式中,ML1 仅仅是查询中的术语和文件中的术语之间的相似性的记录,通过将余弦距离度量应用于 word2vec 生成的数字向量来计算相似性。随后,本着卷积神经网络的精神,我们将 ML1 层与核(其元素必须具有某些预先指定的属性)进行卷积,以产生另一个 2D 数值数组,即 ML2。当查询文件之间在术语和关于术语的排序约束两者之间都存在显著的相似性时,仅对于查询文件中的那些术语序列,ML2 层中该序列正被评估以相对于查询进行检索。将 ML1 中的 2D 数字数组与运算符进行卷积产生的效果与使用基于 MRF 的逻辑实现的效果相同。

3.1 源代码排序关系建模

在基于 IR 的定位的上下文中,马尔可夫随机字段是无向图 G,其中节点之一表示源代码文件 f,该文件正在评估其与给定查询 Q 的相关性,所有其他节点表示单个项。节点之间的弧表示节点之间的概率相关性。 MRF 框架使我们可以自由选择要在检索模型中编码的各种概率依赖性。图 1 显示了我们可以构造 MRF 图 G 的两种可能的依赖假设。一种称为“完全独立”(FI)假设,其中所有查询词都彼此独立。请注意,代表查询项 q1,q2 和 q3 的节点之间没有弧。另一个称为“顺序依赖”(SD)假设,其中,用于连续查询项的节点通过弧线相互连接,如图所示。我们使用 SD 模型来合并文件 f 中可能存在的查询词之间的词项排序关系。

图 1 MRF 建模的两个不同的依赖假设

3.2 源代码语义关系建模

如图 2 所示,我们现在以一个示例来说明包含排序约束的语义检索框架建模。图中使用的示例假定查询仅包含四个术语。所评估的文件与查询的相关性仅由五个术语组成。我们还假设 word2vec 提供的数字项向量的维数为 N。我们将通过在大型 Java 源代码库上训练 word2vec skip-gram 模型来获得这些向量。

查询项和文件项的数字向量用作图 2 中处理链的输入。使用余弦相似性度量将查询项和文件项成对比较, 产生“匹配层 1”(ML1)。

图 2 具有排序约束的语义检索框架建模

关于 ML1 中的数字数组的妙处在于,它有助于进行进一步的处理,从而允许在查询与文件的匹配方式中纳入基于 MRF 的术语-术语排序约束。如图 4 的底行所示,我们现在对带有预定义内核 K 的 ML1 中的数字数组进行卷积,以生成另一层“匹配层 2”(ML2)。 ML2 中的数字数组中的每个元素代表两个连续查询词和两个连续文件词之间的相似性度量。显然,这意味着在语义上与文件术语匹配的查询词之间合并了排序关系。

上面提到的内核 K 被设计为使得它的对角线上具有非零值,而其非对角元素为零或非常接近零。这是 K 上的关键条件,可满足排序约束。在 K 与 ML1 中的数字数组进行卷积期间,如果项与项之间的余弦相似性值都很高,则在特定位置的输出将产生较高的值。卷积运算在 ML1 中的邻域上产生加权和,与在现代深度卷积神经网络上的技术类似。

3.3 计算检索结果的综合评分

用于测量文件与查询的相关性有很多不同的公式,利用公式对仅使用两者之间的关系的 BoW 建模并且使用基于 MRF 的排序约束来通过查询对文件进行排名。并且利用公式完全根据术语-上下文关系的相似性以及在术语-上下文关系之上叠加排序约束的基础上对文件进行排名。

我们将所有这些文件的相关性度量组合起来以进行查询,以创建一个复合文件相关性评分,此复合评分使用分数的加权汇总。

3.4 实验评估

利用前面介绍的框架,现在我们提供关于源代码检索的实验评估结果,以解决自动化定位 Bug 的问题。

我们使用两种不同的软件库来评估结果: Eclipse 和 AspectJ。Eclipse 和 AspectJ 库的结果适用于两种不同类型的检索:仅将错误报告的标题用作查询(“仅标题”),以及将整个错误报告用作查询(“标题加描述”)。Eclipse 和 AspectJ 软件库的错误报告分别从可公开获得的 BUGLinks 和 iBUGS 数据集中获得。BUGLinks 数据集中包含大量错误报告的基础软件。另一方面,iBUGS 数据集所包含的 AspectJ 存储库的错误报告数量也相对较少。

图 3 显示了我们的自动定位 Bug 框架所涉及的步骤。左图所示的 word2vec 神经网络将大量 Java 源代码存储库作为输入,并为这些存储库中以软件为中心的单词生成语义单词嵌入。这项研究使用了从 GitHub 下载的大约 35000 个开源 Java 存储库。除了现在已经解散的几个之外,我们下载了很多业界常用的存储库。

图 3 实验检索框架图

我们使用流行的 Gensim 库从 Java 源代码数据集中学习单词嵌入。我们可以调整以训练 Skipgram 模型的两个重要参数是:向量大小(N)和窗口大小(w)。我们为所有检索实验设置 ,并且。从 Skip-gram 模型中学到的单词向量存储在磁盘文件中。

词嵌入和我们感兴趣的库(例如 Eclipse)的源代码文件以及错误报告一起被馈送到检索引擎中。源代码文件经过 Porter 阻止并停止单词删除。随后,对每个源代码文件建立索引。

实验中,我们将 SCOR 与基于 MRF 的顺序依赖(SD)和完全依赖(FD)源代码检索模型进行比较,该模型之前已提出。注意,MRF SD 模型是我们 SCOR 检索框架中的重要组成部分。如图 8 中提供的实验结果所示,我们的 SCOR 检索模型在 Eclipse 和 AspectJ 的仅标题以及标题加描述查询中均优于另外两个框架。

与 MRF SD 进行比较,使用 SCOR 的改进范围从 Eclipse 标题+描述查询的 5.6%改进到仅 AspectJ 标题查询的 33%改进;而与 MRF FD 进行比较,使用 SCOR 的改进范围从 AspectJ 仅标题查询的 5.6%改进范围到对 AspectJ 标题加描述查询的 27%改进范围。关于使用学生配对 t 检验进行的显著性检验,将 SCOR 与 MRF SD 模型在不同实验中进行比较时获得的 p 值如下:Eclipse 标题加描述查询为 3e-2,Eclipse 标题查询为 4e-3,对于 AspectJ 标题加描述查询为 3e-2,以及仅对 AspectJ 标题查询为 3e-2。

我们提出了一个新颖的源代码检索框架,该框架结合了术语之间的顺序和语义关系,并证明它显著提高了两个流行的数据集 Eclipse 和 AspectJ 的检索精度。为了检索与查询相关的文件,我们的框架使用两个额外的层(称为 ML1 和 ML2)扩展了基本 word2vec 神经网络体系结构。通过仅将查询中的术语与文件中的术语进行比较来生成 ML1 层,方法是将余弦距离度量应用于生成的数字词嵌入,从而将查询中的术语与文件中的术语进行比较通过 word2vec,并通过将卷积核应用于 ML1 层来生成 ML2 层。卷积内核被设计为使得 ML2 中的数字数组的元素仅在文件与术语以及术语出现的顺序都足够类似于查询时才变高。我们在这里的工作还涉及进行迄今为止可能是以软件为中心的术语的词嵌入项目所进行的最大实验。我们从 GitHub 下载了 35,000 个 Java 存储库,处理了超过一百万个术语,其中涉及来自这些存储库的十亿个令牌,以生成这些术语的数字矢量。

4 本文主要贡献

在本文中,我们设计了一种基于语义和排序的源代码检索框架。我们基于的是 BoW(字词包)假设的最著名方法;使用术语 MRF 建模的方法术语频率,并通过 word2vec 算法产生的单词嵌入使用上下文语义的检索框架;最后实现了一个新的框架,该框架在 word2vec 算法产生的单词嵌入之上使用 MRF 建模。该框架结合了术语之间的顺序和语义关系,并证明它显着提高了两个流行数据集 Eclipse 和 AspectJ 的检索精度,并且能够解决自动化定位 Bug 的问题。

致谢

感谢国家重点研发计划课题:基于协同编程现场的智能实时质量提升方法与技术(2018YFB1003901)和国家自然科学基金项目:基于可理解信息融合的人机协同移动应用测试研究(61802171)支持!

本文由南京大学软件学院 2018 级硕士生段定翻译转述。

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/302615.html