输入一段成绩,自动给你引荐代码,Facebook用自然言语搜索代码

图灵汇官网

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

如果你是一个Android开发初学者,在Stack Overflow论坛上查找热门的Android开发问题时,很快就能找到别人分享的一段代码。

不过,很多冷门问题往往不会在论坛里被广泛讨论。如果能在浩瀚的GitHub代码库中快速找到答案就好了。

为此,Facebook开发了一种名为“神经代码搜索”(NCS)的工具,它结合了自然语言处理(NLP)和信息检索(IR)技术,直接应用于源代码文本。此外,还有一个名为“UNIF”的工具,能够利用监督数据提高搜索效果。

小试牛刀

Facebook使用Stack Overflow上的Android开发问题来测试NCS的效果,看它是否能从GitHub中找到正确答案。在287个问题中,NCS的前十条查询结果能正确回答175个问题,占比超过60%。相比传统的信息检索技术BM25,NCS有了显著提升。

比较

NCS和UNIF与Stack Overflow上的问题进行了对比。结果显示,UNIF在回答问题的数量上比NCS有了大幅改进。

示例

例如,搜索查询“如何加入应用程序并显示主屏幕”,NCS返回的代码段如下: java public void showHomeScreenDialog(View view) { Intent nextScreen = new Intent(getApplicationContext(), HomeScreenActivity.class); startActivity(nextScreen); } 而UNIF提供的代码段更为合适: java 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模型通过嵌入获取程序语义,在向量空间中语义相似的实体彼此接近。模型将代码片段以方法级别嵌入到向量空间中,查询也将映射到同一向量空间,向量距离用于评估代码片段与查询的相关性。

向量生成

为了生成代码的向量表示,Facebook将源代码视为文本,并从方法名称、方法调用、枚举、字符串常量和注释中提取信息。然后根据标准英语惯例和代码相关的标点符号进行分词。

fastText

fastText为词汇库中的所有单词构建嵌入。fastText使用两层密集神经网络,在大规模语料库上进行无监督训练。

UNIF

UNIF是NCS的扩展,当有监督数据可用于训练时,可以提高性能。在GitHub上选取了26,109个最受欢迎的Android项目,直接在搜索语料库上训练NCS。UNIF则使用Stack Overflow论坛中的问题标题和代码片段作为训练数据,最终得到451,000个训练样本。

相关论文链接: https://arxiv.org/pdf/1905.03813.pdf

— 完 —

量子位QbitAI正在招聘编辑/记者,工作地点在北京中关村。欢迎有志之士加入我们!

希望这些改写后的段落符合您的需求,既保留了原文的核心信息,又提高了文章的紧凑性和可读性。

本文来源: 图灵汇 文章作者: 付佳奇