您好,欢迎来到微智科技网。
搜索
您的当前位置:首页一种基于程序分析和文本分析的Python代码参考信息生成方法[发明专利]

一种基于程序分析和文本分析的Python代码参考信息生成方法[发明专利]

来源:微智科技网
(19)中华人民共和国国家知识产权局

(12)发明专利申请

(10)申请公布号 CN 110750297 A(43)申请公布日 2020.02.04

(21)申请号 201910970630.4(22)申请日 2019.10.11

(71)申请人 南京大学

地址 210023 江苏省南京市仙林大道163号(72)发明人 许蕾 陶英 徐宝文 (51)Int.Cl.

G06F 8/75(2018.01)G06F 8/73(2018.01)

权利要求书2页 说明书5页 附图2页

CN 110750297 A(54)发明名称

一种基于程序分析和文本分析的Python代码参考信息生成方法(57)摘要

本发明为一种基于程序分析和文本分析的Python代码参考信息生成方法:首先,对Python代码中的函数调用场景进行分类并提取项目中函数定义和注释作为函数的参考信息;其次,对于函数调用场景中函数来源(模块Module,类Class)可以确定的情况,使用静态分析工具生成函数调用图,建立函数调用和函数参考信息的一一映射关系;然后,考虑同名函数的情况,为了确定调用函数的Class实例的类型,使用基于文本分析技术的类型推导,给出推导的类型并根据类型建立函数调用和函数参考信息的一一映射关系;接着,针对类型无法推导的情况,基于协同过滤算法,为Class实例的函数调用推荐同名函数中对应的函数参考信息。

CN 110750297 A

权 利 要 求 书

1/2页

1.一种基于程序分析和文本分析的Python代码参考信息生成方法,其特征是对项目以及其依赖库和Python标准库,提取出所有函数的定义和注释作为函数调用时的参考信息;接着,对项目使用静态分析工具生成函数调用图,建立函数调用和函数参考信息的映射;接着,基于文本分析的方法,为Class实例推导类型,根据类型确定函数调用和函数参考信息的映射;最后,基于协同过滤算法,为Class实例的函数调用推荐同名函数中对应的函数参考信息。

2.根据权利要求1所描述的一种基于程序分析和文本分析的Python代码参考信息生成方法,其特征包括以下几个步骤:

1)对项目以及其依赖库和Python标准库,提取出所有函数的定义和注释等信息作为函数调用时的参考信息来源;

2)基于静态分析的函数调用图生成技术,对于非Class实例的函数调用,同一个Class内部函数之间的调用以及Python内置函数调用的场景,建立函数调用和函数参考信息的映射;

3)基于文本分析的自然语言处理技术,提取变量名中的自然语言特性作为特征向量,为类型域中每个类型训练出一个分类模型,进而为Class实例推导类型,建立Class实例的函数调用和函数参考信息的映射;

4)基于协同过滤的算法,使用具有与该函数同名的方法的Class的属性、函数调用信息,以及使用上下文中Class实例的属性、函数调用信息来为Class实例的函数调用推荐同名函数中对应的函数参考信息。

3.根据权利要求2所述的基于程序分析和文本分析的Python代码参考信息生成方法,其特征是步骤1)中,针对需要生成代码参考信息的项目,分析项目自身以及其依赖库和Python标准库,提取出所有函数的定义和注释作为函数调用时的参考信息;

在分析项目的同时,记录所有的函数调用,分为Class实例的函数调用、非Class实例的函数调用、同一个Class内部函数之间的调用和Python内置函数调用四大类,其中每一条函数调用的完整信息为<序号,路径,Class名,函数调用的类别,是否存在同名的函数调用,参考信息>。

4.根据权利要求2所述的基于程序分析和文本分析的Python代码参考信息生成方法,其特征是步骤2)中,基于静态分析的函数调用图生成技术,使用Pycallgraph工具对项目进行分析得到函数调用关系;对于步骤1)中,非Class实例的函数调用、同一个Class内部函数之间的调用和Python内置函数调用的场景,根据静态分析得到的函数调用关系建立函数调用和函数参考信息的映射。

