导语

本文记录了GitHub 团队在2019年发布的CodeSearchNet 语料库论文的学习笔记,该语料库旨在为代码查找范畴提供基准数据集,提高代码查找成果的质量。

  • 会议:Arxiv 2019
  • 链接:arxiv.org/abs/1909.09…

1 简介

虽然深度学习模型现已能够协助人们处理十分多的使命,但在面临高度结构化数据(编程代码)的使命,如代码语义查找时,其性能仍有待提高。标准的信息检索办法在代码查找范畴效果不佳,由于查找词和成果之间一般很少同享词汇表(例如,考虑一个名为deserialize_JSON_obj_from_stream的办法,它或许是查询“read JSON data”的正确成果)。更具应战的是,评价这项使命的办法十分困难,由于没有为这项使命创建实质性的数据集。

为了处理这个问题,本文发布了一个名为CodeSearchNet的语料库,并基于此构建了该使命的基准:CodeSearchNet应战。CodeSearchNet语料库是经过编程方式获取的,办法是抓取开源存储库,并将单个函数与其(经过处理的)文档作为自然言语注释进行配对。它有着约200万个数据示例,能够在使命上练习高容量的深度神经模型。

CodeSearchNet应战由99条自然言语查询组成,并与六种编程言语(Go, Java, JavaScript, PHP, Python和Ruby)的或许相关成果配对。每个查询/成果对都由人类专家符号,表明成果与查询的相关性。最终,本文也给出了一些该基准上的简略Baseline模型。

2 CodeSearchNet语料库

由于大规划标示是不现实的,因而作者将开源软件中的函数与各自文档中出现的自然言语配对作为一种标示信息。详细步骤如下:

数据搜集

作者从公开可用的开源非fork GitHub存储库搜集语料库,删除许可证模糊的项目。然后,运用TreeSitter (GitHub的通用解析器)符号一切Go、Java、JavaScript、Python、PHP和Ruby函数(或办法),并在可用的情况下,运用启发式正则表达式符号它们各自的文档文本。

数据过滤

作者只运用那些具有文档描绘的函数示例,并运用如下的启发式规矩对函数cic_i和检索到的文档did_i进行过滤:

  • 切断did_i,只运用第一段;
  • 删除掉cic_i小于3行或did_i少于3个token的示例;
  • 删除掉函数名中包括’test’子字符串的示例;
  • 去除重复的示例;

数据集计算

经过过滤后的数据集计算方针如下:

论文笔记:CodeSearchNet Challenge Evaluating the State of Semantic Code Search

局限性

自动化搜集的数据有以下局限性:

  1. 文档从根本上不同于查询,因而运用其他形式的言语。与查找查询不同,它一般与文档代码在同一时间由同一作者编写,因而倾向于运用相同的词汇表。
  2. 虽然进行了数据清理,但无法知道每个文档精确描绘其相关代码片段的程度。例如,许多注释关于它们所描绘的代码来说现已过时了。
  3. 一些文档是用其他言语编写的,而CodeSearchNet Challenge评价数据集主要关注英语查询。

3 CodeSearchNet应战

为了在CodeSearchNet Challenge上进行评价,作者为一个办法有必要为99个预界说的自然言语查询中的每一个回来一组来自CodeSearchNet语料库的相关成果。注意,这个使命在某种程度上简化了一般的代码查找使命,只答应完好的函数/办法作为成果,而不答应任意的代码块。

Query搜集

本文从Bing上获得了一些常见的查找查询,这些查询的代码点击率很高,并将这些查询用StaQC模型进行重写。

论文笔记:CodeSearchNet Challenge Evaluating the State of Semantic Code Search

专家标示

明显,不能注释一切的查询/函数对(数据量太大)。作者首要运用基线办法的完成并集成它们(参见第4节),为每个查询和编程言语生成10个候选成果(即或许的相关代码)。运用web界面进行标示(参见图1),每次显现一个查询/函数对,如图2所示。

论文笔记:CodeSearchNet Challenge Evaluating the State of Semantic Code Search

实验表明,一些标示者发现检查代码片段的上下文有助于判别相关性。显现给用户的查询/代码对的顺序是随机的,这样答应用户独自对每对的相关性进行评分。

标示计算

本文搜集了6种编程言语中的4026个标示,计算数值如下。

论文笔记:CodeSearchNet Challenge Evaluating the State of Semantic Code Search

定性观察

作者发现了标示过程中的一下问题:

  • 代码质量。有许多代码(即使是闻名的repo)是低效、不安全的完成方式,为此,标示者也打了低分;
  • Query歧义性。有些问题本身便是不明确的,如how to determine if a string is a valid word?这儿的valid word详细界说不明确。
  • 运用特定库函数。
  • 上下文。有些成果在语义上是正确的,但不依赖于相关的辅助函数。
  • 方向性。实验成果中的一个常见问题是函数完成了查询的反向功能,例如“convert int to string”得到stringToInt回答。

3.1 模型评价

由于成果是一个有序的查询列表,所以评价方针运用normalized discounted cumulative gain (NDCG),并在两种语料库规划上进行评价:

  1. 只在专家标示的数据上;
  2. 在全部数据上。

对该方针不明确的同学能够参阅:zhuanlan.zhihu.com/p/136199536

4 Baseline办法

4.1 联合向量空间编码

本文的练习方针是将代码和相应的言语映射到互相接近的向量(也便是指代码文本和问题文本都在同一个嵌入空间中)上,由于我们能够经过嵌入查询来完成查找办法,然后回来嵌入空间中“接近”的代码片段集。

论文笔记:CodeSearchNet Challenge Evaluating the State of Semantic Code Search

模型如图3所示。编码器运用下列模型:

  • Neural Bag of Words。
  • Bidirectional RNN models。这儿运用GRU。
  • 1D卷积网络。
  • Self-attention。

在练习过程中,我们得到了一组N对(ci,di)(c_i, d_i)的代码和自然言语描绘,并实例化了一个代码编码器EcE_c和一个查询编码器EqE_q。我们经过最小化损失来练习:

论文笔记:CodeSearchNet Challenge Evaluating the State of Semantic Code Search

4.2 Elasticsearch基线办法

作者也采用了ES作为一种查找的基线办法。

4.3 评价

下表展示了实验成果(前面说的用NDCG,这儿表格又运用了MRR作为评价方针,有些利诱):

论文笔记:CodeSearchNet Challenge Evaluating the State of Semantic Code Search

5 相关工作

6 总结

本文发布CodeSearchNet语料库,并提出CodeSearchNet应战,其间包括99个自然言语查询,以及来自CodeSearchNet语料库的大约4k专家相关注释。该语料库包括了大约600万个来自六种编程言语(Go、Java、JavaScript、PHP、Python和Ruby)的开源代码函数。CodeSearchNet语料库还为200万个函数包括自动生成的相似查询的自然言语,这些言语是经过机械抓取和预处理相关的函数文档获得的。