基于上下文分析的 Python 实时 API 推荐
原文来自微信公众号“编程语言Lab”:基于上下文分析的 Python 实时 API 推荐
搜索关注 “编程语言Lab”公众号(HW-PLLab)获取更多技术内容!
欢迎加入 编程语言社区 SIG-程序分析 参与交流讨论(加入方式:添加文末小助手微信,备注“加入 SIG-程序分析”)。
作者 | 何欣程
编辑 | Skylar
作者简介
何欣程,南京大学计算机系软件质量研究所博士生,研究方向为程序分析,编程辅助。
视频回顾
编程语言技术沙龙|第16期:基于上下文分析的 python 实时 API 推荐
1 研究介绍
API 推荐一直是一个热门话题,相关的工作 1 也很多。当前的 API 推荐主要分为两类,一类是基于自然语言查询的 API 推荐,这类工作更加关注自然语言文本相关信息,像众包信息和 API 文档等。例如 16 年的 RACK,通过从 Stack Overflow 的众包知识中提取关键词 - API 映射提供相关 API 列表推荐。18 年的 BIKER 通过 word embedding 方法计算两段文本描述的相似度,根据 Stack Overflow 文本和 API 文档的相似度进行排序。
相比来说,基于代码上下文的 API 推荐在实际开发过程中使用更多的一般都是各大语言 IDE 中的智能代码补全插件,这类插件就涵盖了比较全面的 API 推荐功能,比如基于 Typeshed 的 Pycharm 补全功能以及 Vscode Intelli 系列的智能插件等等。
在论文方面,基于代码的 API 推荐更多的是应用在静态语言上,例如 Java,C,C++ 等,但针对动态语言的较少一些。关于 Python 的一共有三篇,其中两篇都是利用 AST 信息来进行学习决策。但在实时场景下,Python Parser 并不能解析出可用的 AST,这就在 IDE 等场景下,给具体的落地应用带来挑战。
2 实时场景下的 API 推荐
目标与挑战
基于这个问题,我们就尝试暂时从 AST 上挪开视线,提出一种利用如 Tokenflow、Dataflow 等上下文信息来进行实时 Python API 推荐的方法。具体来说,实时场景下的 API 推荐,我们将其定义为,针对形如 caller.API 的 recommendation hole,我们在仅知 hole 之前的代码情况下,提供排序后的 API 候选表。
而要达成这个目标,需要解决两方面的挑战。首先,是 Python 本身的动态特性。Python 具有类型动态性、路径敏感性,传统的静态分析方法在上面要么失败要么难以得到足够精准的结果。其次,在实时场景下,代码的语法语义都不完整,给静态程序分析带来很大难题,缺乏代码开发历史,针对一些基于历史变更学习的方法带来挑战。此外,实时性推荐也需要一些在线的轻量级的分析过程。
Visual Studio IntelliCode 的局限性
面对这些挑战,基于学习的 API 推荐方法往往比大多数传统方法具有更好的性能。然而,它们也有一些局限性。Visual Studio IntelliCode 是最先进的 Python 推荐工具之一。它是以学习为基础的。我们使用它来演示这种方法的一些局限性。
首先,推荐 API 的能力很大程度上依赖于 API 调用对象的类型推断结果。例如,当调用方类型未知时,没有可收集的候选 API。Intellicode 对推荐点 kwargs 产生 NULL 推荐。原因是它不能推断调用者对象的类型。
其次,即使可以成功推断对象类型,Intellicode 生成的推荐列表也有可能只包含字母顺序的候选对象。主要原因是基于学习的方法在推荐频繁调用的 API 方面做得很好,而不是项目特定的 API。
另外,即使 IntelliCode 成功地推荐了一些被标记为星号的候选人,这些推荐也可能是错误的。在例子中, IntelliCode 提供星号标记的 API,但排名前 4 的答案都不正确,但可能在训练集中使用频率更高。这个问题的产生部分是由于机器学习的不确定性。
PyART——从不完整的 Python 上下文中提取数据流
PyART 提供了一种从不完整的 Python 上下文中提取数据流的有效方法,我们称它为乐观的,因为这样的数据流既不 sound 也不 complete,但足以提供 API 建议,收集起来也具有成本效益。核心思想是模拟人类直觉,这与传统的数据流分析不同。传统的数据流分析试图在基本块的边界上获取过程中每个点的信息,并限定每个块的进入状态和退出状态。控制流用于确定一个值如何传播。然而这对于 Python 来说是困难的。
相比之下,人类主要基于局部符号信息来推断数据流。例如,他们考虑周围的变量和代码结构。因此,PyART 定义了从五个基本抽象语法单元派生近似数据流的规则。
Rule1: Assignment
规则 1 是对赋值做了一个约束,对于位于位置 l 之前的右侧操作数 e 中的任何变量和方法对象 u,都有数据流从 u 流向左侧操作数 v。这里,标识符 VM 表示表达式中的所有变量和方法对象,DFS(v) 表示涉及对象 v 的所有数据流路径。
Rule2: Loop
规则 2 是循环指定数据流提取,即从迭代器 e 到循环变量 v 中的任何变量或方法对象中有数据流流向。
Rule3: Object attribute access/invocation
规则 3 是关于属性加载和调用的,如果一个对象 u 访问了一个字段属性或调用了一个方法属性 v,在 u 和 v.n 之间有数据流。
Rule4: Container access
规则 4 是为容器访问指定了数据流,如果容器 v 通过索引 e 访问,则数据流从 e 中的任何对象 u 到容器对象 v。
Rule5: Function parameter passing
规则 5 是用于函数参数传递,它指定任何参数 e 中涉及的任何变量都有数据流流向函数 f。
Rule6: Function parameter passing
由于这五个单元可能以组合的形式出现,所以规则 6 聚合了从单个单元派生的数据流关系。
Rule7: Propagation
此外,PyART 根据传播规则对流的效果进行建模。例如,如果 line1 中有一个关于 x 的数据流,它将在 line1 之后关于 x 的其他位置传播。
Rule8: Preservation
最后,规则 8 保留所有变量或方法对象不受单位影响的数据流关系 (因此应该删除)。
编码器根据收集到的特征,生成一个包含四个元素的特征向量,包括:数据流提示,token 相似性、caller-API 共现频率以及上下文 token-API 共现频率。在训练过程中,模型构造器使用随机森林进行监督学习。
实验评估结果表明,我们提出的数据流分析方法、API 推荐方法均优于 baseline,且具有轻量级、实时性的优势。
Peng Y, Li S, Gu W, et al, Revisiting, Benchmarking and Exploring API Recommendation: How Far Are We?[J]. arXiv preprint arXiv:2112.12653, 2021. ↩︎
相关文章:
基于上下文分析的 Python 实时 API 推荐
原文来自微信公众号“编程语言Lab”:基于上下文分析的 Python 实时 API 推荐 搜索关注 “编程语言Lab”公众号(HW-PLLab)获取更多技术内容! 欢迎加入 编程语言社区 SIG-程序分析 参与交流讨论(加入方式:添加…...
软件测试-接口测试-代码实现接口测试
文章目录 1.request1.1 request介绍1.2 发送get请求1.3 发送set请求1.4 其他请求方式1.5 传递url参数1.6 响应内容解析1.7 cookie1.8 设置session2.集成UnitTest2.1 接口测试框架开发2.2 案例:使用TPShop项目完成对登录功能的接口测试1.request 1.1 request介绍 概念 基于py…...
中村成洋《垃圾回收的算法与实现》PDF 读书笔记
观前提醒 为了能够锻炼自己,我会查阅大量外文不停的修改内容,少部分会提示成中文。 可能有误,请见谅 提示:若是觉得阅读困难,可以看如下内容 脚本之家可获取,若失效可私信浏览器的沙拉查词扩展…...
docker 网络模式
docker 网络模式主要分为四种,可以通过docker network ls 查看 ~$ docker network ls NETWORK ID NAME DRIVER SCOPE a51d97d72f10 bridge br…...
数据库开发(一文概括mysql基本知识)
Mysql 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 关系型数据库(Relational Database Management System:关系数据库管理系统)应用软件之一。mysql在问开发中,几乎必不可少,因为其他的可能是要收费的&#x…...
【JVM】详解Java内存区域和分配
这里写目录标题一、前言二、运行时数据分区2.1程序计数器(PC)2.2 Java虚拟机栈2.3 本地方法栈2.4 Java堆2.5 方法区2.5.1 运行时常量池2.6 直接内存三、HotSpot虚拟机对象探秘3.1 对象的创建3.2 对象的内存布局3.3 对象的访问定位一、前言 C/C需要自行回收和释放已经没用的对象…...
JAVA开发(史上最完整追本溯源JAVA历史、发展和学习)
(第二次世界大战1931-1945) 世界上最先进的技术往往是由于战争催生,在第二次世界大战中除了飞机,坦克和大炮的武器较量外,在隐秘战线的情报工作其实更为重要,在军队将领来往的电报中,为了防止军事情报的泄漏ÿ…...
Qt 防止程序退出
文章目录摘要QWidgetQML方法 1方法 2关键字: Qt、 eventFilter、 Close、 键盘、 任务管理器摘要 今天要聊得内容还是怎么防止别人关闭我的程序,之前都是在win下面,一般都是用过钩子连捕获键盘事件,完了吧对应的事件忽略&#x…...
【校验码 - 循环冗余校验码CRC】
水善利万物而不争,处众人之所恶,故几于道💦 目录 循环冗余校验码 1.多项式 2.CRC编码的组成 3.校验码的生成 4.例题: 循环冗余校验码 广泛地在网络通信及磁盘存储时采用。 1.多项式 在循环冗余校验(CRC)码中,无一例…...
【Rust】一文讲透Rust中的PartialEq和Eq
前言 本文将围绕对象:PartialEq和Eq,以及PartialOrd和Ord,即四个Rust中重点的Compare Trait进行讨论并解释其中的细节,内容涵盖理论以及代码实现。 在正式介绍PartialEq和Eq、以及PartialOrd和Ord之前,本文会首先介绍…...
Vulnhub靶场----9、DC-9
文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-9下载地址:https://download.vulnhub.com/dc/DC-9.zip kali:192.168.144.148 DC-9:192.168.144.158 二、渗透流程 1、信息收集nmap -T5 -A -p- -sV -sT 192.168.144.158思路&am…...
使用Containerd搭建K8s集群【v1.25】
[toc] 一、安装要求 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 一台或多台机器,操作系统 CentOS7.x-86_x64硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多集群中所有机器之间网络互通可以访问外网,需要拉取镜像禁止swap分区二、准备环境 角色IP…...
NMT - 构建双语概率词典(Probabilistic dictionaries)
文章目录一、安装依赖包mosesdecoder安装 mgiza二、数据预处理三、训练本文参考:How to train your Bicleaner https://github.com/bitextor/bicleaner/wiki/How-to-train-your-Bicleaner 一、安装依赖包 这个过程主要依赖于 mosesdecodermgiza mosesdecoder git…...
《ChatGPT是怎样炼成的》
ChatGPT 在全世界范围内风靡一时,我现在每天都会使用 ChatGPT 帮我回答几个问题,甚至有的时候在一天内我和它对话的时间比和正常人类对话还要多,因为它确实“法力无边,功能强大”。 ChatGPT 可以帮助我解读程序,做翻译…...
Streaming System是第一章翻译
GIthub链接,欢迎志同道合的小伙伴一起翻译 Chapter 1.Streaming101 如今,流数据处理在大数据中是非常重要的,其主要原因是: 企业渴望对他们的数据有更及时的了解,而转换到流处理是实现更低延迟的一个好方法…...
abap MODIFY常用语法解析
MODIFY 是既可以操作数据又可以操作内表的一个语法, 实现的逻辑都一样. 如果你内表或数据库中存在该行数据会对该行数据进行更新. 如果不存在,就会插入数据. , 1.如果it_tab是带有标题行的内表,是可以忽略FROM wa_tab工作区的 MODIFY it_tab .2.把工作区wa_tab中的数据更新…...
[媒体分流直播]媒体直播和传统直播的区别,以及媒体直播的特点
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 直播毋庸置疑已经融入到了我们生活的方方面面,小到才艺,游戏,大到政策的发布,许多企业和机构也越来越重视直播,那么一场活动怎…...
打地鼠游戏-第14届蓝桥杯STEMA测评Scratch真题精选
[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第102讲。 蓝桥杯选拔赛现已更名为STEMA,即STEM 能力测试,是蓝桥杯大赛组委会与美国普林斯顿多…...
链表经典刷题--快慢指针与双指针
本篇总结链表解题思路----快慢指针,其实也就是双指针,这个快慢并不单纯指“快慢”,它更多的可以表示,速度快慢,距离长度,时间大小等等,用法很有趣也很独特,理解它的思想,…...
【Java集合框架】篇四:Set接口
1. Set及主要实现类特点 Set:无序、不可重复(去重)、存储value HashSet:底层使用HashMap,即使用 数组单项链表红黑树 结构进行存储。(jkd8中) LinkedHashSet:是HashSet的子类&…...
Python 数据库连接 + 创建库表+ 插入【内含代码实例】
人生苦短 我用python Python其他实用资料:点击此处跳转文末名片获取 数据库连接 连接数据库前,请先确认以下事项: 您已经创建了数据库 TESTDB.在TESTDB数据库中您已经创建了表 EMPLOYEEEMPLOYEE表字段为 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。连…...
DSS 部署环境需求清单
文章目录 DSS系统需求项目地址计算资源计算基准:计算引擎程序硬件需求表 :DSS计算及存储资源需求计算资源计算基准:计算程序硬件需求表:DSS系统需求 项目地址 https://github.com/WeBankFinTech/DataSphereStudio 计算资源计算基准: 1.日活用户10万。 2.单用户单日总…...
Python的面向对象,详细讲解Python之用处等基本常识
目录 Python 面向对象 面向对象技术简介 创建类 实例 实例 self代表类的实例,而非类 实例 创建实例对象 访问属性 实例 Python内置类属性 实例 python对象销毁(垃圾回收) 实例 实例 类的继承 实例 方法重写 实例 基础重载方法 运算符重载 实例…...
如何使用固态继电器为恒温器供电
恒温器有两种电源:电池和 24VAC。恒温器需要电池才能不间断地运行。电池消耗的能量尽可能低非常重要,但即使您最大限度地减少消耗,这仍然不是一个用户友好的选择,因为电池会不时需要更换。要降低更换频率,可以使用 24V…...
【LeetCode】剑指 Offer(14)
目录 题目:剑指 Offer 32 - I. 从上到下打印二叉树 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:剑指 Offer 32…...
Rman单实例迁移到单实例
关于同平台同版本数据库之间的迁移操作的实验 ---Source DB[rootoracle-db-19cs ~]# cat /etc/redhat-release CentOS Stream release 8 [rootoracle-db-19cs ~]# --- Target DB[rootoracle-db-19ct ~]# cat /etc/redhat-release CentOS Stream release 8 [rootoracle-db-19ct…...
毕业设计 基于stm32舞台彩灯控制器设计app控制系统
基于stm32舞台彩灯控制器设计app控制1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STM32F103C8T6核心系统电路设计2.2 WS2812RGB彩灯电路设计3、部分代码展示3.1 控制WS2812显示颜色3.2 设置RGB灯的颜色,角度,亮度实物图1、项目简介 选题指导…...
【MyBatis】篇一.
文章目录1、MyBatis概述2、环境搭建1、MyBatis概述 认识: JavaEE开发的一个套件SSM,即: MyBatis是一个持久层的框架,是对JDBC的一个封装,是一个半自动的ORM框架。 ORM即实体类对象和数据库中的数据的一个映射关系&am…...
【JavaScript速成之路】JavaScript流程控制
📃个人主页:「小杨」的csdn博客 🔥系列专栏:【JavaScript速成之路】 🐳希望大家多多支持🥰一起进步呀! 文章目录前言1,流程控制2,分支结构2.1,if语句2.2&…...
18、基准测试,sysbench
基准测试,sysbench 1. sysbench1.1 用途1.2 安装1.3 版本1.4 查看帮助1.5 测试过程阶段2 CPU 性能测试2.1 测试原理2.2 查看帮助2.3 测试3. 内存性能测试3.1 查看帮助信息3.2 测试过程4.磁盘性能基准测试4.1 查看帮助4.2 生成文件(prepare)4.3 测试文件io(run)4.4 结果分析4.5…...
中国做视频网站有哪些/黑帽seo排名优化
目录 影响范围 漏洞介绍 测试环境 漏洞复现 使用sam-the-admin.py 2021 年 11 月 9 日,国外研究员在推特上发布了 Active Directory 相关的 CVE,CVE-2021-42278 & CVE-2021-42287 ,两个漏洞组合可导致域内普通用户权限提升至域管权限…...
一个数据库怎么做二个网站/百度收录技术
今天终于考完了70-528,长长舒口气 呵呵,可以安安心心的回国度假了。这次考试真是一波三折啊。下面先说说考试过程 一个月前开始准备考MCTS,但是当时只是似懂非懂这个东西,一直都觉得可有可无,所以当时也没有太放在心上。天天70-536的Training…...
c语言做网站后台服务/微信营销的模式有哪些
以下是一个示例的正则表达式,用于匹配招聘广告中的每月收入信息: 每个月(\d(,\d{3})*(\.\d{2})?)元说明: \d 表示一个数字字符(,\d{3})* 表示可以有多个三位数的千位分隔符(\.\d{2})? 表示可能有一个两位数的小数部分 使用这个正则表达式&a…...
大连住建委网站/qq群推广平台
第1章 Linux内核的简介1.1 UnixUnix强大的根本原因Unix很简洁:仅提供几百个系统调用并且有一个非常明确的设计目的;所有东西都被当做文件对待:提供一套系统调用接口—open()、read()、write()、lseek()和close();用C语言编写而成&…...
深圳高端家具公司/上海专业seo排名优化
C初始化之超级大坑起因类中定义成员变量的初始化问题解决方法采用如下初始化方法栈区定义类的加括号与不加括号问题起因 平时很少用leetcode写题(一般都是用ACWing)今天看到个题用leetcode写了哈,结果遇到了两个语法大坑 类中定义成员变量的…...
大连网站建设培训班/新手如何找cps推广渠道
基本了解:mysql数据库为关系型数据库,个关系型数据库由一个或数个表格组成,表格中肯定有键(键(key): 表中用来识别某个特定的人物的方法, 键的值在当前列中具有唯一性。)登录mysql(记得配置环境变量)管理员模式打开cmd启动服务net start mysq…...