5.根据权利要求2所述的基于程序分析和文本分析的Python代码参考信息生成方法,其特征是步骤3)中,基于文本分析的自然语言处理技术,提取变量名中的自然语言特性作为特征向量,为类型域中每个类型训练出一个分类模型,进而为Class实例推导类型,建立Class实例的函数调用和函数参考信息的映射;

本发明提取训练集项目中的所有变量名和可以观察到的变量类型,并使用传统的类型推导方法建立变量到其已推导出的类型的映射字典,通过对变量名的预处理得到token序列和基于LDA主题模型的聚类,为每个变量提取特征,包括聚类id,token序列中的名词数、动词数以及变量名和类型名之间的文本相似度;变量的特征向量和对应的类型标签值组成

2

CN 110750297 A

权 利 要 求 书

2/2页

一组实例数据,将所有的实例数据输入到SVM中进行训练得到最终的模型M(t);分类模型M(t)可以预测任意给定的一个变量x是否可能属于类型t及其相应的概率值p。

6.根据权利要求2所述的基于程序分析和文本分析的Python代码参考信息生成方法,其特征是步骤4)中,基于协同过滤的算法,使用具有与该函数同名的方法的Class的属性、函数调用信息以及使用上下文中Class实例的属性、函数调用信息来为Class实例的函数调用推荐同名函数中对应的函数参考信息;

本发明基于协同过滤算法,将同名函数所属的Class以及当前函数调用属于的未知Class实例视为用户(User),将这些Class的属性、方法以及各个同名函数的参考信息视为商品(Item),构建用户-商品评分数据矩阵;与一般的基于协同过滤的算法不同,本发明的算法是对于上下文范围敏感的,这里的上下文范围是指当前函数调用的上下文范围;根据三种不同的上下文范围,即与当前函数调用位于同一个函数、类或者文件,提取上下文范围中所有Class的属性和方法,得到三个用户-商品评分数据矩阵;通过计算用户(Class和未知Class实例)之间的相似度,得到不同上下文范围情况下与未知Class实例最相似的Class,来给当前未知Class实例的函数调用推荐同名函数中对应的函数参考信息。

3

CN 110750297 A

说 明 书

1/5页

一种基于程序分析和文本分析的Python代码参考信息生成

方法

技术领域

[0001]本发明属于计算机技术领域。尤其是软件技术领域。本发明提出了一种基于程序分析和文本分析来对Python代码,尤其是函数生成参考信息(定义、注释等)的方法,能够有效地针对当前代码编辑器和IDE无法识别处理的代码内容生成对应的参考信息,同时对同名函数的参考信息进行有效地区分。

背景技术

[0002]随着互联网技术的高速发展以及软件产业日新月异的变化,面向Web应用、机器学习以及数据分析的软件需求越来越多。作为一种典型的动态编程语言,Python具有在运行时可以改变变量类型和程序结构的特性,其语法简练、使用灵活、编写快捷且具有庞大的类库支持,非常适用于开发业务性强、需求多变以及体积较小的软件系统,已然成为最广泛使用的编程语言之一。Python丰富的类库可以帮助开发人员进行快速开发。[0003]然而,Python开发过程中的常见问题是:开发者难以从庞杂的外部类库中找到自己所需的函数;或者对于某个不熟悉的类库,在编写代码时开发者需要快速了解其属性和函数以保证正确使用。尽管开发人员可以查看类库的官方文档以及使用搜索引擎来解决问题,但前者需花费较大的精力定位自己所需的内容,后者可能会存在误导信息。这些情况都大大增加了开发成本,是Python软件开发者所面临的主要挑战。

[0004]针对这些问题的一个有效解决方案是在软件集成开发环境(IDE)中提供显示代码参考信息的功能。这种提示功能应当通过对于开发人员正在编写的代码的分析,准确地显示代码中数据的类型、函数的定义及注释,帮助开发人员更好地理解类库中的属性和函数,从而提高开发的效率和准确性。

