找回密码
 立即注册
搜索

资源|自然言语语义代码搜索之路

选自GithubEngineering

者: hamelsmu、hohsiangwu

机器之心编译

参与:Geek AI、张倩

在本文中,作者向读者分享了如何应用深度学习技术促进自然言语语义搜索的发展。此外,他们还分享了一个开源的示例,以及复现结果所需的代码和数据。

研讨动机

目前,在 GitHub 上搜索代码还局限于关键字搜索。这建立在假设用户了解句法,或者可以预测出他们要找的代码周围的注释中能够有什么关键字的基础上。我们的机器学习迷信家不断在研讨可以对代码停止语义搜索(https://en.wikipedia.org/wiki/Semantic_search)的方法。

假如读者想要充分了解语义搜索的概念,可以想一想下面的搜索查询「ping REST api and return results」

请留意,即便在搜索查询和文本之间并不存在共有的关键字(在代码和注释中并没有找到「Ping」、「REST」或「api」字样),我们的语义搜索算法也能前往有意义的结果!经过语义搜索加强关键字搜索是意义深远的。例如,这种才能可以加快新的软件工程师上手软件项目的过程,并且普遍提高代码被发现的能够性。

在本文中,我们想向读者分享我们是如何应用深度学习技术在自然言语语义搜索范畴获得提高的。我们也分享了一个开源的示例,以及复现这些结果所需的代码和数据。

引言

目前,对实体的表示学习是 GitHub 上正在停止的机器学习研讨的关键范畴之一,这里的实体包括代码仓库、代码、成绩单、文件和用户。我们经过学习与文本共享一个向量空间的代码的表征,在促进语义搜索方面获得了分明的提高。我们不妨看一看下面的表示图中的例子:


在下面的例子中,Text 2(蓝色)是对代码的合理描画,而 Text1(红色)则与代码完全有关。我们的目的是让学习到的描画相反概念的文本、代码对的表征比较接近。而不相关的文本、代码对的表征的间隔较远。经过在相反的向量空间中表征代码和文本,我们可以将用户的搜索查询向量化,并查找最接近的表示代码的向量。下面是我们目前用来完成这项义务的方法的四个步骤:

1. 学习代码的表征

为了学习代码的表征,我们训练了一个序列到序列(Seq2Seq)模型,它可以学着对代码停止总结。在 Python 环境下完成这一目的一种方法是提供(代码,文档字符串)对,其中文档字符串是模型试图预测的目的变量。对我们来说,引入对特定范畴(如基于树结构的 LSTM、门控图网络以及有语法看法的分词处理)的优化是一个热点的研讨范畴。下图展现了代码总结模型的工作过程。在这个例子中,有两个 python 函数作为输入,在这两种状况下,模型都将合理的代码总结作为输入:


该当指出,在下面的例子中,模型经过运用整段代码块而不只仅是函数名来生成对代码的总结。

构建代码总结器本身是一个非常激动人心的项目,但是,我们还可以应用这个模型的编码器作为代码的通用特征提取器。从这个模型中提取出编码器后,我们可以对它停止调优,从而建立代码到自然言语的向量空间的映射。

我们可以客观地运用 BLEU 得分来评价这个模型。目前,我们曾经可以运用 fairseq-py 代码库(https://github.com/pytorch/fairseq)构建 Seq2Seq 模型,在一个 python 代码验证集上获得 13.5 的 BLEU 得分。

2. 学习短文本的表征

除了学习代码的表征以外,我们还需求为短文本(例如在 Python 文档字符串中找到的句子)找到合适的表征。最后,我们尝试运用通用的句子编码器,这是一个预训练好的文本编码器,可以从 TensorFlow Hub(https://www.tensorflow.org/hub/modules/google/universal-sentence-encoder/1)上获取。虽然目前嵌入技术的功能曾经很好,我们发现学习针对于软件开发的词汇和语义的嵌入照旧是有益的。目前正在停止一个研讨范畴旨在评价用于训练我们模型的不同特定范畴的语料库,其范围涵盖从 GitHub 成绩单到第三方数据集的诸多范畴。

为了学习短文本的表征,我们应用 fast.ai 库训练了一个神经言语模型。这个库让我们可以很容易运用像 AWD LSTM 这样最先进的架构,以及相似带随机重启的周期性学习率(cyclical learning rates with random restarts)这样的技术。我们运用

《Universal Language Model Fine-tuning for Text Classification》中提出的级联池化(concat pooling)技术经过总结隐藏形状从该模型中抽取出对短文本的表征。

这项工作一个最具应战性的方面是评价这些嵌入的质量。我们目前正在构建各种相似于《SentEval: evaluation toolkit for sentence embeddings》(https://github.com/facebookresearch/SentEval)中概述 (https://github.com/facebookresearch/SentEval) 的下游监督义务,它们将协助我们客观地评价这些嵌入的质量。与此同时,我们还经过手动检验相似短文本之间的相似程度来检查我们的嵌入。下面的截图展现了一些示例,我们在这里根据用户提供的短文本和向量化的文档字符串间的相似程度停止搜索。


3. 将代码表征映射到具有相反向量空间的文本上

接上去,我们将把从代码总结模型(第 1 部分)中学到的代码表征映射到文本的向量空间。我们经过对该模型的编码器停止调优来完成这一点。这个模型的输入照旧是代码块,但是模型的目的变量如今变成了文档字符串的向量化版本。这些文档字符串运用上一节引见的方法停止了向量化处理。

详细而言,我们运用余弦近似损失(即预测值与真实标签的余弦间隔平均值的相反数)停止多维回归,将编码器的隐藏形状带入与文本相反的向量空间。

我们正在积极研讨直接学习代码和自然言语的结合向量空间的方法,我们的研讨自创了《Efficient Natural Language Response Suggestion for Smart Reply》中引见的一些思绪。

4. 创建一个语义搜索系统

最后,在成功地创建了一个可以将代码向量化到与文本相反的向量空间的模型之后,我们可以创建一个语义搜索机制。最简单的方式是,我们可以在一个数据库中存储一切代码的向量化版本,对向量化的搜索查询执行最近邻查找。

我们研讨的另一个热点范畴是确定用语义结果加强现有关键字搜索的最佳方法,以及如何引入上下文语境和相关性等额外的信息。此外,我们正在积极探求如何评价搜索结果的质量,使我们可以在这个成绩上疾速迭代开发。我们将来将在博文中继续讨论这些话题。

总结

下面的表示图总结了我们当前的语义搜索工作流程中一切的步骤:


我们正在探求如何改进这种方法的几乎每一个组成部分,包括数据预备、模型架构、评价过程以及全体的系统设计。本文所引见的只是一个基础的最小的示例。

开源示例

我们的开源端到端教程(https://towardsdatascience.com/semantic-code-search-3cd6d244a39c)包含了本文中概述的方法的详细演示过程,以及你可以用来复现结果的代码和数据。(https://towardsdatascience.com/semantic-code-search-3cd6d244a39c)

该开源示例(停止了一些修正)也被用作 kubeflow 项目的教程,详细完成请参阅:https://github.com/kubeflow/examples/tree/master/code_search

局限性及能够的用例场景

我们以为,相对于通常运用的「如何...」这种方式的查询,语义代码搜索将最有益于针对诸如代码仓库、组织或用户等特定实体的代码搜索。在我们最近发布的实验网站(https://blog.github.com/2018-09-18-introducing-experiments-an-ongoing-research-effort-from-github/)上,语义代码搜索的实时演示(https://blog.github.com/2018-09-18-introducing-experiments-an-ongoing-research-effort-from-github/)不允许用户针对代码仓库停止特定的搜索。实践上,这种演示只是为了分享能够得到的效果,并且只搜索一组受限的、静态的 python 代码集。

此外,与一切的机器学习技术一样,该方法的效果也受限于运用的训练数据。例如,用于训练这些模型的数据是(代码,文档字符串)对。因此,与文档字符串最相似的搜索查询成功的几率最大。另一方面,假如查询与文档字符串差别很大或者含有支撑数据很少的概念,该模型能够不会产生很好的搜索结果。因此,这对于我们停止实时演示是一个应战。虽然如此,我们初步的结果表明,这是一个硕果累累的研讨范畴,我们很高兴与你们分享。

语义代码搜索还有更多的用例场景。例如,我们可以对本文引见的想法停止扩展,允许用户运用他们选择的自然言语(法语、普通话、阿拉伯语等)同时对用许多不同的编程言语编写的代码停止搜索。



原文链接:https://githubengineering.com/towards-natural-language-semantic-code-search/

2018AIIA人工智能开发者大会将于2018年10月15日到16日在苏州国际博览中心举行。点击阅读原文链接报名。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评2

农夫花园 2019-2-17 14:12:49 显示全部楼层
看帖要回,回帖才健康,在踩踩,楼主辛苦了!
回复

使用道具 举报

撸过
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies