CodesearchNet挑战已得出结论
我们要感谢所有参与者的意见,我们希望这一挑战为从业者和研究人员就语义代码搜索和激励新研究的挑战提供了见解。我们想鼓励每个人继续使用数据集和人类评估,我们现在公开提供。请,请参阅下面的详细信息,特别是评估部分。
不会接受对挑战的新提交。
目录
如果这是您第一次阅读本文,我们建议跳过本节并阅读以下各节。下面的命令假定您有Docker和Nvidia-Docker,以及支持CUDA 9.0或更高版本的GPU。注意:您只需要运行script/setup一次即可下载数据。
# clone this repository
git clone https://github.com/github/CodeSearchNet.git
cd CodeSearchNet/
# download data (~3.5GB) from S3; build and run the Docker container
script/setup
# this will drop you into the shell inside a Docker container
script/console
# optional: log in to W&B to see your training metrics,
# track your experiments, and submit your models to the benchmark
wandb login
# verify your setup by training a tiny model
python train.py --testrun
# see other command line options, try a full training run with default values,
# and explore other model variants by extending this baseline script
python train.py --help
python train.py
# generate predictions for model evaluation
python predict.py -r github/CodeSearchNet/0123456 # this is the org/project_name/run_id最后,您可以按照以下说明提交跑步到社区基准。
CodesearchNet是数据集和基准的集合,可使用自然语言探讨代码检索的问题。这项研究是此博客文章中提出的一些想法的延续,是Github与Microsoft Research -Cambridge的Github与Deep Program Gealpt Group之间的共同合作。我们旨在通过以下内容提供一个关于语义代码搜索的社区研究平台:
我们希望CodesearchNet是迈向与源代码和自然语言之间关系的更广泛的机器学习和NLP社区迈出的一步。我们在这里描述了一项特定的任务,但是我们期望和欢迎数据集的其他用途。
有关此问题动机的更多背景是在本技术报告中。请,引用数据集和挑战
@article{husain2019codesearchnet,
title={{CodeSearchNet} challenge: Evaluating the state of semantic code search},
author={Husain, Hamel and Wu, Ho-Hsiang and Gazit, Tiferet and Allamanis, Miltiadis and Brockschmidt, Marc},
journal={arXiv preprint arXiv:1909.09436},
year={2019}
}
主要数据集由开源库中的200万( comment , code )对组成。具体而言, comment是顶级函数或方法注释(例如Python中的DocStrings), code是整个函数或方法。当前,数据集包含Python,JavaScript,Ruby,Go,Java和PHP代码。在整个仓库中,我们会互换术语docstring和查询。我们将数据划分为火车,验证和测试拆分,使得来自同一存储库的代码只能在一个分区中存在。目前,这是我们训练模型的唯一数据集。有关此数据集的摘要统计信息可以在此笔记本中找到
有关如何获取数据的更多信息,请参见本节。
我们用于评估的度量标准是标准化的折扣累积增益。请参考本文有关模型评估的更多详细信息。可以在此处找到评估脚本。
我们从99个常规查询中手动注释了六种语言的检索结果。该数据集仅作为地面图数据仅进行评估。有关注释过程的更多详细信息,请参考本文。这些注释用于计算排行榜中的分数。现在,竞争已经结束,您可以在这里找到注释,并在此处找到注释。
您只需要执行一次设置步骤即可下载数据并准备环境。
由于安装所有依赖关系的复杂性,我们准备了Docker容器以运行此代码。您可以找到有关如何在官方文档中安装Docker的说明。此外,您必须安装Nvidia-Docker以满足GPU计算相关的依赖性。对于那些是Docker新手的人,这篇博客文章提供了一个专注于数据科学的温和介绍。
安装Docker后,您需要下载在S3上托管的预处理数据集。您可以通过运行script/setup来执行此操作。
script/setup
这将构建Docker容器并下载数据集。默认情况下,将数据下载到此存储库中的resources/data/文件夹中,此处描述了目录结构。
您将下载的数据集(大多数压缩)的组合尺寸仅为〜3.5 GB。
script/console : script/console
/src目录开始,这将使您进入Docker容器。您可以脱离/附加到此容器中以暂停/继续工作。有关数据的更多信息,请参见下面的数据详细信息以及此笔记本。
如果您已经在上方运行了设置步骤,则将已经拥有数据,而无需完成。数据将在此存储库的/resources/data文件夹中可用,并具有此目录结构。
数据以JSONLINE格式存储。未压缩文件中的每一行都代表一个示例(通常具有关联注释的函数)。下面说明了一个排列的一行示例。
original_string的一部分是代码code的令牌版本docstring的令牌版本代码,评论和docstrings以特定语言的方式提取,以删除该语言的文物。
{
'code': 'def get_vid_from_url(url):n'
' """Extracts video ID from URL.n'
' """n'
" return match1(url, r'youtu\.be/([^?/]+)') or \n"
" match1(url, r'youtube\.com/embed/([^/?]+)') or \n"
" match1(url, r'youtube\.com/v/([^/?]+)') or \n"
" match1(url, r'youtube\.com/watch/([^/?]+)') or \n"
" parse_query_param(url, 'v') or \n"
" parse_query_param(parse_query_param(url, 'u'), 'v')",
'code_tokens': ['def',
'get_vid_from_url',
'(',
'url',
')',
':',
'return',
'match1',
'(',
'url',
',',
"r'youtu\.be/([^?/]+)'",
')',
'or',
'match1',
'(',
'url',
',',
"r'youtube\.com/embed/([^/?]+)'",
')',
'or',
'match1',
'(',
'url',
',',
"r'youtube\.com/v/([^/?]+)'",
')',
'or',
'match1',
'(',
'url',
',',
"r'youtube\.com/watch/([^/?]+)'",
')',
'or',
'parse_query_param',
'(',
'url',
',',
"'v'",
')',
'or',
'parse_query_param',
'(',
'parse_query_param',
'(',
'url',
',',
"'u'",
')',
',',
"'v'",
')'],
'docstring': 'Extracts video ID from URL.',
'docstring_tokens': ['Extracts', 'video', 'ID', 'from', 'URL', '.'],
'func_name': 'YouTube.get_vid_from_url',
'language': 'python',
'original_string': 'def get_vid_from_url(url):n'
' """Extracts video ID from URL.n'
' """n'
" return match1(url, r'youtu\.be/([^?/]+)') or \n"
" match1(url, r'youtube\.com/embed/([^/?]+)') or "
'\n'
" match1(url, r'youtube\.com/v/([^/?]+)') or \n"
" match1(url, r'youtube\.com/watch/([^/?]+)') or "
'\n'
" parse_query_param(url, 'v') or \n"
" parse_query_param(parse_query_param(url, 'u'), "
"'v')",
'partition': 'test',
'path': 'src/you_get/extractors/youtube.py',
'repo': 'soimort/you-get',
'sha': 'b746ac01c9f39de94cac2d56f665285b0523b974',
'url': 'https://github.com/soimort/you-get/blob/b746ac01c9f39de94cac2d56f665285b0523b974/src/you_get/extractors/youtube.py#L135-L143'
}
摘要统计数据,例如行计数和令牌长度直方图,可以在此笔记本中找到
Shell脚本/script/setup将自动将这些文件下载到/resources/data目录中。这是有关可见性的相关文件的链接:
S3链接遵循以下模式:
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/ {python ,,
例如, java的链接是:
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/java.zip
数据集的大小约为20 GB。这里说明了各种文件和目录结构。
为了使用大型数据集训练神经模型,我们将文档注释(例如DocStrings)作为代理。为了进行评估(和排行榜),我们收集了人类的相关性判断,这些判断是成对现实的自然语言查询和代码片段。既然挑战已经得出结论,我们在此提供了一个.csv ,并具有以下字段:
URL键(请参见此处)。我们鼓励您复制和扩展这些模型,尽管大多数变体需要几个小时才能训练(有些变体在AWS P3-V100实例上需要24小时以上)。
我们的基线模型摄入了( comments , code )的平行语料库,并学会在自然语言查询中检索代码段。具体而言, comments是顶级功能和方法注释(例如Python中的DocStrings), code是整个函数或方法。在整个仓库中,我们会互换术语docstring和查询。
查询具有单个编码器,而每个编程语言都有自己的编码器。可用的编码器是神经袋,RNN,1D-CNN,自我注意力(BERT)和1D-CNN+自我注意力集合。
下图说明了我们基线模型的一般体系结构:

此步骤假设您安装了CUDA v9.0合适的NVIDIA-GPU。我们使用了AWS P3-V100实例( p3.2xlarge就足够了)。
通过运行script/console开始模型运行环境:
script/console
这将使您进入Docker容器的外壳,并安装了所有必要的依赖项,包括该存储库中的代码以及您之前下载的数据。默认情况下,您将放置在此GitHub存储库的src/文件夹中。从这里,您可以执行命令运行模型。
如果您想在社区基准上分享您的结果,请根据以下说明设置W&B(免费的开源项目)。这是可选的,但强烈建议。
该型号的切入点是src/train.py 。您可以通过执行以下命令来查看各种选项:
python train.py --help
要测试所有内容是否在小数据集上工作,您可以运行以下命令:
python train.py --testrun
现在,您已经准备好进行全面的训练。示例命令开始训练运行:
培训所有语言的神经袋模型
python train.py --model neuralbow
上面的命令将假设训练数据的位置和您要保存输出模型的目的地的默认值。培训数据的默认位置在/src/data_dirs_{train,valid,test}.txt data_dirs_ {train,valid,test} .txt中指定。这些文件每个都包含一个路径列表,其中存在相应分区的数据。如果指定了多个路径(由newline隔开),则所有路径的数据将被串联在一起。例如,这是src/data_dirs_train.txt的内容:
$ cat data_dirs_train.txt
../resources/data/python/final/jsonl/train
../resources/data/javascript/final/jsonl/train
../resources/data/java/final/jsonl/train
../resources/data/php/final/jsonl/train
../resources/data/ruby/final/jsonl/train
../resources/data/go/final/jsonl/train
默认情况下,模型保存在此存储库的resources/saved_models文件夹中。
仅在Python数据上培训1D-CNN模型:
python train.py --model 1dcnn /trained_models ../resources/data/python/final/jsonl/train ../resources/data/python/final/jsonl/valid ../resources/data/python/final/jsonl/test
上面的命令覆盖了将模型保存到trained_models默认位置,还覆盖了火车,验证和测试集的来源。
附加说明:
当前在src/model_restore_helper.get_model_class_from_name中列出了--model的选项。
超参数特定于相应的模型/编码类类。发现它们的一个简单技巧是在不指定超参数选择的情况下启动运行,因为这将打印所有使用其默认值(以JSON格式)的所有使用过的超参数的列表。
我们正在为该项目使用社区基准,以鼓励协作并提高可重复性。它是由重量和偏见(W&B)托管的,这是免费的开源项目。我们在基准测试中的条目链接到我们培训和评估指标的详细日志以及模型工件,我们鼓励其他参与者提供尽可能多的细节。
我们邀请社区通过按照以下说明提高透明度,以促进透明度。
我们预计社区将设计自定义体系结构,并使用TensorFlow以外的其他框架。此外,我们预计其他数据集将有用。我们并不是要将这些模型,方法和数据集集成到该存储库中,以作为所有可用想法的超集。相反,我们打算维护基线模型,并链接到该存储库中的数据,作为中心参考地点。我们正在接受更新文档,通过改进基准的项目链接到您的项目的PR,修复错误或对代码进行较小的改进。以下是为该存储库做出贡献的更具体的指南;特别注意我们的行为准则。如果您不确定最佳的行动方案,请打开一个问题。
初始化W&B:
导航到此存储库中的/src目录。
如果是您第一次在机器上使用W&B,则需要登录:
$ wandb login
将要求您提供您的API密钥,其中显示在W&B配置文件设置页面上。
_licenses.pkl文件中的每种语言下载的数据下载提供了用于该项目数据的源代码的许可。
该项目的此代码和文档是根据MIT许可发布的。