CodeSearchNet 语料库论文学习笔记

释放双眼,带上耳机,听听看~!
本文记录了GitHub团队在2019年发布的CodeSearchNet语料库论文的学习笔记,介绍了该语料库的相关信息以及解决的问题,是了解代码搜索领域最新进展的重要资讯。

导语

本文记录了GitHub 团队在2019年发布的CodeSearchNet 语料库论文的学习笔记,该语料库旨在为代码搜索领域提供基准数据集,提升代码搜索结果的质量。

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 语料库论文学习笔记

局限性

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

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

3 CodeSearchNet挑战

为了在CodeSearchNet Challenge上进行评估,作者为一个方法必须为99个预定义的自然语言查询中的每一个返回一组来自CodeSearchNet语料库的相关结果。注意,这个任务在某种程度上简化了一般的代码搜索任务,只允许完整的函数/方法作为结果,而不允许任意的代码块。

Query收集

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

CodeSearchNet 语料库论文学习笔记

专家标注

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

CodeSearchNet 语料库论文学习笔记

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

标注统计

本文收集了6种编程语言中的4026个标注,统计数值如下。

CodeSearchNet 语料库论文学习笔记

定性观察

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

  • 代码质量。有很多代码(即使是知名的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 语料库论文学习笔记

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

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

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

CodeSearchNet 语料库论文学习笔记

4.2 Elasticsearch基线方法

作者也采用了ES作为一种搜索的基线方法。

4.3 评估

下表展示了实验结果(前面说的用NDCG,这里表格又使用了MRR作为评估指标,有些迷惑):

CodeSearchNet 语料库论文学习笔记

5 相关工作

6 总结

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

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

OctaveConv: 提高精度、降低计算成本的卷积神经网络

2023-12-16 11:20:14

AI教程

意图增强:NLP中的新趋势

2023-12-16 11:30:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索