Facebook AI发布了一个包含编码问题和代码片段答案的数据集,旨在评估基于AI的自然语言代码搜索系统。该版本还包括Facebook自己的几种代码搜索模型的基准测试结果,以及来自24,000个GitHub存储库的超过400万种Java方法的训练语料库。
在arXiv上发表的一篇论文中,研究人员描述了他们收集数据的技术。训练数据语料库是从最受欢迎的GitHub Android代码存储库中收集的,按星数排序。解析存储库中的每个Java文件,以标识各个方法。Facebook在培训代码搜索系统的研究中使用了所得的语料库。为了创建评估数据集,他们从Stack Overflow 的问答数据转储开始,仅选择同时具有“ Java”和“ Android”的问题研究人员说:“其中,他们只保留答案被投票的问题,这些问题也与训练数据语料库中确定的一种方法相匹配。结果将518个问题手动过滤为最终的287个问题。研究人员表示:
我们的数据集不仅是当前可用于Java的最大数据集,而且还是唯一以自动化(一致)方式针对Stack Overflow的真实答案进行验证的数据集。
Facebook最近发表了几篇关于神经代码搜索的论文,这是一种用于训练神经网络回答“如何”编码问题的机器学习技术。软件开发人员通常会使用Stack Overflow来学习如何解决特定的编码问题,例如,如何解决 Android应用程序中的错误。但是,在处理使用专有API或较不常见的编程语言的代码时,这不是一个选择。在这种情况下,程序员自己的组织之外的专家很少(或没有)。相反,Facebook和其他公司探索了使用源代码本身作为培训数据来产生可以回答编码问题的自然语言处理(NLP)系统的想法。
去年,Facebook发表了一篇关于无监督学习方法的论文,称为神经代码搜索(NCS),该方法接受了从GitHub收集的数据的培训。该技术从源代码中提取单词,并学习将每个单词映射到高维空间中的向量的嵌入。嵌入通常具有向量的性质,向量在向量空间中彼此“接近”,表示具有相似含义的词,并且词之间的关系可用向量算术表示。一个例子是在Wikipedia上训练的word2vec模型,当给定向量表达式“ Paris-France + Spain”时,该模型将返回“ Madrid”。
学习了嵌入之后,使用“ 词袋 ”模型将语料库中的每个Java方法转换为嵌入空间中的向量;通过嵌入将代码中的每个单词转换为向量,并将向量的加权总和分配给该方法作为其索引。这会将每个Java方法映射到嵌入空间中的一个点。为了回答编码问题,通过将查询中的每个单词都通过嵌入转换并产生加权和,可以将该问题类似地映射到嵌入空间中的某个点。问题的“答案”是Java方法,其索引最接近该点。关键思想是查询和代码都使用相同的嵌入,并且训练不需要在输入数据中出现任何问题;它仅从源代码中学习。
这种技术的一个缺点是它不会学习源代码中没有的单词的嵌入。Facebook研究人员发现,在Stack Overflow上,有问题的单词中也只有不到一半的单词包含在源代码中。这促使研究人员通过监督学习扩展了NCS,“以弥合自然语言单词和源代码单词之间的鸿沟”。产生的系统称为嵌入统一(UNIF),学习查询词的单独嵌入。在此培训过程中,团队使用类似于收集基准数据集的过程从Stack Overflow中提取了一组问题标题和代码段。该训练数据集包含451k个问题-答案对,但都不在基准测试中。在基准上进行评估时,对这一数据进行培训的联合国系统的性能略优于NCS。两种系统都以大约三分之一的时间作为最高结果返回“正确”答案,并以一半的时间以“前五项”结果返回“正确”答案。