用自然语言从GitHub搜程式码 跳过论坛提问环节 来自Facebook新研究_Intent
“如何关闭或隐藏Android软键盘?”
如果你是个Android入门开发者,去Stack Overflow论坛去寻找上非常热门的Android开发问题,很快会有别人贴出一段程式码。

然而有很多冷门问题,通常并不会在论坛中讨论,如果能在广阔的GitHub程式码库中快速找到答案就好了。
为此,Facebook开发了一种程式码搜寻工具,可将自然语言处理(NLP)和资讯检索(IR)技术直接应用于源代码文字。
神经程式码搜寻(NCS),它接受自然语言形式的查询,并直接从GitHub库中检索返回相关程式码片段。
除了NCS之外,另外还有一种用监督资料提高网络效能的UNIF。
小试牛刀
Facebook使用Stack Overflow上Android开发的问题评估NCS的效能,看看模型是否能够从GitHub中找到正确的答案。
在Stack Overflow评估资料集中的287个问题中,NCS的前10个查询结果能够正确回答175个问题,占整个资料集的60%以上。与传统的资讯检索技术BM25相比,有了非常大的提升。

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

结果显示监督技术在获得理想的训练语料库时可以提供的更优的搜寻效能。
例如,搜寻查询“如何退出应用程序并显示主屏幕”这个问题,NCS返回:
publicvoidshowHomeScreenDialog(View view){
Intent nextScreen = newIntent(getApplicationContext, HomeScreenActivity.class);
startActivity(nextScreen);
}
而UNIF提供了更适合的程式码段:
publicvoidclickExit(MenuItem item){
Intent intent=newIntent(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键盘有关。由于它们具有相似的语义含义,即使它们程式码不完全相同,再向量空间中的距离也很近。

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

要生成模型,NCS必须提取单词,构建单词嵌入,然后构建档案嵌入。
为了生成表示程式码的向量,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
作者系网易新闻·网易号“各有态度”签约作者