[0005]但由于Python的动态特性,目前的代码编辑器(如VSCode等)以及IDE(如Pycharm等)并不能对代码中所有的内容(类、方法和函数等)生成代码参考信息。因此,本发明的主要目标是研究一种能准确生成Python代码的,尤其是函数的参考信息的方法,着重提升同名函数参考信息的生成精度,弥补当前IDE代码提示功能的不足,有效地帮助开发者理解代码,更好地完成开发任务。发明内容

[0006]本发明的主要工作是提出一种基于程序分析和文本分析有效对Python代码中函数生成参考信息并对同名函数的参考信息进行有效区分的方法。首先,本发明关注的是Python代码中的函数调用和函数参考信息的关联,对Python代码中的函数调用场景进行分类并提取函数定义和注释作为函数的参考信息。其次,对于函数调用场景中函数的来源(模块Module,类Class)可以确定的情况,使用静态分析工具生成函数调用图,建立函数调用和函数参考信息的一一映射。然后,考虑同名函数的情况,为了确定调用函数的Class实例的类型,使用基于文本分析技术的类型推导,给出推导的类型并根据类型建立函数调用和函

4

CN 110750297 A

说 明 书

2/5页

数参考信息的一一映射。最后,针对类型无法推导的情况,基于协同过滤算法,为Class实例的函数调用推荐同名函数中对应的函数参考信息。针对以上问题,本发明的工作和贡献如下:

[0007]1.函数调用场景分类和函数参考信息的提取。本发明将Python的函数调用场景分为,Class实例的函数调用、非Class实例的函数调用、同一个Class内部函数之间的调用和Python内置函数调用四大类。针对需要生成代码参考信息的项目,分析项目自身以及其依赖库和Python标准库,提取出所有函数的定义和注释作为函数调用时的参考信息。对项目分析的同时,记录所有的函数调用,每一条函数调用的完整信息为<序号,路径,Class名,函数调用的类别,是否存在同名的函数调用,参考信息>。

[0008]2.基于静态分析的函数调用图建立函数调用和函数参考信息的映射。对于函数的来源(模块Module,类Class)可以确定的情况,使用静态分析的方法。利用已有的构建Python函数调用图的工具(Pycallgraph,Pyan等),得到函数调用关系,建立函数调用和函数参考信息的映射。可用于处理非Class实例的函数调用、同一个Class内部函数之间的调用和Python内置函数调用的场景。

[0009]3.基于文本分析的类型推导建立函数调用和函数参考信息的映射。由于Python的动态特性,Class实例的函数调用可能无法确定变量(Class实例)的类型,进而对于存在同名函数的情况,无法建立函数调用与函数参考信息的一一映射(仅靠函数名匹配可能会有一对多的映射)。因此我们希望通过基于文本分析的类型推导方法来得到变量的类型,进而建立函数调用和函数参考信息的映射。本发明使用数十个Python项目作为训练集,提取训练集项目中的所有变量名和可以观察到的变量类型,并使用传统的类型推导方法建立变量到其已推导出的类型的映射字典,通过对变量名的预处理得到token序列和基于LDA主题模型的聚类,为每个变量提取特征,包括聚类id,token序列中的名词数、动词数以及变量名和类型名之间的文本相似度。变量的特征向量和对应的类型标签值组成一组实例数据,将所有的实例数据输入到SVM中进行训练得到最终的模型M(t)。分类模型M(t)可以预测任意给定的一个变量x是否可能属于类型t,及其相应的概率值p。[0010]4.基于协同过滤来区分同名函数的参考信息,为Class实例的函数调用推荐同名函数中对应的函数参考信息。由于命名惯例的不确定性,单独利用3中的模型来预测变量类型有时不能奏效。本发明基于协同过滤算法,将同名函数所属的Class以及当前函数调用属于的未知Class实例视为用户(User),将这些Class的属性、方法以及各个同名函数的参考信息视为商品(Item),构建用户评分数据矩阵。与一般的基于协同过滤的算法不同,本发明的算法是对于上下文范围敏感的,这里的上下文范围是指当前函数调用的上下文范围。根据三种不同的上下文范围:与当前函数调用位于同一个函数、类、文件,提取上下文范围中所有Class的属性和方法,得到三个用户评分数据矩阵。通过计算用户(Class和未知Class实例)之间的相似度,得到不同上下文范围情况下与未知Class实例最相似的Class,来给当前未知Class实例的函数调用推荐同名函数中对应的函数参考信息。通过人工审查同名函数的参考信息,以及通过执行动态测试确定函数调用处的Class实例的实际类型可以发现,对于3中类型推导不能奏效的情况,本发明提出的推荐方法可以为同名函数推荐对应的函数参考信息。

5

CN 110750297 A

说 明 书

3/5页

附图说明

[0011]图1为本发明基于文本分析的类型推导示意图[0012]图2为本发明基于协同过滤的算法流程示意图

[0013]图3为本发明基于程序分析和文本分析的Python代码参考信息生成示意图具体实施方式

[0014]本发明具体包括以下步骤:

[0015]1)首先针对需要生成代码参考信息的项目,分析项目自身以及其依赖库和Python标准库,提取出所有函数的定义和注释作为函数调用时的参考信息来源。[0016]2)对项目进行分析时,记录所有的函数调用,分为Class实例的函数调用、非Class实例的函数调用、同一个Class内部函数之间的调用和Python内置函数调用四大类。针对每处函数调用生成一条信息。

[0017]3)使用基于静态分析的函数调用图生成技术,对于非Class实例的函数调用,同一个Class内部函数之间的调用以及Python内置函数调用的场景,建立函数调用和函数参考信息的映射。

[0018]4)使用基于文本分析的自然语言处理技术,提取变量名中的自然语言特性作为特征向量,为类型域中每个类型训练出一个分类模型,进而为Class实例推导类型,建立Class实例的函数调用和函数参考信息的映射。[0019]5)使用基于协同过滤的算法,使用具有与该函数同名的方法的Class的属性、函数调用信息,以及使用上下文中Class实例的属性、函数调用信息来为Class实例的函数调用推荐同名函数中对应的函数参考信息,以此作为函数调用和函数参考信息的映射。[0020]6)根据步骤3)、4)和5)中得到的函数调用和函数参考信息的映射,结合步骤1)中的函数参考信息来源,可以在函数调用处生成函数参考信息。[0021]步骤1)中提取函数参考信息的流程如下:对于需要生成代码参考信息的项目,对项目内所有的源代码文件(.py文件),提取函数定义的内容(包括函数名和参数列表),通过AST解析提取函数的文档字符串(docstring)作为函数参考信息中的注释,docstring是Python独有的注释方式,是包,模块,类或函数里的第一个语句,惯例是使用三重双引号″″″。若AST解析失败则使用正则匹配提取docstring。将函数定义和注释整合作为函数的参考信息。对于项目的所有依赖库,Python标准库的处理按照同样的方法进行。[0022]步骤2)对项目分析的同时,记录所有的函数调用,分为Class实例的函数调用、非Class实例的函数调用、同一个Class内部函数之间的调用和Python内置函数调用四大类。每一条函数调用的完整信息为<序号,路径,Class名,函数调用的类别,是否存在同名的函数调用,参考信息>。

[0023]步骤3)基于静态分析的函数调用图生成技术,使用Pycallgraph工具对项目进行分析得到函数调用关系。对于步骤2)中,非Class实例的函数调用、同一个Class内部函数之间的调用和Python内置函数调用的场景,可以根据静态分析得到的函数调用关系建立函数调用和函数参考信息的映射。

[0024]Pycallgraph是一个Python调用图的可视化分析工具。它使用一个名为sys.set_trace()的Python调试函数,该调试函数在代码每次进入或离开函数时都会进行回调。这

