Python函数类型声明模型建立方法及装置、介质及设备与流程

文档序号:27014344发布日期:2021-10-22 23:07阅读:231来源:国知局
Python函数类型声明模型建立方法及装置、介质及设备与流程
python函数类型声明模型建立方法及装置、介质及设备
技术领域
1.本公开涉及神经网络技术领域,具体而言,涉及一种python函数类型声明的模型建立方法、一种python函数类型声明的模型建立装置、一种python函数类型的声明方法、一种python函数类型的声明装置、电子设备以及计算机可读存储介质。


背景技术:

2.作为目前互联网行业最为流行的编程语言之一,以动态性为显著特征的python,由于其变量类型不需声明,在运行时可以任意改变,为开发者提供了很好的自由度。
3.然而,随着软件开发项目的规模越来越大,上述特性也给开发者带来了如下问题:为了确定某些函数的参数和返回值的类型,必须深入阅读函数内部代码。因此,动态类型反而带来了额外的开发成本。现有的确定python函数的参数及返回值类型的方法存在依然需要人力去判断一些函数类型、影响开发效率等问题。
4.上述背景技术部分公开的信息仅用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。


技术实现要素:

5.本公开实施例提供一种python函数类型声明的模型建立方法及装置、一种python函数类型的声明方法及装置、电子设备以及计算机可读存储介质,可以实现通过所建立的模型得到python函数的参数及返回值的类型,生成函数签名,同时还可以减少运行时由于类型不符而引起的异常,提高代码健壮性。
6.根据本公开的第一方面,提供一种python函数类型声明的模型建立方法,包括:
7.获取多个python函数,提取所述python函数的函数要素,其中,所述函数要素包括函数参数及函数返回值的名称、注释及类型;
8.分解所述函数要素并进行向量化处理,得到所述函数参数及函数返回值的名称、注释及类型的向量表示;
9.将所述函数参数及所述函数返回值的名称和注释作为特征数据,类型作为标注数据,并基于所述特征数据及所述标注数据的所述向量表示,利用神经网络训练得到所述python函数类型声明的模型。
10.在本公开的一种示例性实施例中,所述获取多个python函数,提取所述python函数的函数要素,包括:
11.获取多个python函数,将所述python函数解析为抽象语法树,并基于所述抽象语法树提取出所述函数要素。
12.在本公开的一种示例性实施例中,所述函数要素还包括所述python函数的函数名称及注释;
13.所述分解所述函数要素并进行向量化处理,包括:
14.分解各所述函数要素,以多元组的形式表示所述函数要素对应的所述python函
数;
15.对所述多元组中的各所述函数要素进行向量化处理,得到所述函数参数及函数返回值的名称、注释及类型的向量表示。
16.在本公开的一种示例性实施例中,所述对所述多元组中的各所述函数要素进行向量化处理,得到所述函数参数及函数返回值的名称、注释及类型的向量表示,包括:
17.获取各所述函数要素的词嵌入表示;
18.基于各所述函数要素的所述词嵌入表示及词长度确定各所述函数对应所述向量表示。
19.在本公开的一种示例性实施例中,所述获取各所述函数要素的词嵌入表示,包括:
20.利用word2vec模型获取所述函数要素的词嵌入。
21.在本公开的一种示例性实施例中所述基于所述特征数据及所述标注数据的所述向量表示,利用神经网络训练得到所述python函数类型声明的模型,包括:
22.基于所述特征数据及所述标注数据的所述向量表示,利用双向长短期记忆网络训练得到所述python函数类型声明的模型,其中,所述标注数据为独热向量。
23.根据本公开的第二方面,提供一种python函数类型的声明方法,包括:
24.根据上述方法建立python函数类型声明的模型;
25.获取python函数,通过所述python函数类型声明的模型对所述python函数进行处理,得到所述python函数的函数参数及函数返回值的类型并更新至所述python函数。
26.在本公开的一种示例性实施例中,在所述获取python函数之后,所述方法还包括:
27.提取所述python函数的函数要素,分解所述函数要素并进行向量化处理,得到所述函数参数及函数返回值的名称、注释及类型的向量表示。
28.在本公开的一种示例性实施例中,所述通过所述python函数类型声明的模型对所述输入python函数进行处理,得到所述python函数的函数参数及函数返回值的类型,包括:
29.将所述函数参数的所述向量表示输入所述python函数类型声明的模型,得到所述python函数的函数类型的概率向量;
30.依据所述概率向量得到对应的所述函数参数及函数返回值的类型。
31.根据本公开的第三方面,提供一种python函数类型声明的模型建立装置,包括:
32.要素提取模块,用于获取多个python函数,提取所述python函数的函数要素,其中,所述函数要素包括函数参数及函数返回值的名称、注释及类型;
33.向量化模块,用于分解所述函数要素并进行向量化处理,得到所述函数参数及函数返回值的名称、注释及类型的向量表示;
34.模型建立模块,用于将所述函数参数及所述函数返回值的名称和注释作为特征数据,类型作为标注数据,并基于所述特征数据及所述标注数据的所述向量表示,利用神经网络训练得到所述python函数类型声明的模型。
35.根据本公开的第四方面,提供一种python函数类型的声明装置,包括:
36.模型建立模块,用于根据上述方法建立python函数类型声明的模型;
37.类型声明模块,用于获取python函数,通过所述python函数类型声明的模型对所述python函数进行处理,得到所述python函数的函数参数及函数返回值的类型并更新至所述python函数。
38.根据本公开的第五方面,提供一种电子设备,包括:
39.处理器;
40.存储器,用于存储所述处理器的可执行指令;其中,所述处理器配置为经由执行所述可执行指令来执行上述任意一项所述方法。
41.根据本公开的第六方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任意一项所述方法。
42.本公开示例性实施例可以具有以下部分或全部有益效果:
43.在本公开示例实施方式所提供的python函数类型声明的模型建立方法中,可以从互联网公开代码仓库中拉取符合条件的python代码,并将其中的python函数代码抽取出来。在获取到多个python函数后,提取python函数的函数要素,其中,函数要素包括函数参数及函数返回值的名称、注释及类型;接着,分解提取出的函数要素并进行向量化处理,得到函数参数及函数返回值的名称、注释及类型的向量表示;将函数参数及函数返回值的名称和注释作为特征数据,类型作为标注数据,并基于得到的特征数据及标注数据的向量表示,利用神经网络训练得到python函数类型声明的模型。一方面,在本示例实施方式所提供的方法中,可以通过建立的函数类型声明模型得到python函数的函数参数及函数返回值的类型,并自动生成python函数的函数声明,不需要开发人员手工标注函数类型,减轻了开发的工作量,提高了开发效率。另一方面,由于已经自动生成了函数类型签名,因此,开发人员在开发过程中,不需要通过阅读函数的上下文来确定函数参数及函数返回值的类型,减少了开发所需的时间。同时,通过函数类型声明,还可以减少函数运行时由于类型不符而引起的异常,提高代码健壮性。
44.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
45.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
46.图1示出了可以应用本公开实施例的一种python函数类型声明的模型建立方法及装置的示例性系统架构的示意图;
47.图2示出了适于用来实现本公开实施例的电子设备的计算机系统的结构示意图;
48.图3示意性示出了根据本公开的一个实施例的python函数类型声明的模型建立方法的过程的流程图;
49.图4示意性示出了根据本公开的一个实施例的python函数类型的声明方法的过程的流程图;
50.图5示意性示出了本公开的一个实施例应用场景中的实现架构的示意图;
51.图6示意性示出了本公开的一个实施例应用场景中python函数类型声明的模型建立及利用方法的过程的示意图;
52.图7示意性示出了本公开的一个实施例应用场景中的选取训练数据的过程的示意
图;
53.图8示意性示出了本公开的一个实施例应用场景中的训练数据特征工程的过程的示意图;
54.图9示意性示出了本公开的一个实施例应用场景中的向量化处理的过程的示意图;
55.图10示意性示出了本公开的一个实施例应用场景中的获取词嵌入表示的过程的示意图;
56.图11示意性示出了本公开的一个实施例应用场景中的函数参数及返回值的矩阵描述的示意图;
57.图12示意性示出了本公开的一个实施例应用场景中的模型训练的示意图;
58.图13示意性示出了本公开的一个实施例应用场景中的类型声明的示意图;
59.图14示意性示出了根据本公开的一个实施例的python函数类型声明的模型建立装置的框图;
60.图15示意性示出了根据本公开的一个实施例的python函数类型的声明装置的框图。
具体实施方式
61.现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本公开将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施方式中。在下面的描述中,提供许多具体细节从而给出对本公开的实施方式的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而省略所述特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知技术方案以避免喧宾夺主而使得本公开的各方面变得模糊。
62.此外,附图仅为本公开的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
63.图1示出了可以应用本公开实施例的一种python函数类型声明的模型建立方法及装置的示例性应用环境的系统架构的示意图。
64.如图1所示,系统架构100可以包括终端设备101、102、103中的一个或多个,网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。终端设备101、102、103可以是具有显示屏的各种电子设备,包括但不限于台式计算机、便携式计算机、智能手机和平板电脑等等。应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。比如服务器105可以是多个服务器组成的服务器集群等。
65.本公开实施例所提供的python函数类型声明的模型建立方法可以由终端设备101、102、103执行,相应地,python函数类型声明的模型建立装置可以设置于终端设备101、102、103中。本公开实施例所提供的python函数类型声明的模型建立方法也可以由服务器105执行,相应地,python函数类型声明的模型建立装置可以设置于服务器105中。本公开实施例所提供的python函数类型声明的模型建立方法还可以由终端设备101、102、103与服务器105共同执行,相应地,python函数类型声明的模型建立装置可以设置于终端设备101、102、103与服务器105中,本示例性实施例中对此不做特殊限定。
66.例如,在本示例实施方式中,可以通过终端设备101、102、103获取多个python函数,并提取python函数的函数要素,其中,函数要素包括函数参数及函数返回值的名称、注释及类型。接着,终端设备101、102、103可以通过网络104将提出的各python函数的函数要素发送至服务器105,由服务器105分解函数要素并进行向量化处理,得到函数参数及函数返回值的名称、注释及类型的向量表示。之后,将函数参数及函数返回值的名称和注释作为特征数据,类型作为标注数据,并基于得到的特征数据及标注数据的向量表示,利用神经网络训练得到python函数类型声明的模型。
67.图2示出了适于用来实现本公开实施例的电子设备的计算机系统的结构示意图。
68.需要说明的是,图2示出的电子设备的计算机系统200仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
69.如图2所示,计算机系统200包括中央处理单元(cpu)201,其可以根据存储在只读存储器(rom)202中的程序或者从存储部分208加载到随机访问存储器(ram)203中的程序而执行各种适当的动作和处理。在ram 203中,还存储有系统操作所需的各种程序和数据。cpu 201、rom 202以及ram 203通过总线204彼此相连。输入/输出(i/o)接口205也连接至总线204。
70.以下部件连接至i/o接口205:包括键盘、鼠标等的输入部分206;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分207;包括硬盘等的存储部分208;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分209。通信部分209经由诸如因特网的网络执行通信处理。驱动器210也根据需要连接至i/o接口205。可拆卸介质211,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器210上,以便于从其上读出的计算机程序根据需要被安装入存储部分208。
71.作为目前互联网行业最为流行的编程语言之一,以动态性为显著特征的python,由于其变量类型不需声明,在运行时可以任意改变,为开发者提供了很好的自由度。
72.然而,随着软件开发项目的规模越来越大,上述特性也给开发者带来了如下问题:为了确定某些函数的参数和返回值的类型,必须深入阅读函数内部代码。因此,动态类型反而带来了额外的开发成本。
73.为了解决这一问题,发明人尝试性地提出了以下四种方法:
74.第一种方法为强制要求参数声明,这一方法虽然可以解决上述问题,但并不符合“希望赋予python以多态,关注的不是变量的类型本身,而是它是如何使用的”这一python函数的设计初衷。
75.第二种方法为允许参数类型声明但不检验。但这一方法也存在以下问题:一方面,旧版本的函数代码仍然没有声明。另一方面,开发者未必会主动声明函数参数,因此仍然会
有许多函数没有签名。
76.第三种方法为使用强制校验参数类型的第三方工具,通过这样的方式,可以提前发现一些运行时类型错误的问题,但也存在开发时仍然需要人力去推断参数类型,不能提升开发效率等问题。
77.第四种方法为使源代码本身包含完整的人工注释、类型标注,但强制要求每处代码的注释也有可能降低开发效率。
78.为了解决上述方法中存在的问题,在本示例实施方式中,发明人提出了一种新的技术方案,以下对本公开实施例的技术方案进行详细阐述:
79.本示例实施方式首先提供了一种python函数类型声明的模型建立方法,该python函数类型声明的模型建立方法,如图3所示,具体包括以下步骤:
80.步骤s310:获取多个python函数,提取所述python函数的函数要素,其中,所述函数要素包括函数参数及函数返回值的名称、注释及类型;
81.步骤s320:分解所述函数要素并进行向量化处理,得到所述函数参数及函数返回值的名称、注释及类型的向量表示;
82.步骤s330:将所述函数参数及所述函数返回值的名称和注释作为特征数据,类型作为标注数据,并基于所述特征数据及所述标注数据的所述向量表示,利用神经网络训练得到所述python函数类型声明的模型。
83.在公开示例实施方式所提供的python函数类型声明的模型建立方法中,一方面,可以通过建立的函数类型声明模型得到python函数的函数参数及函数返回值的类型,并自动生成python函数的函数声明,不需要开发人员手工标注函数类型,减轻了开发的工作量,提高了开发效率。另一方面,由于已经自动生成了函数类型签名,因此,开发人员在开发过程中,不需要通过阅读函数的上下文来确定函数参数及函数返回值的类型,减少了开发所需的时间。同时,通过函数类型声明,还可以减少函数运行时由于类型不符而引起的异常,提高代码健壮性。
84.下面,在另一实施例中,对上述步骤进行更加详细的说明。
85.在步骤s310中,获取多个python函数,提取所述python函数的函数要素,其中,所述函数要素包括函数参数及函数返回值的名称、注释及类型。
86.在本示例实施方式中,python函数为训练函数类型声明模型所使用的训练样本,可以从互联网公开代码仓库中获取。举例而言,该获取过程的实现可以如下:终端设备从互联网公开代码仓库中拉取尽可能多的python项目,举例而言,该python项目可以从github或pypi中拉取;验证拉取到的python项目是否满足预设条件,若满足预设条件,则从中抽取python函数代码。
87.在本示例实施方式中,上述预设条件与python项目的创建时间、关注度及版本相关,需要尽可能地选择近期创建、关注较多且符合最新版python编码规范的项目。举例而言,该预设条件可以为:python项目版本不低于3.5,关注人数不少于1000人且创建时间为3年内。需要说明的是,上述场景只是一种示例性说明,本示例实施方式的保护范畴并不以此为限。
88.在本示例实施方式中,在获取到符合预设条件的python项目,且从中抽取出python函数代码后,需要提取出python函数中的函数要素。该过程可以实现如下:将python
函数解析为ast(抽象语法树,即abstract syntax tree),并基于抽象语法树提取出函数要素。
89.上述基于抽象语法树提取出函数要素的具体实现为:使用第三方库将每个函数解析为抽象语法树。解析ast,抽取每个函数的函数要素,包括:函数名、函数注释、参数名、参数类型、参数注释、返回值、返回类型、返回值注释。
90.在提取出各函数的上述函数要素后,本示例实施方式将保留符合以下条件的python函数作为训练数据:(1)所有函数参数和函数返回值都有类型声明;(2)函数、参数、返回值带有注释。
91.需要说明的是,上述场景只是一种示例性说明,本示例实施方式的保护范畴并不以此为限。
92.在步骤s320中,分解所述函数要素并进行向量化处理,得到所述函数参数及函数返回值的名称、注释及类型的向量表示。
93.在本示例实施方式中,在提取函数要素后,为了便于模型训练,需要对提取到的函数进行分解及向量化处理。其中,向量化处理是指通过特征工程等技术手段,将上述函数要素以向量的形式进行表征的过程。
94.在本示例实施方式中,上述分解函数要素并进行向量化处理的过程,可以实现如下:分解各函数要素,以多元组的形式表示函数要素对应的python函数;对多元组中的各函数要素进行向量化处理,得到函数参数及函数返回值的名称、注释及类型的向量表示。
95.优选地,在对多元组中的各函数要素进行向量化处理之前,还可以对该多元组进行预处理。举例而言,该预处理过程可以包括以下一种或多种:替换各类符号;删除各类停用词;去掉返回语句中的return。需要说明的是,上述示例并不对本示例实施方式发生限定,其他预处理过程也属于本示例实施方式的保护范畴。
96.在本示例实施方式中,上述对多元组中的各函数要素进行向量化处理,得到函数参数及函数返回值的名称、注释及类型的向量表示,这一过程实现可以如下:获取各函数要素的词嵌入表示;基于各函数要素的词嵌入表示及词长度确定对应的向量表示。其中,函数要素的词嵌可以利用word2vec模型获取,也可以通过其他可以产生词向量的模型获取,本示例实施方式对此不做特殊限定。
97.在上述过程中,基于各函数要素的词嵌入表示及词长度确定对应的向量表示,举例说明如下:函数、入参、返回值的名称的词数,经统计99%以上都不大于6,利用生成的各词嵌入表示向量组成的矩阵来表示它们的名称。对于长度大于6的名称,选取其在整个程序库中出现最频繁的6个词即可。函数、入参、返回值的注释亦同理,经统计97%的函数注释不多于30个词,而99%以上的入参和返回值的注释不多于18个词。函数参数及返回值的类型则在程序库出现过的所有类型中,选取最频繁的99种,一般来说,这些类型能覆盖99.9%以上的参数/返回值类型,其他未选取的类型视为一种特殊的类型“其它”,并生成这些类型名称对应的词嵌入表示向量。每个函数要素之间以间隔向量加以区分,最终得到每个函数参数与返回值的矩阵向量。
98.需要说明的是,上述场景只是一种示例性说明,本示例实施方式的保护范畴并不以此为限。
99.在步骤s330中,将所述函数参数及所述函数返回值的名称和注释作为特征数据,
类型作为标注数据,并基于所述特征数据及所述标注数据的所述向量表示,利用神经网络训练得到所述python函数类型声明的模型。
100.在本示例实施方式中,在分解函数要素并进行向量化处理后,基于各函数要素的向量表示,利用神经网络训练得到python函数类型声明的模型。该过程的实现可以如下:将函数的参数及返回值的名称和注释作为特征数据,参数类型和返回值类型作为标注数据;基于特征数据及标注数据经向量化处理得到的向量表示,利用神经网络训练得到python函数类型声明的模型。
101.上述将函数的参数及返回值的名称和注释作为特征数据,参数类型和返回值类型作为标注数据,可以如下:将每个python函数的函数参数及函数返回值进行分离。每个函数包含几个函数参数,对应地,就有几组函数参数训练数据,同样地,包含几个返回值,便有几组函数返回值训练数据。其中,将函数、函数参数及函数返回值的名称、注释等作为训练模型的特征数据,而函数参数及函数返回值的类型,则作为训练模型的标注数据。例如,若一个函数包含有两个入参和一个返回值,那么将会有3组训练数据。
102.优选地,可以通过bi-lstm(bidirectional long-short term memory,双向长短期记忆神经网络)训练得到python函数类型声明的模型。lstm是一种时间递归神经网络,适合于处理和预测序列中间隔和延迟相对较长的重要事件,可以很好地处理长文本的理解问题。单向lstm可能忽略了上下文信息,而bi-lstm对于每一个文本序列,分别以前向和反向输入两个lstm,这两个网络的输出连接到同一个隐藏层,这样更有利于上下文的理解。
103.需要说明的是,上述场景只是一种示例性说明,本示例实施方式的保护范畴并不以此为限。
104.在通过上述s310至s330的步骤训练得到python函数类型声明模型后,本示例实施方式还提供了一种python函数类型的声明方法,以通过上述python函数类型声明模型对python函数进行处理,自动生成函数参数及返回值的类型标注,而不需要开发者手工标注,同时减少函数运行时由于类型不符而引起的异常,提高代码健壮性。具体流程如图4所示,包括以下流程:
105.步骤s410:根据上述步骤s310至s330所述的方法建立python函数类型声明的模型;
106.步骤s420:获取python函数,通过所述python函数类型声明的模型对所述python函数进行处理,得到所述python函数的函数参数及函数返回值的类型并更新至所述python函数。
107.下面,在另一实施例中,对上述步骤进行更加详细的说明。
108.在步骤s410中,根据上述步骤s310至s330所述的方法建立python函数类型声明的模型。这一建立过程在上文已经进行了详细的阐述,故在此不再赘述。
109.在步骤s420中,获取python函数,通过所述python函数类型声明的模型对所述python函数进行处理,得到所述python函数的函数参数及函数返回值的类型并更新至所述python函数。
110.在本示例实施方式中,获取python函数后,提取python函数的函数要素,分解提取出的函数要素并进行向量化处理,该向量化处理的具体过程参考步骤s320,在此不再赘述,经处理后,得到函数参数及函数返回值的名称、注释及类型的向量表示。
111.在本示例实施方式中,通过python函数类型声明模型对python函数进行处理,得到函数参数及返回值的类型并更新至python函数,包括;在得到函数参数及函数返回值的名称、注释及类型的向量表示后,将各函数要素的向量表示输入上述python函数类型声明的模型,得到函数类型的概率向量;依据概率向量得到对应的所述函数参数及函数返回值的类型。
112.其中,依据概率向量得到对应的所述函数参数及函数返回值的类型,举例说明如下:上述概率向量为函数类型的概率分布,其中,函数类型为在程序库出现过的所有参数/返回值类型中最频繁的99种,一般来说,这些类型能覆盖99.9%以上的参数/返回值类型,其他未选取的类型视为一种特殊的类型“其它”;上述函数类型声明模型可以输出函数参数及返回值属于这些类型的概率向量,选取最接近1的概率对应的类型作为该函数参数或返回值的类型。
113.在本示例实施方式中,若概率向量的值并不显著,那么该类型声明的标注并不非常可靠,此时,可在注释中写明其类型不确定,所标注的类型只建议参考。开发者在面对该类型声明时,需要自行了解上下文来判断变量的实际类型。
114.需要说明的是,上述场景只是一种示例性说明,本示例实施方式的保护范畴并不以此为限。
115.下面结合图5至图13所示的具体场景,对本示例实施方式所提供的方法进行进一步的说明。
116.该具体应用场景的实现架构如图5所示,包括离线模型训练510和在线函数签名生成器520两部分。其中,离线模型训练510用于通过上述python函数类型声明的模型建立方法,将具备完全函数签名的公开python函数代码作为训练数据,训练得到python函数类型声明模。在线函数签名生成器520则利用离线模型训练510部分训练得到的模型对没有函数签名的python函数预测其函数参数及返回值的类型,并在函数中声明。该具体应用场景的实现流程如图6所示,包括以下步骤:
117.在步骤s610中,获取训练数据。
118.在本具体应用场景中,该获取训练数据的过程,如图7所示,具体包括以下步骤:
119.在步骤s710中,获取符合预设条件的公开python项目。
120.在该步骤中,从github或pypi等互联网公开代码仓库中获取公开python项目并对获取到的项目进行校验,当获取到的python项目符合预设条件时,保留该python项目,继续抽取下一个python项目;当获取到的python项目不符合预设条件时,则舍弃该python项目并继续抽取下一个python项目,直至获取到公开代码仓库中所有符合条件的python项目。且对于符合预设条件的python项目,执行步骤s720。
121.其中,预设条件为python项目应当尽量选择近期创建、关注较多且符合最新版python编码规范的项目。举例而言,,该预设条件可以为:python项目版本不低于3.5,关注人数不少于1000人且创建时间为3年内。当然项目版本、关注人数及创建时间可以依据模型训练的实际要求进行调整。
122.在步骤s720中,抽取出python函数代码。
123.在步骤s730中,提取函数的主要特征。
124.在该步骤中,使用第三方库astor,将步骤s720抽取出的每个函数解析为抽象语法
树(ast,即abstract syntax tree)。解析该抽象语法树,提取出每个函数对应的主要特征,包括:函数名、函数注释、参数名、参数类型、参数注释、返回值、返回类型、返回值注释。
125.在步骤s740中,选取训练数据。
126.在该步骤中,对抽取出的函数进行是否符合编码规则和类型声明是否完整的判断,并选取符合下列条件的函数作为训练数据:(1)函数的所有参数和返回值有类型声明;(2)函数、函数参数、函数返回值带有注释。
127.在步骤s620中,通过特征工程处理训练数据。
128.在本具体应用场景中,该通过特征工程处理训练数据的过程,如图8所示,具体包括以下步骤:
129.在步骤s810中,将函数的各要素分解。
130.在该步骤中,使用八元组表示函数。即,每个python函数由(函数名、函数注释、参数名、参数类型、参数注释、返回值、返回类型、返回值注释)这样一八元组表示。
131.在步骤s820中,对八元组进行预处理。
132.在该步骤中,预处理主要包括以下内容:将各类符号,如加减号、下划线等,替换为空格;删除各类停用词,如冠词、量词、介词等;去掉返回语句中的return等。
133.在步骤s830中,分离函数的参数和返回值。
134.在该步骤中,python函数有几个函数参数就有几组参数训练数据,有几个函数返回值就有几组返回值训练数据。将参数/函数/返回值的名称、注释等,将作为训练模型的特征数据(x);而参数/返回值的类型,则作为训练模型的标注数据(y),可以得到对应的参数训练数据及返回值训练数据。例如,一个有两个参数和一个返回值的函数将会有3组训练数据。
135.在步骤s840中,对步骤s830得到的各组训练数据进行向量化处理。
136.在该步骤中,向量化处理过程,如图9所示,包括以下步骤:
137.在步骤s910中,得到文本的词嵌入表示。
138.在该步骤中,由于函数、参数及返回值的名称和注释是有意义的名词,故而,它们的向量表示需要体现其语义。因此,该步骤使用word2vec来生成各词的向量化表示。举例而言,该过程可以如图10所示,首先,将上述名称和注释转换为若干短句,并组成一个文档,所有函数在转换后构成一个文档集;继而,由于在上下文中相邻出现的词语义之间的联系更加紧密,故可以设定相邻窗口宽度为5,使用cbow模型训练word2vec模型。设定embedding向量的长度(word2vec的隐藏层宽度)为100,最终得到每个词的词嵌入表示(embedding)。
139.在步骤s920中,得到函数参数及返回值的向量化表示。
140.在该步骤中,由于经统计,函数、参数、返回值的名称的词数,99%以上都不大于6,因此可以用步骤s910生成的各词嵌入表示向量(embedding)组成的矩阵来表示它们的名称。对于长度大于6的名称,选取其在整个程序库中出现最频繁的6个词即可。同理,函数、参数、返回值的注释经统计97%的函数注释不多于30个词,而99%以上的入参和返回值的注释不多于18个词,故使用18个词来表示即可,再加之1*100间隔向量,每个函数参数及函数返回值都可由图11所示的63*100的矩阵描述其特征,该矩阵描述即为函数参数及返回值的向量化表示。
141.在步骤s930中,得到函数参数及返回值的类型的向量化表示。
142.在该步骤中,在程序库出现过的所有参数/返回值类型中,选取其中最频繁的99种,一般来说,这些类型能覆盖99.9%以上的参数/返回值,其他未选取的类型视为一种特殊的类型“其它”。由于这100种类型是典型的枚举值,故使用独热编码(one-hot encoding)向量化即可。
143.在步骤s630中,训练得到python函数类型声明模型。
144.在该步骤中,为了提高模型的准确性,使用如图12所示的双向长短期记忆网络(bi-lstm),其中,n=63,训练得到python函数类型声明模型。该过程相当于的一类映射,即输入63*100的矩阵x,输出100维向量y。其中y
i
意为该函数参数(或返回值)属于第i类型的概率。在训练时,为独热向量,即其中只有某一个值为1其他为0。
145.在步骤s640中,在线预测未知的函数参数及返回值的类型。
146.在该步骤中,对未知的函数参数及返回值的类型进行预测。函数的入参和返回值未知时,对其作步骤s840中的处理,得到函数中参数(或返回值)的63*100的特征矩阵x'。以x'作为模型输入,得到输出的100维向量y'。设c=argmax
i
y

