github 流行开发语言(用自然语言从GitHub搜代码)

晓查 发自 凹非寺

量子位 报道 | 公众号 QbitAI

“如何关闭或隐藏Android软键盘?”

如果你是个Android入门开发者,去Stack Overflow论坛去寻找上非常热门的Android开发问题,很快会有别人贴出一段代码。

github 流行开发语言(用自然语言从GitHub搜代码)(1)

遇到编程问题,程序员恐怕首先想到的是去技术论坛搜索结果,然后从回答中寻找代码。

然而有很多冷门问题,通常并不会在论坛中讨论,如果能在广阔的GitHub代码库中快速找到答案就好了。

为此,Facebook开发了一种代码搜索工具,可将自然语言处理(NLP)和信息检索(IR)技术直接应用于源代码文本。

这套工具称为神经代码搜索(NCS),它接受自然语言形式的查询,并直接从GitHub库中检索返回相关代码片段。

除了NCS之外,另外还有一种用监督数据提高网络性能的UNIF

小试牛刀

Facebook使用Stack Overflow上Android开发的问题评估NCS的性能,看看模型是否能够从GitHub中找到正确的答案。

在Stack Overflow评估数据集中的287个问题中,NCS的前10个查询结果能够正确回答175个问题,占整个数据集的60%以上。与传统的信息检索技术BM25相比,有了非常大的提升。

github 流行开发语言(用自然语言从GitHub搜代码)(2)

我们将NCS和UNIF与Stack Overflow评估数据集进行比较,证实UNIF改善了大大超过NCS回答的问题数量。

github 流行开发语言(用自然语言从GitHub搜代码)(3)

结果显示监督技术在获得理想的训练语料库时可以提供的更优的搜索性能。

例如,搜索查询“如何退出应用程序并显示主屏幕”这个问题,NCS返回:

public void showHomeScreenDialog(View view) { intent nextScreen = new Intent(getApplicationContext(), HomeScreenActivity.class); startActivity(nextScreen); }

而UNIF提供了更适合的代码段:

public void clickExit(MenuItem item) { Intent intent=new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); metr.stop(); startActivity(intent); finish(); }

原理

Facebook利用了开源AI工具fastText、FAISS和PyTorch,NCS和UNIF将自然语言查询和代码片段表示为向量,然后训练网络,使得语义相似的代码片段和查询的向量表示紧密相连在向量空间。

通过这些模型,可以直接从代码语料库中找到代码片段,有效地回答程序员的问题。

NCS

NCS模型通过使用嵌入来获取程序语义,在向量空间中语义相似的实体具有彼此接近的期望属性。在下面的例子里,有两个不同的代码,它们都与关闭或隐藏Android键盘有关。由于它们具有相似的语义含义,即使它们代码不完全相同,再向量空间中的距离也很近。

github 流行开发语言(用自然语言从GitHub搜代码)(4)

Facebook使用这个概念来构建NCS模型。在高级别中,模型生成的每个代码片段以方法级粒度嵌入到向量空间中。构建模型后,某个查询将映射到同一向量空间,向量距离用于估计代码段与查询的相关性。

github 流行开发语言(用自然语言从GitHub搜代码)(5)

要生成模型,NCS必须提取单词,构建单词嵌入,然后构建文档嵌入。

github 流行开发语言(用自然语言从GitHub搜代码)(6)

为了生成表示代码的向量,Facebook将源代码视为文本,并从以下语法类别中提取:方法名称,方法调用,枚举,字符串文字和注释。然后我们根据标准英语惯例(例如空格,标点符号)和与代码相关的标点符号对其进行标记。

例如,对于上图中的方法体“pxToDp”,可以将源代码视为单词集合:“将dp px中的px转换为dp获取资源、获取显示指标”。

fastText为词汇语料库中的所有单词构建单词嵌入。fastText使用两层密集神经网络计算向量表示,该网络可以在大型语料库上无人监督地进行训练。

而UNIF是NCS的扩展,当有监督数据可用于训练时,可以用来提高性能。

在GitHub上挑选26,109个最受欢迎的Android项目,直接在搜索语料库上训练我们的无监督模型NCS。这也成为NCS返回代码片段的搜索语料库。

至于UNIF模型,我Facebook提取Stack Overflow论坛中问题标题和代码片段来获取数据集。在使用各种启发式过滤问题后,最终得到451,000个训练样本。

论文地址:

https://arxiv.org/pdf/1905.03813.pdf

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页