当前位置: 首页 > 专利查询>南京大学专利>正文

一种基于上下文分析的PythonAPI实时推荐方法技术

技术编号:32849573 阅读:13 留言:0更新日期:2022-03-30 19:01
本发明专利技术为一种基于上下文分析的Python API实时推荐方法。其特征是首先提取Python代码上下文中调用点;接着对每个调用点进行类型推断,若推断成功,使用推断类型可调用方法作为API候选集,否则从标准库API、第三方库API以及当前上下文定义API这三方面生成;接着从五方面约束提取仅含真阳性的数据流序列:赋值操作、循环结构、属性访问/调用、容器访问以及函数参数传递;然后通过上下文分析收集三方面特征,即数据流序列、token相似度和共现规则,将特征编码为特征向量;接着对特征向量进行标记,将所有标记后向量放入随机森林模型训练;最后基于训练好的推荐模型,将推荐结果按照概率得分进行排序并呈现给开发者。率得分进行排序并呈现给开发者。率得分进行排序并呈现给开发者。

【技术实现步骤摘要】
一种基于上下文分析的Python API实时推荐方法


[0001]本专利技术属于计算机
,尤其是软件
本专利技术提出了一种基于上下文分析的Python API实时推荐方法,对于形如“[Expression.]APIName”的位置,在实时推荐场景条件下,即仅知当前推荐点前的不完整上下文条件下,也能在极短时间内提供准确的Python API 推荐表,其中,“[Expression.]”是用于限制被调用的API方法的受限表达式,可以是变量名、函数名等,并保证无论是在项目内还是跨项目开发过程中都能有较好的准确性和较高的效率。

技术介绍

[0002]在软件开发过程中,API推荐能够帮助开发者迅速在庞大的API库中找到当前开发场景下最适合调用的API,具有提高软件开发效率的作用。在开发过程中根据当前开发文本为开发者实时推荐最可能调用的API,能够极大地帮助开发者提高编程效率。虽然有关API推荐的研究很多,但由于大多数研究均是针对于Java等静态语言开展的,目前针对动态语言如 Python的API推荐相关工作相对较少,其原因在于动态语言特性以及Python本身特点带来的挑战。
[0003]首先,Python具有类型动态性。对于API推荐工作“[Expression.]APIName”,通用推荐思路是:首先推断调用点[Expression.]类型,确定API候选集,随后进行API推荐。但是,在 Python中,定义一个变量并不会显式声明其具体类型(除非经过类型标注)。作为一种解释执行的动态语言,Python只有经过运行才能知道一个变量具体的类型是什么。并且,即便已经知道某行某变量的类型,但在运行过程中,该类型仍然有可能变化。其次,Python具有路径敏感性。不同的执行路径可能带来不同的数据类型,而具体走哪条路径也只有执行时才能知道。当一个变量的类型无法确定时,只能选择将所有可能类型的所有方法全部输出来作为API 推荐序列,导致推荐序列非常冗长。再次,Python含有大量使用其他语言实现的第三方库(如 numpy等),难以进行溯源分析。
[0004]当前普遍使用的Python开发工具如PyCharm、Jetbrains等使用python-skeletons提供第三方库的API定义文件,为当前代码提供API推荐;Mypy是Python的静态类型检查工具,通过python/typeshed记录Python库相关信息。现有开发工具的推荐序列大多按照字母表顺序排列,并不能为程序员提供最相关的API推荐序列。而且,由于Python第三方库多由其他语言实现,关于Python库定义信息的集合并不完整,所以现有的工具并不能有效为开发人员提供最佳推荐。
[0005]此外,实时API推荐也是一项十分困难的工作。对于实时推荐应用场景,当前所在项目代码上下文一般均为语法语义不完整的代码,因此无法对该代码进行传统的程序分析,如从语法上分析生成语法分析树(AST),进行完整的数据流分析、控制流分析、指针分析,动态插桩分析等,无论是对调用点类型推断还是对API推荐(尤其是基于程序分析特征进行训练的推荐方法)都带来了极大的挑战。
[0006]同时,项目自身也具有特殊性。实时代码推荐通常用于在开发者开发过程中进行
推荐,因此大部分项目并不具备历史代码信息且具有特殊性,对于依靠重复历史代码变更、使用机器学习/深度学习等技术进行推荐的方法带来了挑战和困难。
[0007]为此,本专利技术的主要目标是研究一种能够针对实时场景提供准确Python API推荐的技术。对于形如“[Expression.]APIName”的位置,在实时推荐场景条件下,即仅知当前推荐点前的不完整上下文条件下,也能在极短时间内提供准确的Python API推荐表。

技术实现思路