6

CN 110750297 A

说 明 书

4/5页

样,Python调用图就可以跟踪每个被调用函数的名称,以及哪个函数被调用,每个函数使用的时间,调用次数等。Pycallgraph不仅可以生成GraphViz的DOT文件还可以生成JSON文件,通过对Output类进行子类化,创建自定义输出。本发明基于Pycallgraph工具生成JSON文件建立函数调用和函数参考信息的映射。

[0025]步骤4)为了处理Class实例的函数调用场景中无法确定Class实例的类型的情况,使用基于文本分析的自然语言处理技术,进行类型推导。参照图1是本发明基于文本分析的类型推导示意图,使用数十个Python项目的程序作为训练集,提取训练集项目中的所有变量名和可以观察到的变量类型,并使用传统的类型推导方法建立变量到其已推导出的类型的映射字典。通过对变量名的预处理,去除变量名尾部数字,通过“_”和驼峰式命名规则对变量名进行切分得到token,并对每个token的字母小写处理,得到一个变量名token序列。对训练集中所有的变量名token序列使用LDA主题模型进行聚类,聚类算法最终会生成一个分类,能识别给定的一个变量名所属的聚类id。为每个变量x抽取特征向量,其形式为。其中,id是由(4)中得到的变量名所属的聚类id,N_noun和N_verb分别表示变量名token序列中的名词和动词的个数,sim(x,t)表示变量名和类型名之间的文本相似度。每个分类模型的训练过程都是一个标准的监督学习过程。其中,每一组实例数据由特征向量和对应的标签值组成。对于变量x而言,如果它已被推导出的类型集中包含类型t,则标签值为1,否则为0。将所有的实例记录输入到SVM中进行训练便能得到最终的模型M(t)。分类模型M(t)可以预测任意给定的一个变量x是否可能属于类型t,及其相应的概率值p。

[0026]步骤5)基于协同过滤来区分同名函数的参考信息,为Class实例的函数调用推荐同名函数中对应的函数参考信息。由于命名惯例的不确定性,单独利用步骤4)中的模型来预测变量类型有时不能奏效。本发明基于协同过滤算法,将同名函数所属的Class以及当前函数调用属于的未知Class实例视为用户(User),将这些Class的属性、方法以及各个同名函数的参考信息视为商品(Item),构建用户评分数据矩阵。参照图2是本发明基于协同过滤的算法流程示意图,与一般的基于协同过滤的算法不同,本发明的算法是对于上下文范围敏感的,这里的上下文范围是指当前函数调用的上下文范围。根据三种不同的上下文范围:与当前函数调用位于同一个函数、类、文件,提取上下文范围中所有Class的属性和方法,得到三个用户评分数据矩阵。通过计算用户(Class和未知Class实例)之间的相似度,相似度计算公式是:[0027]Sim(Ci,Cj)=αUj)+αUj)+αUj)1*Simfunc(Ui,2*Simclass(Ui,3*Simfile(Ui,[0028]其中αααααα1,2,3分别为不同上下文范围下相似度的权重,1+2+3=1.Simfunc(Ui,Uj),Simclass(Ui,Uj),Simfile(Ui,Uj)分别为函数、类、文件三种上下文范围情况下的用户评分矩阵中的用户相似度,根据余弦相似度公式分别计算:

[0029][0030]

综合考虑不同上下文范围情况下与未知Class实例相似的Class集合,来给当前未知Class实例的函数调用推荐同名函数中对应的函数参考信息。

[0031]步骤6)参照图3是本发明基于程序分析和文本分析的Python代码参考信息生成示意图。根据步骤3)、4)和5)中得到的函数调用和函数参考信息的映射,结合步骤1)中的函数

7

CN 110750297 A

说 明 书

5/5页

参考信息来源,可以在函数调用处生成函数参考信息。

8

CN 110750297 A

说 明 书 附 图

1/2页

图1

图2

9

CN 110750297 A

说 明 书 附 图

2/2页

图3

10

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务