i
,那么可以认为该入参(或返回值)的类型为第c类。获取每个入参和返回值的类型后,即可生成该函数的签名,对每个函数做如图13的注解。
147.其中,y'为一个概率向量,若该概率向量的值并不显著,则可在注释中写明其该类型只是建议,并不确定。开发者在面对该类型声明时,可能需要自行了解上下文来判断变量的实际类型。需要说明的是,这种情况在实践中出现的可能性很小。
148.在本具体应用场景中,一方面,可以通过建立的函数类型声明模型得到python函数的函数参数及函数返回值的类型,并自动生成python函数的函数声明,不需要开发人员手工标注函数类型,减轻了开发的工作量,提高了开发效率。另一方面,由于已经自动生成了函数类型签名,因此,开发人员在开发过程中,不需要通过阅读函数的上下文来确定函数参数及函数返回值的类型,减少了开发所需的时间。同时,通过函数类型声明,还可以减少函数运行时由于类型不符而引起的异常,提高代码健壮性。
149.应当注意,上述应用场景只是一种示例性说明,尽管在附图中以特定顺序描述了本公开中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。
150.进一步地,本示例实施方式提供了一种python函数类型声明的模型建立装置。参考图14所示,该python函数类型声明的模型建立装置1400可以包括要素提取模块1410、向量化模块1420、模型建立模块1430。其中:
151.要素提取模块1410可以用于获取多个python函数,提取所述python函数的函数要素,其中,所述函数要素包括函数参数及函数返回值的名称、注释及类型;
152.向量化模块1420可以用于分解所述函数要素并进行向量化处理,得到所述函数参数及函数返回值的名称、注释及类型的向量表示;
153.模型建立模块1430可以用于将所述函数参数及所述函数返回值的名称和注释作为特征数据,类型作为标注数据,并基于所述特征数据及所述标注数据的所述向量表示,利用神经网络训练得到所述python函数类型声明的模型。
154.下面,对python函数类型声明的模型建立装置1400中的各模块进行详细阐述:
155.要素提取模块1410可以用于获取多个python函数,提取所述python函数的函数要素,其中,所述函数要素包括函数参数及函数返回值的名称、注释及类型。
156.在本示例实施方式中,要素提取模块可以从互联网公开代码仓库中获取符合预设条件的python项目。其中,预设条件与python项目的创建时间、关注度及版本相关,需要尽可能地选择近期创建、关注较多且符合最新版python编码规范的项目。举例而言,该预设条件可以为:python项目版本不低于3.5,关注人数不少于1000人且创建时间为3年内。需要说明的是,上述场景只是一种示例性说明,本示例实施方式的保护范畴并不以此为限。
157.在本示例实施方式中,要素提取模块在获取到符合预设条件的python项目后,从中抽取出python函数代码,并提取出其中的函数要素。要素提取模块提取函数要素的实现可以如下:使用第三方库将每个函数解析为抽象语法树。解析ast,抽取每个函数的函数要素,包括:函数名、函数注释、参数名、参数类型、参数注释、返回值、返回类型、返回值注释。
158.在提取出各函数的上述函数要素后,上述要素提取模块将保留符合以下条件的python函数作为训练数据:(1)所有函数参数和函数返回值都有类型声明;(2)函数、参数、返回值带有注释。
159.需要说明的是,上述场景只是一种示例性说明,本示例实施方式的保护范畴并不以此为限。
160.向量化模块1420可以用于分解所述函数要素并进行向量化处理,得到所述函数参数及函数返回值的名称、注释及类型的向量表示。
161.在本示例实施方式中,向量化模块1420用于对要素提取模块提取到的函数进行分解及向量化处理。其中,向量化处理是指通过特征工程等技术手段,将上述函数要素以向量的形式进行表征的过程。向量化模块1420可以实现该过程如下:分解各函数要素,以多元组的形式表示函数要素对应的python函数;对多元组中的各函数要素进行向量化处理,得到函数参数及函数返回值的名称、注释及类型的向量表示。
162.优选地,上述向量化模块还可以包括预处理单元,用于在向量化处理之前,对多元组进行预处理。该预处理过程可以包括以下一种或多种:替换各类符号;删除各类停用词;去掉返回语句中的return。需要说明的是,上述示例并不对本示例实施方式发生限定,其他预处理过程也属于本示例实施方式的保护范畴。
163.在本示例实施方式中,上述向量化模块对多元组中的各函数要素进行向量化处理,这一过程实现可以如下:获取各函数要素的词嵌入表示;基于各函数要素的词嵌入表示及词长度确定对应的向量表示。其中,函数要素的词嵌可以利用word2vec模型获取,也可以通过其他可以产生词向量的模型获取,本示例实施方式对此不做特殊限定。
164.在上述过程中,基于各函数要素的词嵌入表示及词长度确定对应的向量表示,举例说明如下:函数、入参、返回值的名称的词数,经统计99%以上都不大于6,利用生成的各词嵌入表示向量组成的矩阵来表示它们的名称。对于长度大于6的名称,选取其在整个程序库中出现最频繁的6个词即可。函数、入参、返回值的注释亦同理,经统计97%的函数注释不多于30个词,而99%以上的入参和返回值的注释不多于18个词。函数参数及返回值的类型则在程序库出现过的所有类型中,选取最频繁的99种,一般来说,这些类型能覆盖99.9%以上的参数/返回值类型,其他未选取的类型视为一种特殊的类型“其它”,并生成这些类型名
称对应的词嵌入表示向量。每个函数要素之间以间隔向量加以区分,最终得到每个函数参数与返回值的矩阵向量。
165.需要说明的是,上述场景只是一种示例性说明,本示例实施方式的保护范畴并不以此为限。
166.模型建立模块1430可以用于将所述函数参数及所述函数返回值的名称和注释作为特征数据,类型作为标注数据,并基于所述特征数据及所述标注数据的所述向量表示,利用神经网络训练得到所述python函数类型声明的模型。
167.在本示例实施方式中,在分解函数要素并进行向量化处理后,模型建立模块1430可以基于各函数要素的向量表示,利用神经网络训练得到python函数类型声明的模型。该过程的实现可以如下:将函数的参数及返回值的名称和注释作为特征数据,参数类型和返回值类型作为标注数据;基于特征数据及标注数据经向量化处理得到的向量表示,利用神经网络训练得到python函数类型声明的模型。
168.优选地,该模型建立模块可以通过bi-lstm(bidirectional long-short term memory,双向长短期记忆神经网络)训练得到python函数类型声明的模型。lstm是一种时间递归神经网络,适合于处理和预测序列中间隔和延迟相对较长的重要事件,可以很好地处理长文本的理解问题。单向lstm可能忽略了上下文信息,而bi-lstm对于每一个文本序列,分别以前向和反向输入两个lstm,这两个网络的输出连接到同一个隐藏层,这样更有利于上下文的理解。
169.需要说明的是,上述场景只是一种示例性说明,本示例实施方式的保护范畴并不以此为限。
170.对应地,针对上述python函数类型的声明方法,本示例实施方式还提供了一种python函数类型的声明装置。参考图15所示,该python函数类型的声明装置1500可以包括模型建立模块1510和类型声明模块1520。
171.其中:
172.模型建立模块1510可以用于根据上述步骤s310至s330所述的方法建立python函数类型声明的模型;
173.类型声明模块1520可以用于获取python函数,通过所述python函数类型声明的模型对所述python函数进行处理,得到所述python函数的函数参数及函数返回值的类型并更新至所述python函数。
174.下面,对python函数类型声明的模型建立装置1400中的各模块进行详细阐述:
175.模型建立模块1510可以用于根据上述步骤s310至s330所述的方法建立python函数类型声明的模型。
176.在本示例实施方式中,该模型建立模块1510已在上述python函数类型声明的模型建立装置中进行了详细的说明,故在此不再赘述。
177.类型声明模块1520可以用于获取python函数,通过所述python函数类型声明的模型对所述python函数进行处理,得到所述python函数的函数参数及函数返回值的类型并更新至所述python函数。
178.在本示例实施方式中,该类型声明模块还可以包括处理单元和类型判断单元。处理单元在获取python函数后,提取python函数的函数要素,分解提取出的函数要素并进行
向量化处理,并将处理后的python函数输入至模型建立模块建立好的python函数类型声明的模型中进行处理。其中,该向量化处理的具体过程参考上述python函数类型声明的模型建立装置中的向量化模块,在此不再赘述,经向量化处理后,得到函数参数及函数返回值的名称、注释及类型的向量表示。
179.在本示例实施方式中,上述括类型判断单元用于依据模型处理的结果,得到函数参数及返回值的类型并更新至python函数,其工作流程可以包括;在得到python函数类型声明的模型输出的各函数类型的概率向量后,依据概率向量得到对应的所述函数参数及函数返回值的类型。该判断过程,举例说明如下:上述概率向量为函数类型的概率分布,其中,函数类型为在程序库出现过的所有参数/返回值类型中最频繁的99种,一般来说,这些类型能覆盖99.9%以上的参数/返回值类型,其他未选取的类型视为一种特殊的类型“其它”;上述函数类型声明模型可以输出函数参数及返回值属于这些类型的概率向量,该类型判断单元选取最接近1的概率对应的类型作为该函数参数或返回值的类型。
180.需要说明的是,上述场景只是一种示例性说明,本示例实施方式的保护范畴并不以此为限。
181.应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。
182.作为另一方面,本技术还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该电子设备执行时,使得该电子设备实现如上述实施例中所述方法。例如,所述电子设备可以实现如图3~图13所示的各个步骤等。
183.需要说明的是,本公开所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、rf等等,或者上述的任意合适的组合。
184.应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并
且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1