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

图灵汇官网

在本文中,作者分享了如何利用深度学习技术推动自然语言语义搜索的发展。此外,他们还提供了一个开源示例及其所需的代码和数据,以便读者能够复现实验结果。

研究背景

目前,GitHub上的代码搜索主要依赖于关键字搜索,这依赖于用户对搜索关键字的理解。我们的研究团队致力于开发一种能够实现代码语义搜索的技术。例如,当用户搜索“ping REST API 并返回结果”时,即使没有出现“Ping”、“REST”或“API”这样的关键字,我们的语义搜索算法也能提供相关的结果。这种能力可以加速新工程师适应项目的速度,并提升代码的可发现性。

引言

目前,GitHub正在进行的一项重要研究是学习代码实体的表示。我们通过学习代码的表征,使其能在向量空间中与文本匹配,从而促进语义搜索的发展。下图展示了这种方法的一个实例:

示例图片

在上述示例中,文本2(蓝色)是对代码的合理描述,而文本1(红色)与此无关。我们的目标是让描述相同概念的文本和代码在向量空间中彼此靠近,而无关的文本和代码则远离。

方法步骤

为了实现这一目标,我们采取了以下步骤:

1. 学习代码的表征

我们训练了一个序列到序列(Seq2Seq)模型,该模型能够生成代码的总结。为了训练这个模型,我们使用了Python环境下的(代码,文档字符串)对。我们还引入了对特定领域的优化,如基于树结构的LSTM、门控图网络和语法敏感的分词处理。目前,我们使用fairseq-py代码库构建的Seq2Seq模型在Python代码验证集上获得了13.5的BLEU得分。

2. 学习短文本的表征

除了学习代码的表征外,我们还需要为短文本(如Python文档字符串中的句子)找到合适的表征。我们使用fast.ai库训练了一个神经语言模型,采用AWD LSTM架构,并结合了随机重启的周期性学习率。我们还使用级联池化技术来提取短文本的表征。

3. 将代码表征映射到文本的向量空间

接下来,我们将从代码总结模型中学习到的代码表征映射到文本的向量空间。为此,我们通过调优模型的编码器来实现这一点。具体来说,我们使用余弦近似损失来进行多维回归,将编码器的隐藏状态带入与文本相同的向量空间。

4. 创建语义搜索系统

最终,我们构建了一个语义搜索机制,可以在数据库中存储所有代码的向量化版本,并对向量化后的搜索查询执行最近邻查找。我们还在探索如何将语义结果与现有关键字搜索相结合,引入更多相关信息,以及如何评估搜索结果的质量。

总结

本文介绍了我们当前在语义搜索方面的进展。我们正在不断改进数据准备、模型架构、评估过程和系统设计。开源示例包含详细的方法演示以及复现结果所需的代码和数据。

开源示例

我们提供了开源端到端教程,其中包含详细的方法演示以及复现结果所需的代码和数据。该开源示例也被用于kubeflow项目的教程。

局限性与应用场景

我们认为,语义代码搜索在针对特定实体(如代码仓库、组织或用户)的搜索中最为有效。此外,该方法的效果受限于训练数据的质量。尽管如此,我们相信这是一个值得进一步探索的研究领域。

附加信息

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

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

本文来源: 图灵汇 文章作者: