技术领域
本发明涉及计算机应用技术领域,尤其涉及一种基于Transformer的Python伪代码自动生成方法。
背景技术
用自然语言编写的伪代码有助于新手开发人员理解程序,因为这些开发人员可能不熟悉编程语言的语法和企业项目的领域知识。此外,在算法教科书中,由于伪代码比源代码具有更高的可读性,因此通常使用伪代码来介绍问题的解决方案。然后开发人员可以根据伪代码的描述快速编写源代码。然而,许多项目的大部分源代码都没有对应的伪代码。这是因为编写伪代码既耗时又费力,如果可以自动生成伪代码,开发人员可以大大减少相应的工作量。
发明内容
本发明的目的在于提供一种基于Transformer的Python伪代码自动生成方法,解决现有技术中在软件开发和维护过程中因缺少伪代码而造成的程序可读性差、可理解性差、软件开发和维护成本增加的问题;实现了伪代码生成的自动化,生成简洁又准确的伪代码,提高了代码的可读性和可理解性,降低了代码开发和维护成本,提高代码开发和维护效率,为开发人员理解代码做出贡献。
本发明是通过如下措施实现的:一种基于Transformer的Python伪代码自动生成方法,其中,包括以下步骤:
S1、在Github上下载Python源代码和对应的伪代码以构建初始语料库,为了缓解OOV(Out-of-Vocabulary)问题,并对该语料库执行一系列预处理操作得到语料库;
S2、将语料库分成训练集、验证集,训练集用于构建并训练模型,验证集用于进行模型优化;
S3、基于上述构建的语料库,对构建的基于Transformer的CNN模型进行训练,利用结合位置编码方法以及注意力机制attention进行优化,得到伪代码自动生成模型:
所述伪代码自动生成模型的参数设置如下:
所述伪代码自动生成模型的深度(即隐藏层的层数)设置为2层;
所述伪代码自动生成模型的宽度(即每层隐藏层包含的神经元数量)设置为256;
所述伪代码自动生成模型的学习率设置为0.001;
所述伪代码自动生成模型的Dropout概率设置为0.25;
所述伪代码自动生成模型的kernel_size设置为3;
所述伪代码自动生成模型的scale设置为
所述伪代码自动生成模型的batch_size设置为12;
所述伪代码自动生成模型的beam_size设置为3。
进一步地,所述步骤S1中对数据库进行预处理时,包括如下步骤:
S101、将源代码中的所有标识符转换成小写;
S102、使用
S103、根据python命名规则,使用‘_’作为分隔符来进一步拆分开发人员定义的标识符。例如,标识符‘git_changeset’可以分为两个单词,即‘git’和‘changeset’;
进一步地,所述步骤S3中使用卷积神经网络进行建模时,包括如下步骤:
S301、基于卷积神经网络使用代码特征提取器挖掘代码的深层特征表示;
S302、将代码特征提取器学习到的特征表示与Transformer编码器学习到的上下文向量进行融合得到向量X;
S303、将向量X输入到Transformer解码器中,通过多头注意力机制,利用残差连接和层归一化使矩阵运算维数一致,并将网络中的隐藏层归一化为标准正态分布;
S304、通过前馈层和线性映射层,使用激活函数对向量进行激活;
S305、基于波束搜索算法,根据代码语义和代码特征为每行代码生成细粒度伪码。
为了更好地实现上述发明目的,本发明又提供一种基于Transformer的Python伪代码自动生成方法,包括以下步骤:
S1、语料库的搜集;
S2、在伪代码自动生成任务中,使用基于Transformer的CNN模型;
S3、对构建的基于Transformer的CNN模型进行训练,利用结合位置编码方法以及注意力机制attention进行优化,得到伪代码自动生成模型;
所述伪代码自动生成模型的参数设置如下:
所述伪代码自动生成模型的深度设置为2层;
所述伪代码自动生成模型的宽度设置为256;
所述伪代码自动生成模型的learning rate设置为0.001;
所述伪代码自动生成模型的Dropout设置为0.25;
所述伪代码自动生成模型的kernel_size设置为2;
所述伪代码自动生成模型的scale设置为
所述伪代码自动生成模型的batch_size设置为12;
所述伪代码自动生成模型的beam_size设置为12。
进一步地,步骤S1中预处理好的代码输入到步骤S3中训练好的伪代码自动生成模型中,自动生成相应的伪代码;如源代码的输入是“view func=getattr(mod,funcname)”,生成的伪代码是“从mod对象获取func name属性,用它替换view func”;
进一步地,所述步骤S1具体包括以下步骤:
S1.1、在GitHub上下载源代码或伪代码并行数据库;
S1.2、将源代码中的所有标识符转换成小写;
S1.3、使用
S1.4、根据python命名规则,使用‘_’作为分隔符来进一步拆分开发人员定义的标识符得到最终的语料库;例如,标识符‘git_changeset’可以分为两个单词,即‘git’和‘changeset’;
S1.5、将语料库分成训练集、验证集和测试集三部分;其中,训练集用于构建模型,验证集用于进行模型优化,测试集用于评估构建的模型的性能。
进一步地,所述步骤S2具体包括以下步骤:
S2.1、基于卷积神经网络使用代码特征提取器有效地挖掘代码的深层特征表示;
S2.2、将代码特征提取器得到的特征表示与Transformer编码器得到的上下文向量进行融合得到向量X;
S2.3、将向量X输入到Transformer解码器中,通过多头注意力机制,利用残差连接和层归一化使矩阵运算维数一致,并将网络中的隐藏层归一化为标准正态分布;
S2.4、通过前馈层和线性映射层,使用激活函数对向量进行激活;
S2.5、基于波束搜索算法,根据代码语义和代码特征为每行代码生成细粒度伪码。
与现有技术相比,本发明的有益效果为:
(1)、本发明用自然语言编写的伪代码有助于新手开发人员理解程序,方法生成的伪代码能够准确地描述代码的功能,并且能够自动、快速地生成,该方法能够帮助开发人员高效地生成具有较强可读性的伪代码。
(2)、本发明可以更好地为基于Python的项目生成伪代码,以帮助开发人员阅读不熟悉的代码,阅读伪代码可以使人更快理解代码,节省理解代码的时间,大大提高工作效率,加速软件开发和维护进程。
附图说明
附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。
图1为本发明提供的一种基于Transformer的Python伪代码自动生成方法的流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。当然,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
实施例1
参照图1,本发明提供其技术方案为,一种基于Transformer的Python伪代码自动生成方法,具体包括以下步骤:
1、语料库的搜集;
1.1、在GitHub上下载源代码或伪代码并行数据库;
1.2、将源代码中的所有标识符转换成小写;
1.3、使用
1.4、根据python命名规则,使用‘_’作为分隔符进一步拆分开发人员定义的标识符得到最终的语料库;例如,标识符‘git_changeset’可以分为两个单词,即‘git’和‘changeset’;
参照图一中所举例,将源代码‘view_func=getattr(mod,func_name)’预处理后最终得到‘view’、‘func’、‘=’、‘getattr’、‘(’、‘mod’、‘func’、‘name’、‘)’。
1.5、将语料库分成训练集、验证集和测试集三部分;其中,训练集用于构建模型,验证集用于进行模型优化,测试集用于评估构建的模型的性能;
2、具体在伪代码自动生成任务中,使用基于Transformer的CNN模型;
2.1、基于卷积神经网络使用代码特征提取器有效地挖掘代码的深层特征表示;
2.2、将代码特征提取器学习到的特征表示与Transformer编码器学习到的上下文向量进行融合得到向量X;
2.3、将向量X输入到Transformer解码器中,通过多头注意力机制,利用残差连接和层归一化来使矩阵运算维数一致,并将网络中的隐藏层归一化为标准正态分布;
2.4、通过前馈层和线性映射层,使用激活函数来对向量进行激活;
2.5、基于波束搜索算法,根据代码语义和代码特征为每行代码生成细粒度伪码;
3、对构建的基于Transformer的CNN模型进行训练,利用结合位置编码方法以及注意力机制attention进行优化,得到伪代码自动生成模型:
所述伪代码自动生成模型的参数设置如下:
所述伪代码自动生成模型的深度即层的数量设置为2层;
所述伪代码自动生成模型的宽度即模型的大小设置为256;
所述伪代码自动生成模型的learning rate设置为0.001;
所述伪代码自动生成模型的Dropout设置为0.25;
所述伪代码自动生成模型的kernel_size设置为2;
所述伪代码自动生成模型的scale设置为
所述伪代码自动生成模型的batch_size设置为12
所述伪代码自动生成模型的beam_size设置为12;
4、将步骤1中预处理好的代码输入到步骤3中训练好的伪代码自动生成模型中,自动生成相应的伪代码,如源代码的输入是“view func=getattr(mod,func name)”,生成的伪代码是“从mod对象获取func name属性,用它替换view func”。
表1中的方法与以前方法之间的比较结果
5、经实验表明,本发明所提出的伪代码自动生成方法,在绝大多数情况下要优于已提出的方法,方法介绍如下:
1)Reduced-T2SMT,该方法是基于T2SMT(树到串机器翻译)的方法,通过具有头部插入、修剪和简化过程的修改树,对于他们提出的基于短语的机器翻译(PBMT)方法和三种基于T2SMT的方法,这一方法可以达到最佳性能;
2)Code2NL,这个方法是一个异步学习模型,它学习代码语义并为每行代码生成细粒度的自然语言描述,它采用类型感知的基于草图的序列到序列(seq2seq)学习方法;
3)包含或者不包含注意机制的rnn-seq2seq,这些基于RNN的方法使用RNN构建seq2seq模型,并比较了这些模型在有或没有注意机制的情况下的性能。
4)包含或者不包含注意机制的cnn-seq2seq,这些基于CNN的方法使用CNN来构建seq2seq模型,我们还比较了在有和没有注意机制的情况下这些模型的性能。
5)Transformer,该方法仅使用编码器-解码器和注意机制来实现良好的性能,这个基准的最大优点是它可以高效地并行化,最近,Transformer在神经机器翻译方面的表现已经超过了RNN和CNN。
本发明的方法与之比较的结果如表1所示,若考虑BLEU指标,本发明提出的方法可以将性能提高3.71%至13.43%。若考虑METEOR指标,本发明提出的方法可以将性能提高0.83%至8.99%。若考虑ROUGE-L指标,本发明提出的方法可以将性能提高2.03%至5.01%。若考虑CIDER指标,我们提出的方法可以将性能提高5.03%至21.19%。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
机译: 用于实现方法的程序转换方法,该方法使用基于注释的伪代码和计算机可读记录介质来记录程序
机译: 使用基于伪代码的注释和计算机可读记录介质存储程序以执行所述方法的程序转换方法
机译: 使用基于伪代码的注释和计算机可读记录介质存储程序以执行所述方法的程序转换方法