[0008]本专利技术的主要工作是提出一种基于上下文分析的Python API实时推荐方法。首先,本专利技术关注的是Python API推荐候选集生成的问题,研究如何在Python类型动态性导致类型信息无法获取的情况下进行有效的API候选集生成。其次,考虑如何对语法/语义不完整的Python 上下文进行静态数据流分析,尽可能准确地提取限定于API推荐的有效数据流信息。基于此,考虑对当前上下文进行三方面的特征提取,包括数据流序列、token相似性及共现规则。然后,考虑如何对提取的特征进行编码生成对应向量。最后,考虑对提取的特征进行训练,给出一种精确有效的推荐模型。针对以上问题,本专利技术的内容如下:
[0009]1.Python API推荐候选集生成。候选集生成是API推荐工作的基础,针对推荐点“[Expression.]APIName”,本专利技术首先对调用API的对象“[Expression]”进行类型推断。由于 Python类型动态性,类型推断工作往往失败。若能成功推断对象类型,本专利技术收集该类型所有可调用方法作为候选API;否则,本专利技术从三方面进行候选集的生成:标准库API、第三方库API以及在当前项目已有上下文中被定义的方法。
[0010]2.Python静态数据流分析。本专利技术发现经过约束的数据流序列信息可以对API推荐提供有效的提示,并分别从五方面约束提取仅含真阳性(True Positive)的数据流序列:赋值操作、循环结构、属性访问/调用、容器访问以及函数参数传递。初步实验结果显示,本数据流分析方法可达到较高的查准率(98.66%)和查全率(98.48%),而当前已有的Python静态分析工具,如Pysonar2,尽管有很高的查准率,其查全率却极低(43.88%),无法被应用于实际的数据流关系提取和API推荐工作。
[0011]3.基于上下文分析的特征提取及向量生成。含API的数据流序列可以为API推荐提供提示,因此,本专利技术基于上一步提出的分析方法,从开源代码库Github的100个流行Python 项目中提取含API的数据流序列,并使用N-Gram模型对提取的数据流序列进行训练,学习包含正确API的数据流的顺序。针对一个调用点“[Expression.]APIName”,本专利技术首先提取现有上下文中含当前调用点位置的所有数据流序列,基于第1步的候选集生成方法,对于候选集中的每个候选API,将API代入提取出的数据流序列中组成一个候选数据流序列,并将该数据流序列作为输入发送到预训练好的N-Gram模型中,N-Gram模型输出该候选数据流序列的对数几率得分,并将该得分作为特征向量的第一个元素。此外,由于数据流序列中各token 的相似度对API推荐能起到辅助作用,如对于语句“logger=Logging.getlogger(...)”语句,函数返回值变量“logger”与正确API“getlogger”具有公共子串“logger”。因此本专利技术将数据流序列中各token与候选API的相似度得分作为特征向量第二个元素。最后,由于当前上下文中各token 与API在语料库中的共现频率也可以为推荐提供提示,因此本专利技术分别将调用API的对象“[Expression]”与候选API在语料库本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于上下文分析的Python API实时推荐方法,其特征是对于形如“[Expression.]APIName”的代码,在实时推荐场景条件下,即仅知当前推荐点前的不完整上下文条件下,能在极短时间内提供准确的Python API推荐表,其中,“[Expression.]”是用于限制被调用的API方法的受限表达式,可以是变量名、函数名等,流程需要首先针对API调用点处生成API候选集;接着对语法/语义不完整的Python上下文进行静态数据流分析,提取限定于API推荐的有效数据流信息;接着对当前上下文进行三方面的特征提取,包括数据流序列、token相似性及共现规则,对提取的特征进行编码生成对应向量;最后对提取的特征进行训练,给出一种精确有效的推荐模型。2.根据权利要求1所描述的一种基于上下文分析的Python API实时推荐方法,其特征包括以下几个步骤:1)识别上下文调用点,并针对需要被推荐的API位置进行候选集生成;2)基于启发式方法,对语法/语义不完整的Python上下文进行静态数据流分析,提取限定于API推荐的有效数据流信息;3)对当前上下文进行有效静态分析,提取三方面特征:数据流序列、token相似性及共现规则,生成对应特征向量;4)基于随机森林算法,对生成的向量进行学习,给出精确有效的推荐模型。3.根据权利要求2所述的一种基于上下文分析的Python API实时推荐方法,其特征是步骤1)中识别上下文调用点,并针对需要被推荐的API位置进行候选集生成,其中,调用点为形如“[Expression.]APIName”的位置,“[Expression.]”是用于限制被调用的API方法的受限表达式,可以是变量名、函数名等;接着,对于调用点处调用API的对象进行类型推断,若类型推断成功,则收集推断类型可调用方法作为候选集,否则结合import信息从以下三方面进行候选集生成标准库API、第三方库API及在当前项目已有上下文中被定义的方法。4.根据权利要求2所述的一种基于上下文分析的Python API实时推荐方法,其特征是步骤2...

【专利技术属性】
技术研发人员:许蕾何欣程徐宝文
申请(专利权)人:南京大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1