原创 一种基于联想搜索的自发式代码推荐工具Selene

2020-3-4 16:17 2612 13 13 分类: 机器人/ AI 文集: 知识汇集

本文介绍了一个基于联想搜索引擎的源代码推荐工具 Selene。当开发人员编辑程序文本时,它会自动搜索并显示示例程序。通过使用关联搜索引擎,它可以在几秒钟内搜索一个包含 200 万个示例程序的存储库。本文讨论了我们正在进行的 Selene 实现所揭示的问题,特别是性能、相似性度量和用户界面方面的问题。

3 技术介绍

我们正在开发一个名为 Selene 的代码推荐系统,它使用整个编辑代码作为搜索查询,快速搜索并显示示例程序库中的类似程序片段。通过自动启动搜索并将大量开源软件的源程序放入存储库中,我们希望 Selene 能够帮助开发人员找到适合其上下文的库和框架的用法和习惯用法,而不需要太多的手动操作操作。

3.1 整体概述

图 1 显示了 Selene 的体系结构概述,它的主要组件是客户机上的 Eclipse 插件和集群服务器端的关联搜索引擎。它们按以下步骤工作。

  1. 插件不断监视 Eclipse 中的活动编辑器窗格,并定期将整个文本发送到服务器。
  2. 给定插件中的程序文本,搜索引擎将搜索与文本相似的前 N 个文件的存储库,并将指针发送回这些文件。
  3. 该插件在接收到搜索结果的指针后,从存储库中检索前 M 个文件的内容。然后,它对每个检索到的文件执行本地搜索,以识别相似的行到编辑器窗格中光标位置周围的文本。
  4. 插件最终会在编辑器窗格旁边显示前 M 个检索到的文件的行数。
一种基于联想搜索的自发式代码推荐工具

图 1 Selene 的体系结构概述

3.2 关联搜索引擎

作为查找类似程序的搜索引擎,我们使用 GETA 关联搜索引擎。与基于关键字的搜索引擎(其单个搜索检索包含指定关键字的文档)不同,GETA 的单个搜索检索给定一组关键字作为查询,前 N 个包含相似关键字集的相似文档。它的相似性度量,如向量余弦相似度,不需要在文档中存在所有查询关键字。此属性适合将整个编辑代码用作查询。

作为存储库和查询关键字的索引项,我们只需使用程序中的所有字母数字标记。换句话说,我们不仅包括 API 规范中出现的名称,还包括非公共名称、局部变量名称、语言结构和注释文本中的单词。

作为一种相似性度量,我们使用由术语频率逆文档频率(TF-IDF)的变体规范化的术语频率的余弦相似性。在构建查询向量时,我们将更多的权重放在光标位置附近的标记的出现上,以便找到包含与光标位置周围的代码类似的片段的程序。

3.3 推荐数据库和客户端插件

存储库包含 2037204 个 Java 文件,这些文件是从 UCI 源代码数据集获得的。用于关联搜索的索引汇总了每个文件中标记的频率。总容量 4.04GB,拆分后部署到后端节点。

用户界面是作为 Eclipse 插件构建的。它由四个组件组成,即

(1)通过监视活动编辑器窗格启动搜索的组件。

(2)向服务器发送查询文本并从服务器接收结果的组件。

(3)执行本地搜索的组件。

(4)在编辑器窗格旁边显示结果文件的组件。

至于搜索启动,我们当前的实现在组件注意到编辑器命令(如剪切和粘贴)的任何问题或光标位置的跳变时开始搜索。换句话说,它忽略了一些小的活动,例如插入字符和移动光标等。至于局部搜索,我们目前使用一种朴素的算法来识别要显示的行。它首先将从服务器接收的结果文件分割成 20 行的片段,计算每个片段和编辑代码之间的相似度得分,并找到给出最大得分的片段。

4 本文主要贡献

本文的贡献如下:开发了 Selene 这样一个源代码推荐工具,基于源代码存储库上基于文本的搜索引擎。一个快速的并行关联搜索引擎允许它使用一个大规模的存储库,目前包含 200 万个文件,在几秒钟内保持查询响应时间。显示出有希望的基本性能数据,实际软件开发的有效性有待研究。我们还指出了目前为止我们发现的几个有趣的研究问题,特别是性能、相似性度量和用户界面。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
13
关闭 站长推荐上一条 /3 下一条