汇总:使用细粒度变化统计学习的API代码推荐

优采云 发布时间: 2022-11-16 22:45

  汇总:使用细粒度变化统计学习的API代码推荐

  引文:Nguyen、Anh Tuan 等。“使用从细粒度更改中进行统计学习的 API 代码推荐。” 2016 年第 24 届 ACM SIGSOFT 软件工程基础国际研讨会论文集。美国计算机学会,2016 年。

  概括

  学习和掌握如何使用 API 非常困难。虽然代码完成工具可以推荐合适的 API 方法,但浏览一长串 API 方法名称及其文档非常乏味。此外,用户很容易被过多的信息淹没。我们提出了一种新颖的 API 推荐方法,该方法利用重复代码更改的预测能力为开发人员提供相关的 API 推荐。我们的方法和工具 APIREC 基于从细粒度代码更改和这些更改发生的上下文中进行的统计学习。我们的实证评估表明,APIREC 正确推荐 API 调用的概率在第一位为 59%,在前 5 位的概率为 77%。这是对最先进方法的重大改进,top-1 排名准确度提高 30-160%,top-5 排名准确度提高 10-30%。我们的结果表明,即使使用只有 50 个公开可用项目的一次性最小训练数据集,APIREC 也表现良好。

  关键词

  API推荐;细粒度的变化;统计学习

  介绍

  应用程序编程接口 (API) 在当今的程序开发中被广泛使用:即使是“Hello World”程序也会调用 API 方法。软件开发人员面临的一个巨大挑战是学习和掌握如何使用 API。代码完成工具允许用户键入变量并请求对可能的 API 方法调用的建议。代码补全工具是IDE最常用的五个功能之一。尽管如此,学习 API(或试图记住它)的开发人员可能会浪费大量时间来梳理*敏*感*词*对象上可用的 API 方法名称的长列表。

  最近的代码完成研究通过确定性算法(例如高频项目挖掘、配对关联和高频子序列或子图挖掘)利用研究人员的 API 使用模式。当请求建议时,这些方法会分析周围的上下文。如果上下文匹配先前识别的模式,推荐器将建议模式中剩余的 API 元素。其他方法通过语言模型使用统计学习来推荐下一个标记,包括 API 调用。他们依赖于源代码 [16] 的规律性,并创建了一个从大型语料库中统计地学习代码模式的模型。然后,该模型可以预测哪些标记可能遵循给定的代码元素序列。这种方法的一个主要缺点是很难确定哪些标签属于特定于项目的代码习惯用法。这些标签会干扰推荐。

  我们提出了一种新的代码完成方法,它利用了软件更改的规律性和重复性。我们的直觉是,当开发人员进行低级更改时,即使是离散的更改也是相关的。这些关联的存在是因为开发人员在考虑更高级别的意图时进行了更改(例如,添加循环采集器)。通过更高级别的意图对粒度变化进行分组使我们能够消除推荐点周围无关标记的噪音。为了找到这些细粒度更改的组合,我们对大量代码更改使用统计学习。作为更高级别意图的一部分的更改将比不相关的更改更频繁地同时发生。

  此*敏*感*词*的代码上下文。例如,虽然代码标记“for”和“HashSet”在添加循环采集器时没有改变,但它们是该工具识别高级意图的良好指标。因此,了解代码的上下文后,该工具将正确推荐下一个标记,例如 HashSet.add。

  我们在工具 APIREC 中实现了我们的方法,该工具计算最有可能的 API 调用以插入到 API 调用有效的请求位置。APIREC 分为三个步骤:(i)从训练集中构建细粒度代码更改语料库,(ii)统计学习哪些细粒度更改同时发生,(iii)计算然后根据当前上下文和给定位置的先前更改进行 API 调用。

  作为第一步,我们在 GitHub 上的 50 个开源项目的变更提交中对我们的模型进行了细粒度的代码更改。APIREC 使用最先进的 AST 差异工具 GumTree 迭代 113,103 次提交并检测 43,438,386 个抽象语法树 (AST) 节点的差异。

  在第二步中,我们开发了一个基于关联的推理模型,该模型了解经常在同一变更文件中同时发生的变更。此外,该模型对代码上下文中的细粒度更改进行操作(例如,for 循环、方法调用之前)。

  

  第三步,APIREC利用之前改变的上下文、推荐点的代码上下文和训练好的推理模型,判断用户在该位置插入API方法调用的可能性。如果确定确实可以插入 API 方法,它会返回一个候选 API 调用列表,该列表按计算出的开发人员选择的可能性排序。

  为了评估我们方法的可用性,我们解决了以下三个问题。

  首先是准确性,APIREC 建议的 API 调用有多准确?

  二是敏感性分析。训练数据的大小、请求的位置、变化上下文的大小以及代码的上下文等因素如何影响准确性?

  第三个是运行时间APIREC的运行时间是多少?

  为了回答第一个问题,我们测量了推荐系统的准确性。Top-k 准确率衡量了第一个推荐的 API 中正确 API 的可能性。我们测量三种不同评估版本的准确性。在社区版中,我们首先在 50 个开源项目上训练 APIREC,然后在其他研究人员之前使用的 8 个项目的语料库上测量 APIREC 的准确性。在项目版本中,我们对上述 8 个项目分别进行了 10x 验证。对于用户版本,我们还对上面相同的 8 个项目进行了 10 次验证,但仅针对单个用户的提交。为了回答第二个问题,我们调查了几个因素对准确性的影响,例如,训练数据的大小、之前的变化、周围环境和推荐调用的位置。回答第三个问题,

  本文的主要贡献是:

  1. 方法。我们提出了一种新颖的方法,该方法使用对周围代码上下文中细粒度变化的统计学习来创建新的代码完成工具。我们提出了一个新的方向,利用源代码的重复性和细粒度的代码更改。

  2.执行。我们在 APIREC 中实现了我们的方法,APIREC 是一种计算最有可能插入代码中请求位置的 API 方法调用的工具。

  3.实证评价。我们对真实项目的实证评估表明,APIREC 在 API 代码补全方面取得了很高的准确率:59.5% top-1 准确率。这是对最先进方法的改进:30-160% top-1 准确率。我们的评估表明,APIREC 即使在收录 50 个公共项目的一次性最小训练数据集上也表现良好。有趣的是,我们发现在给定代码作者身份的情况下,可以用更少的数据进行训练,但比整个项目的训练效果更好。使用社区语料库训练模型仍然比使用来自项目或个人开发人员的数据进行训练更准确。这一发现表明,开发人员应该获得一个社区训练的模型,然后根据自己的变化历史进一步改进它。

  实验评价

  为了评估 APIREC,我们回答了以下研究问题:

  RQ1:准确性。在推荐 API 调用时,APIREC 的准确性如何?

  RQ2:敏感性分析。训练数据的大小、请求的位置、更改上下文的大小以及代码的上下文等因素如何影响准确性?

  RQ3:运行时间。APIREC 的运行时间是多少?

  

  我们编译两个拆分语料库来训练和测试 APIREC。

  大型语料库。该语料库由 50 个从 Github 中随机选择的具有悠久开发历史的 Java 项目组成。表 3 显示了该语料库中收录的提交数量。根据之前的研究,我们没有选择从集中式版本控制系统迁移到 GitHub 的存储库,以避免大量提交。我们从语料库中的所有提交中提取原子更改。为此,我们遍历所有提交中的所有文件。然后我们使用 GumTree 来计算每个文件的前一个版本和前一个版本之间的原子变化。

  社区语料库。这个较小的语料库收录八个 GitHub 项目,这些项目已被以前的研究人员使用过。表 3 中的第三列列出了有关该语料库的统计信息。我们以同样的方式从这个语料库中提取原子变化。

  我们的目标是调查我们假设的基础,即变化的可重复性。我们假设不同项目和不同程序员执行的更改具有不同程度的可重复性。因此,为了评估项目文化和个人开发者习惯的影响,我们设计了三个场景:

  社区版。我们用大型语料库训练 APIREC,然后在社区语料库上对其进行测试。

  项目版本。对于社区语料库中的每个项目,我们对前 90% 的提交进行了 APIREC 训练,然后对剩余的 10% 的提交进行了测试(10 次验证)。

  用户版。这类似于 Project Edition 方案,但我们每个项目只使用一个用户的提交。我们选择了在每个项目中创作最多提交的用户。

  在这个实验中,我们评估了 APIREC 在大型语料库上训练并在社区语料库上测试时的推荐准确性。我们将 APIREC 与 Raychev 等人的最先进的 API 完成方法进行了比较。我们按照他们的论文中的描述实现了他们的 n-gram API 推荐模型。我们还将 APIREC 与 Bruch 等人进行了比较。(其中一组 API 之间的关联用于推荐)和 GraLan(图形生成模型)。我们使用大型语料库中项目的整个最后快照的源代码训练了所有基于 n-gram、基于集成和基于图形的模型。我们在两个设置中比较了这些方法:1)语料库中所有库中的所有 API,以及 2)JDK 库的 API。

  总结

  这项工作首先利用了 API 代码完成上下文中细粒度代码更改的规律性。虽然以前的方法利用了代码令牌习语的规律性,但在本文中,我们通过我们在细粒度代码变体上训练的统计学习模型解决了 API 方法建议的问题。当我们在大型语料库中挖掘它们时,属于更高级别意图的更改将比特定于项目的更改更频繁地出现。我们的综合实证评估表明,对于排名前 1 的提案,APIREC 将最先进的工具提高了 30-160%。即使使用收录 50 个公开可用项目的一次性最小训练数据集,它也表现良好。

  我们发现,与针对整个项目的变更进行培训相比,针对个别变更对模型进行培训可获得更高的准确性。因此,推荐人可以从大量的社区物品中训练出来,个人用户可以根据自己的变化进一步完善模型。

  谢谢你

  本文由2017级博士生杨依琳翻译转载。来自南京大学软件学院。

  汇总:3个网络采集网站推荐,如果不会爬虫,就交给它们吧!

  来源/钱塘大数据

  作为极客们最喜欢的数据采集方式,爬虫的高度自由和自主性使其成为数据挖掘的必备技能。当然,熟练掌握python等语言是必要的前提。

  使用爬虫可以做很多有趣的事情,当然也可以获得一些其他渠道无法获得的数据资源。更重要的是,它帮助你打开了寻找和采集数据的思路。

  - 使用爬虫爬取网络图片 -

  爬取的图片素材

  你看某网站上的图片正是你需要的,但是单独下载太麻烦了,所以你可以用爬虫快速抓取,按照标签、特征、颜色和分类其他信息存储。从此不缺设计素材,不缺美图,就连打斗图也多了几分底气。

  - 使用爬虫爬取优质资源 -

  

  爬取音乐资源

  我们一直想快速采集优质的网络资源,但是人工搜索比对太麻烦,用爬虫就可以轻松解决。比如爬取知乎点赞数最多的文章列表,爬取网易云音乐评论数最多的音乐,爬取豆瓣评分高的电影或书籍……总之,你可以拒绝平庸,从现在开始。

  - 利用爬虫获取舆情数据-

  爬取招聘网站职位信息

  例如,可以批量抓取社交平台数据资源,抓取网站的交易数据,抓取招聘网站的职位信息等,可用于个性化分析和研究。

  下面介绍三个网站工具,不需要技术成本,被很多用户作为初级采集工具使用

  1. - 优采云采集器 -

  

  一款专业的互联网数据抓取、处理、分析、挖掘软件,可以灵活快速抓取网页上零散的数据信息,并通过一系列的分析处理,准确挖掘出需要的数据。最常用的是采集一些网站文字、图片、资料等网上资源。接口比较齐全,支持的扩展也比较好用。如果您知道代码,则可以使用 PHP 或 C# 开发任何功能的扩展。

  2. - 优采云 -

  简单实用采集器,功能齐全,操作简单,无需编写规则。云采集独有,即使机器关机也可以在云服务器上运行采集任务。

  3. - 吉索克 -

  一款简单易用的网页信息抓取软件,可抓取网页文本、图表、超链接等多种网页元素,提供简单易用的网页抓取软件、数据挖掘策略、行业资讯及裁剪-边缘技术。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线