CN115543437B - 一种代码注释生成方法和系统 - Google Patents
一种代码注释生成方法和系统 Download PDFInfo
- Publication number
- CN115543437B CN115543437B CN202211261472.3A CN202211261472A CN115543437B CN 115543437 B CN115543437 B CN 115543437B CN 202211261472 A CN202211261472 A CN 202211261472A CN 115543437 B CN115543437 B CN 115543437B
- Authority
- CN
- China
- Prior art keywords
- function
- data
- target
- ast
- code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/73—Program documentation
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Library & Information Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Machine Translation (AREA)
Abstract
本发明公开了一种代码注释生成方法和系统,当接收到训练代码函数数据时,对训练代码函数数据进行函数预处理,生成对应的代码函数序列数据;采用多个预设目标编码器与预设目标解码器构建初始函数注释生成网络模型;采用代码函数序列数据对初始函数注释生成网络模型进行训练,生成目标函数注释生成网络模型;当接收到目标代码函数数据时,对目标代码函数数据进行函数预处理,并通过目标函数注释生成网络模型生成对应的目标代码函数注释。解决现有的代码注释生成技术对输入的源代码时进行注释时,往往会存在代码注释无法快速、准确地生成的技术问题。
Description
技术领域
本发明涉及数据编译技术领域,尤其涉及一种代码注释生成方法和系统。
背景技术
在软件工程领域,需要软件开发人员快速、准确地理解现有的代码,从而高效地去完成系统或软件的功能变更和工程维护等任务。高质量的代码注释以自然语言的形式表示了源代码的整体思路和关键细节,是帮助开发人员快速理解源代码的关键。初级程序员也可以通过阅读高质量的源代码注释来提升编程能力。因此,如何辅助软件开发人员快速理解现有代码以提高软件开发的效率和质量,已成为软件工程领域的研究热点。
在实际的软件开发过程中,往往是由开发人员人工编写或者更新代码注释。但人工编写代码注释的效率较低,而且注释的准确度难以保证,同时还可能遭遇注释丢失、过时等问题。
当前,现有的代码注释生成技术主要是基于机器学习和深度学习算法进行检测,然而,使用基于循环递归网络RNN的神经网络模型对于较长的源代码进行编码,存在可能无法捕获代码词汇之间的长期依赖关系的问题。而目前大部分的代码注释生成方法,都采用将AST转化为序列的方式。这种方式只关注代码的序列信息,忽略了代码的结构信息,导致生成的代码注释质量较差。且在使用AST类树结构的编码器时,在一定程度上增强了对代码的结构信息的提取。但是这类编码器往往只关注当前节点及其上下节点结构信息,即没有使用代码结构的全局信息,从而导致生成的代码注释准确度不高。同时,在使用图神经网络的编码器时,往往是将整个AST作为输入。但对于较大规模的程序,尤其是程序中存在嵌套的程序结构时,其对应AST的深度和宽度都很大。因此,这一类将整个AST作为输入的方法会极大地加重了模型的训练量。基于上述缺点,通过现有的代码注释生成技术对输入的源代码时进行注释时,往往会存在代码注释无法快速、准确地生成的问题。
发明内容
本发明提供了一种代码注释生成方法和系统,解决现有的代码注释生成技术对输入的源代码时进行注释时,往往会存在代码注释无法快速、准确地生成的技术问题。
本发明第一方面提供的一种代码注释生成方法,包括:
当接收到训练代码函数数据时,对所述训练代码函数数据进行函数预处理,生成对应的代码函数序列数据;
采用多个预设目标编码器与预设目标解码器构建初始函数注释生成网络模型;
采用所述代码函数序列数据对所述初始函数注释生成网络模型进行训练,生成目标函数注释生成网络模型;
当接收到目标代码函数数据时,对所述目标代码函数数据进行函数预处理,并通过所述目标函数注释生成网络模型生成对应的目标代码函数注释。
可选地,所述代码函数序列数据包括原始单词编号序列、驼峰单词编号序列和ASG语法图数据,所述当接收到训练代码函数数据时,对所述训练代码函数数据进行函数预处理,生成对应的代码函数序列数据的步骤,包括:
获取训练代码函数数据,对所述训练代码函数数据进行分割,生成对应的原始单词序列;
对所述原始单词序列内的原始单词进行编号,得到对应的所述原始单词编号序列;
对符合标识符类型的原始单词执行编号变换操作,生成对应的所述驼峰单词编号序列;
通过预设语法树解析器将所述训练代码函数数据转换为AST语法树;
对所述AST语法树进行语法图转换,生成对应的所述ASG语法图数据。
可选地,所述对符合标识符类型的原始单词执行编号变换操作,生成对应的所述驼峰单词编号序列的步骤,包括:
对符合标识符类型的原始单词执行切割操作,生成多个对应的驼峰单词与目标驼峰编号数据;
采用各所述驼峰单词与各所述驼峰单词关联的所述目标驼峰编号数据,构建多个对应的初始驼峰单词序偶数据;
按照预设切割先后顺序对多个所述初始驼峰单词序偶数据进行排列,生成多个对应的目标驼峰单词序偶数据;
将各所述目标驼峰单词序偶数据与所述原始单词编号序列中对应的原始序偶数据进行替换,生成对应的所述驼峰单词编号序列。
可选地,所述对所述AST语法树进行语法图转换,生成对应的所述ASG语法图数据的步骤,包括:
对所述AST语法树进行先序遍历切分,得到多个语句子树;
对各个所述语句子树内的每个AST单词进行编号,得到多个AST单词编号对;
采用多个所述AST单词编号对,生成多个目标AST子树;
采用全部所述目标AST子树构建ASG语法图数据。
可选地,所述采用全部所述目标AST子树构建ASG语法图数据的步骤,包括:
对所述目标AST子树中的每个所述AST单词编号对进行向量转换,生成多个对应的AST子树向量;
从多个所述目标AST子树中选取含有多个所述AST子树向量的关联目标AST子树;
将所述关联目标AST子树内的各所述AST子树向量依次连接,生成多条目标连接边;
计算所述目标连接边连接的两个所述AST子树向量之间的目标欧式距离对应的倒数,得到所述目标连接边的目标权重;
获取全部所述目标AST子树在所述AST语法树中的位置信息;
根据所述位置信息将所述目标AST子树作为目标节点,构建对应的ASG语法图数据。
可选地,所述采用所述代码函数序列数据对所述初始函数注释生成网络模型进行训练,生成目标函数注释生成网络模型的步骤,包括:
将所述代码函数序列数据输入所述初始函数注释生成网络模型,生成对应的训练代码函数注释;
连续计算所述训练代码函数注释与关联的标准代码函数注释之间的多个轮次的平均损失值;
计算每一轮次的所述平均损失值与前一轮次的所述平均损失值之差,生成多个目标损失值;
若所有所述目标损失值的绝对值均小于预设的标准阈值时,停止训练,生成目标函数注释生成网络模型。
可选地,还包括:
若任一所述目标损失值的绝对值大于或等于预设的标准阈值时,则按照预设梯度调整所述初始函数注释生成网络模型的参数,并跳转所述将所述代码函数序列数据输入所述初始函数注释生成网络模型,生成对应的训练代码函数注释的步骤。
可选地,所述目标函数注释生成网络模型包括源代码编码器、驼峰代码编码器和基于图神经网络搭建的语法树编码器、目标解码器和信息聚合层,所述当接收到目标代码函数数据时,对所述目标代码函数数据进行函数预处理,并通过所述目标函数注释生成网络模型生成对应的目标代码函数注释的步骤,包括:
对目标代码函数数据进行函数预处理,生成对应的所述原始单词编号序列、所述驼峰单词编号序列和所述ASG语法图数据;
通过所述源代码编码器对所述原始单词编号序列进行编码,提取对应的函数权重信息;
通过所述驼峰代码编码器对所述驼峰单词编号序列进行编码,提取对应的函数语义信息;
通过所述基于图神经网络搭建的语法树编码器从所述ASG语法图数据提取对应的函数结构信息;
通过所述信息聚合层对所述函数语义信息与所述函数结构信息进行数据维度压缩,生成目标压缩数据;
通过所述目标解码器对所述函数权重信息与所述目标压缩数据进行解码,生成对应的目标代码函数注释。
可选地,所述通过所述基于图神经网络搭建的语法树编码器从所述ASG语法图数据提取对应的函数结构信息的步骤,包括:
获取所述ASG语法图数据内的ASG节点向量;
对所述ASG节点向量进行聚合,生成对应的ASG节点聚合向量;
获取所述ASG节点聚合向量在关联的AST语法树中的关联位置数据;
根据所述关联位置数据将所述ASG节点聚合向量作为连接节点,构建对应的函数结构信息。
本发明第一方面提供的一种代码注释生成系统,包括:
数据函数预处理模块,用于当接收到训练代码函数数据时,对所述训练代码函数数据进行函数预处理,生成对应的代码函数序列数据;
初始函数注释生成网络模型构建模块,用于采用多个预设目标编码器与预设目标解码器构建初始函数注释生成网络模型;
目标函数注释生成网络模型生成模块,用于采用所述代码函数序列数据对所述初始函数注释生成网络模型进行训练,生成目标函数注释生成网络模型;
目标代码函数注释生成模块,用于当接收到目标代码函数数据时,对所述目标代码函数数据进行函数预处理,并通过所述目标函数注释生成网络模型生成对应的目标代码函数注释。
从以上技术方案可以看出,本发明具有以下优点:
(1)本发明明显减少了模型的训练量。相比于其他现有技术,本发明对AST进行了拆分,避免了将整个AST作为输入造成模型的训练量过大,因此减少了模型的训练量。
(2)本发明可以完整地保留AST结构信息,可以据此提取函数完整的语义结构信息,结合ASG表示的函数局部信息,从而生成更准确、全面的函数注释。相比于其他现有技术,将AST转化为序列会破坏原始AST结构信息,使用类树编码器的方法也需要将AST转化为完全k-叉树,从而破坏了AST的结构完整性。
(3)本发明可以更好地提取函数对应的AST结构信息,从而提高生成的函数注释的质量。本发明使用基于图神经网络的编码器对由AST生成的ASG进行特征提取,与使用序列编码器和类树编码器等现有方法相比,能够更好地提取出函数的局部结构信息,同时也保留了函数的全局结构信息,用于生成更准确、全面的注释。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。
图1为本发明实施例一提供的一种代码注释生成方法的步骤流程图;
图2为本发明实施例二提供的一种代码注释生成方法的步骤流程图;
图3为本发明实施例二提供的一种数据的函数预处理步骤流程图;
图4为本发明实施例二提供的一种目标函数注释生成网络模型结构图;
图5为本发明实施例二提供的一种基于图神经网络的语法树编码器结构图;
图6为本发明实施例三提供的一种代码注释生成系统的结构框图。
具体实施方式
在实际的软件开发过程中,往往是由开发人员人工编写或者更新代码注释。但人工编写代码注释的效率较低,而且注释的准确度难以保证,同时还可能遭遇注释丢失、过时等问题。
针对人工编写源代码的缺点,软件开发研究人员开展了自动化生成注释的尝试。在目前,自动化生成注释的粒度都是处于“函数”或者“方法”层次的。
最初的代码注释自动生成方法大多是基于信息检索的生成方法和基于模板的思路,利用启发式的规则从程序代码内提取代码关键信息,再利用现有模板和规则来生成自然语言描述的注释。随着深度学习的迅猛发展,现有的代码注释自动生成方法主要分为以下几类:基于编码器-解码器结构的方法、基于图神经网络模型的代码注释生成方法、基于强化学习模型的代码注释生成方法、基于对偶学习模型的代码注释生成方法以及使用代码之外的额外信息自动生成注释的方法。
(1)使用编码器-解码器结构的网络方法,是通过编码器神经网络对代码片段进行编码并提取信息转化为特征向量,再利用解码器神经网络对该向量进行解码为自然语言描述。
(2)基于图神经网络模型的代码注释生成方法,是主要对代码的语法树AST(Abstract Syntax Tree,AST)进行分析,将源代码的结构信息进行提取,从而提高生成代码注释的质量。
(3)基于强化学习模型的代码注释生成方法,则是根据生成代码注释的质量来计算奖励值,然后根据奖励值更新参数,从而使得模型的性能得到提升。
(4)基于对偶学习模型的代码注释生成方法通过利用两个任务之间的对称性形成互相反馈,从而提升模型的性能。
(5)使用代码之外的额外信息自动生成注释的方法,除了代码本身所蕴含的特征信息外,其他相关信息对于代码注释自动生成也可以起到重要作用。如使用代码调用时产生的API序列信息、与目标代码相似的代码片段信息和代码块的上下文信息。
总的来说,使用深度学习的方法可以自动地学习程序代码的数据信息、结构信息与自然语言描述之间的关系,且基于深度学习方法自动生成的代码注释具有较好的可读性,能明显提升代码注释质量。
当前代码注释自动生成技术主要是基于机器学习和深度学习算法进行检测,这些方法存在以下缺点:
(1)传统的方法使用基于循环递归网络RNN的神经网络模型对于较长的源代码进行编码,存在可能无法捕获代码词汇之间的长期依赖关系的问题。
(2)目前大部分的代码注释自动生成方法,都采用将AST转化为序列的方式。这种方式只关注代码的序列信息,忽略了代码的结构信息,导致生成的代码注释质量较差。
(3)使用AST类树结构的编码器,在一定程度上增强了对代码的结构信息的提取。但是这类编码器往往只关注当前节点及其上下节点结构信息,即没有使用代码结构的全局信息,从而导致生成的代码注释准确度不高。
(4)当前使用图神经网络的编码器,往往是将整个AST作为输入。但对于较大规模的程序,尤其是程序中存在嵌套的程序结构时,其对应AST的深度和宽度都很大。因此,这一类将整个AST作为输入的方法会极大地加重了模型的训练量。
为此,本发明实施例提供了一种代码注释生成方法和系统,用于解决现有的代码注释生成技术对输入的源代码时进行注释时,往往会存在代码注释无法快速、准确地生成的技术问题。
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本发明一部分实施例,而非全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
请参阅图1,图1为本发明实施例一提供的一种代码注释生成方法的步骤流程图。
本发明提供的一种代码注释生成方法,包括:
步骤101、当接收到训练代码函数数据时,对训练代码函数数据进行函数预处理,生成对应的代码函数序列数据。
训练代码函数数据,指的是用于生成代码函数序列数据的代码函数/注释对数据。
值得一提的是,训练代码函数数据具体指代的是将每个函数及其注释构成一个函数/注释对,然后将所有的函数/注释对就构成了一个函数/注释对数据集。
函数预处理,指的是将代码函数/注释对数据进行处理,生成对应的数据序列。
代码函数序列数据,指的是用于训练初始函数注释生成网络模型的序列数据。
在本发明实施例中,当接收到代码函数/注释对数据构成的训练代码函数数据时,对代码函数/注释对数据进行函数预处理,生成用于训练初始函数注释生成网络模型的代码函数序列数据。
步骤102、采用多个预设目标编码器与预设目标解码器构建初始函数注释生成网络模型。
预设目标编码器,指的是构成初始函数注释生成网络模型的编码器。
值得一提的是,目标编码器包括源代码编码器、驼峰代码编码器和基于图神经网络搭建的语法树编码器。
初始函数注释生成网络模型,指的是由多个目标编码器和目标解码器构成的网络模型。
值得一提的是,构建初始函数注释生成网络模型的还有信息聚合层。
在本发明实施例中,采用多个目标编码器和目标解码器构建初始函数注释生成网络模型。
步骤103、采用代码函数序列数据对初始函数注释生成网络模型进行训练,生成目标函数注释生成网络模型。
在本发明实施例中,采用经过函数预处理生成的代码函数序列数据对初始函数注释生成网络模型进行训练,训练完成后,生成对应的目标函数注释生成网络模型。
步骤104、当接收到目标代码函数数据时,对目标代码函数数据进行函数预处理,并通过目标函数注释生成网络模型生成对应的目标代码函数注释。
目标代码函数数据,指的是用于进行解析生成注释的代码函数,也就是源代码。
目标代码函数注释,指的是通过目标函数注释生成网络模型对目标代码函数数据进行解析,生成的目标代码函数注释。
在本发明实施例中,当接收到目标代码函数数据时,对目标代码函数数据进行函数预处理,作为目标函数注释生成网络模型的输入数据,通过目标函数注释生成网络模型对目标代码函数数据进行解析,输出对应的目标代码函数注释。
在本发明中,当接收到训练代码函数数据时,对训练代码函数数据进行函数预处理,生成对应的代码函数序列数据;采用多个预设目标编码器与预设目标解码器构建初始函数注释生成网络模型;采用代码函数序列数据对初始函数注释生成网络模型进行训练,生成目标函数注释生成网络模型;当接收到目标代码函数数据时,对目标代码函数数据进行函数预处理,并通过目标函数注释生成网络模型生成对应的目标代码函数注释。解决现有的代码注释生成技术对输入的源代码时进行注释时,往往会存在代码注释无法快速、准确地生成的技术问题。消除传统方法中将AST转化为序列形式导致函数结构信息丢失,以及传统RNN模型难以捕获函数内部关系中的长期依赖关系的问题;同时解决了使用类树编码器的方法只关注到AST局部结构信息,忽略了AST整体结构信息的问题,以及图编码器的模型使用整个AST作为输入又会存在模型训练量过大的问题;同时,对AST进行拆分,可以有效降低AST的规模,从而减少模型的训练量。将分割得到的子树转化为ASG输入到图神经网络编码器当中进行训练,可以保持其原先结构信息,从而增强编码器对AST结构信息的提取能力。在本实施例中,针对输入的源代码,也就是目标代码函数数据,在函数层次快速、准确地生成对应的注释。
请参阅图2,图2为本发明实施例二提供的一种代码注释生成方法的步骤流程图。
请参阅图2,本发明提供的一种代码注释生成方法,包括:
步骤201、当接收到训练代码函数数据时,对训练代码函数数据进行函数预处理,生成对应的代码函数序列数据。
进一步地,代码函数序列数据包括原始单词编号序列、驼峰单词编号序列和ASG语法图数据,步骤201包括以下子步骤:
值得一提的是,对每一个函数进行函数预处理,得到原始单词编号序列Q1、驼峰单词编号序列Q2和AST子树序列Q3,并将AST子树序列Q3进一步处理,生成ASG语法图数据。
如图3所示,对训练代码函数数据进行函数预处理,生成原始单词编号序列Q1、驼峰单词编号序列Q2和AST子树序列Q3。
S11、获取训练代码函数数据,对训练代码函数数据进行分割,生成对应的原始单词序列。
值得一提的是,将每个函数及其注释构成一个函数/注释对,将所有的函数/注释对就构成了一个函数/注释对数据集,也就是训练代码函数数据。
在本发明实施例中,以空格或回车符为分割符对函数进行分割,得到的各个部分称为原始单词,此时,函数转换为一个由原始单词构成的序列,记为Q0。
S12、对原始单词序列内的原始单词进行编号,得到对应的原始单词编号序列。
在本发明实施例中,将Q0中的所有原始单词依次进行编号,得到一个由序偶<原始单词,编号>构成的原始单词编号序列Q1。
需要注意的是,如果同一个单词在函数中重复出现,则每次出现时对应的编号都相同。
例如:对于一个函数:int example{MyID=b;b=c;};可得到Q1={<int,1>,<example,2>,<{,3>,<MyID,4>,<=,5>,<b,6>,<;7>,<b,8>,<=,9>,<c,10>,<;,11>,<},12>,<;,13>}。
S13、对符合标识符类型的原始单词执行编号变换操作,生成对应的驼峰单词编号序列。
在本发明实施例中,在原始单词编号序列Q1的基础上,构建驼峰单词编号序列Q2。在构造Q1时产生的原始单词中,有一类单词称为标识符。标识符通常是由用户自定义的变量名。
值得一提的是,驼峰命名规则指混合使用大小写字母来构成变量和函数的名字。当变量名或函数名是由一个或多个单词连结在一起构成的唯一识别字时,第一个单词以小写字母开始,从第二个单词开始以后的每个单词的首字母都采用大写字母,例如:myName、myAge,这样的变量名看上去就像骆驼峰一样此起彼伏,因此被称为驼峰命名法。
S14、通过预设语法树解析器将训练代码函数数据转换为AST语法树。
在本发明实施例中,采用的是Antlr解析器,将任意函数输入Antlr解析器,构造出对应的AST语法树。
S15、对AST语法树进行语法图转换,生成对应的ASG语法图数据
在本发明实施例中,
进一步地,S13包括以下子步骤:
在本发明实施例中,对于Q1中的每一个由标识符构建而成的序偶<编号,标识符>,执行如下操作:
S131、对符合标识符类型的原始单词执行切割操作,生成多个对应的驼峰单词与目标驼峰编号数据。
在本发明实施例中,将标识符以驼峰命名规则进行切割,得到若干新单词,称为驼峰单词;对每个驼峰单词,如果没有出现过,则都赋予一个新编编号;否则沿用之前的编号,生成对应的目标驼峰编号数据。
S132、采用各驼峰单词与各驼峰单词关联的目标驼峰编号数据,构建多个对应的初始驼峰单词序偶数据。
在本发明实施例中,将一个驼峰单词及其编号构成由一个序偶<驼峰单词,编号>组成的初始驼峰单词序偶数据。
S133、按照预设切割先后顺序对多个初始驼峰单词序偶数据进行排列,生成多个对应的目标驼峰单词序偶数据。
在本发明实施例中,将所有的序偶<驼峰单词,编号>按被切割出来的先后次序进行排列,生成多个对应的目标驼峰单词序偶数据。
S134、将各目标驼峰单词序偶数据与原始单词编号序列中对应的原始序偶数据进行替换,生成对应的驼峰单词编号序列。
在本发明实施例中,将各目标驼峰单词序偶数据替换掉Q1中的对应的序偶<标识符,编号>,由此得到驼峰单词编号序列Q2。
例如:对于一个函数:int example{MyID=b;b=c;};可得到Q1={<int,1>,<example,2>,<{,3>,<My,14>,<ID,15><=,5>,<b,6>,<;7>,<b,8>,<=,9>,<c,10>,<;,11>,<},12>,<;,13>}。
进一步地,S15包括以下子步骤:
S151、对AST语法树进行先序遍历切分,得到多个语句子树。
在本发明实施例中,对AST进行先序遍历,将每一条分支语句、循环语句或者顺序语句块等所对应的子树进行切分,得到由若干棵语句子树构成的序列{T1,T2,…},Ti是指语句子树。
S152、对各个语句子树内的每个AST单词进行编号,得到多个AST单词编号对。
在本发明实施例中,在任意语句子树Ti的每一个节点中,都包含一个单词序列,将这些单词称为AST单词。对每个AST单词赋予一个唯一的编号,得到序偶<AST单词,编号>,也就是AST单词编号对。
S153、采用多个AST单词编号对,生成多个目标AST子树。
在本发明实施例中,将每一个序偶<AST单词,编号>替换原AST单词,可得到一棵新的子树T′1。由所有新子树构成的序列Q3={T′1,T′2,…}称为AST子树序列,也就是目标AST子树。
S154、采用全部目标AST子树构建ASG语法图数据。
进一步地,S154包括以下子步骤:
S1541、对目标AST子树中的每个AST单词编号对进行向量转换,生成多个对应的AST子树向量。
在本发明实施例中,对任意目标AST子树T′i∈Q3,将T′i中所有节点内的单词都应用torch.nn.Embedding方法(运用词向量化方法)转化为一个256维的特征向量。将所有构造出来的特征向量表示为[N,256],其中N为特征向量个数。
S1542、从多个目标AST子树中选取含有多个AST子树向量的关联目标AST子树。
值得一提的是,一个AST中含有M个目标AST子树,一个目标AST子树内含有N个节点,一个节点内可能有一个单词,也可能有多个单词。
在本发明实施例中,选取含有多个单词(此时的单词已经进行向量转换,转换为AST子树向量)的节点对应的目标AST子树作为关联目标AST子树。
S1543、将关联目标AST子树内的各AST子树向量依次连接,生成多条目标连接边。
在本发明实施例中,对目标AST子树的节点中含有多个单词的情况进行拆分,此时的单词已经进行向量转换,转换为AST子树向量,因此是对AST子树向量进行拆分,使得每个AST子树向量构成一个图节点,并把它们依次连接起来。在整个过程中保留原始AST所产生的边。
S1544、计算目标连接边连接的两个AST子树向量之间的目标欧式距离对应的倒数,得到目标连接边的目标权重。
在本发明实施例中,对每一条边所连接的两个节点向量求欧几里得几何距离,求得的几何距离值的倒数作为该条边的权重。
S1545、获取全部目标AST子树在AST语法树中的位置信息。
在本发明实施例中,获取各目标AST子树在原AST中的位置信息。
S1546、根据位置信息将目标AST子树作为目标节点,构建对应的ASG语法图数据。
在本发明实施例中,将所有的子树都转化为ASG之后,根据各子树在原AST中的位置信息,将各子树对应的图向量作为目标节点,生成一棵与原AST结构相同的树,也就是构建对应的ASG语法图数据。对其进行先序遍历就得到了一个训练样本。
值得一提的是,图向量,是指子树的所有节点向量经过训练后会生成一个图向量,这个图向量代表整个子树的特征。
值得一提的是,ASG语法图表示的是抽象语法图ASG,抽象语法图ASG是指在原AST的基础上,对AST节点中的单词序列拆分为一系列新节点,然后在所有新节点之间添加边构成的图状结构。ASG中的所有边都会被赋予一个权重。具体的权重计算方法有多种,在本发明中采用计算欧氏距离来计算权重的方法,但不仅限于此方法。
1.torch又称PyTorch,是一个基于Python的深度学习框架,一个开源的Python机器学习库。
2.torch.nn.Embedding是torch中的一个方法,用于将文本编号转化为指定维度的特征向量。
步骤202、采用多个预设目标编码器与预设目标解码器构建初始函数注释生成网络模型。
如图4所示,提供的一种目标函数注释生成网络模型结构图。
在本发明实施例中,使用编码器-解码器结构搭建一个初始函数注释生成网络模型。其中目标编码器使用三个编码器进行编码,包括源代码编码器(Source-code Encoder,SE)、驼峰代码编码器(Camel-code Encoder,CE)以及基于图神经网络搭建的语法树编码器(GNN-AST Encoder,AE)。
步骤203、采用代码函数序列数据对初始函数注释生成网络模型进行训练,生成目标函数注释生成网络模型。
进一步地,步骤203包括以下子步骤:
S21、将代码函数序列数据输入初始函数注释生成网络模型,生成对应的训练代码函数注释。
在本发明实施例中,将经过函数预处理得到的代码函数序列数据按照一定的比例划分为训练集、验证集和测试集,训练集、验证集和测试集是互不包含的数据。一般来说训练集中包含的数据要远多于验证集和测试集,大约占数据集总数的90%-98%。验证集和测试集一般来说数量相等,各占数据集总数的1%-5%。在本实施例中,数据集划分比例为90%:5%:5%。并输入初始函数注释生成网络模型进行训练。
S22、连续计算训练代码函数注释与关联的标准代码函数注释之间的多个轮次的平均损失值。
训练代码函数注释,指的是将代码函数序列数据输入初始函数注释生成网络模型生成的训练代码函数注释。
标准代码函数注释,指的是代码函数序列数据所对应的标准注释。
在本发明实施例中,连续计算训练代码函数注释与关联的标准代码函数注释之间的多个轮次的平均损失值。
S23、计算每一轮次的平均损失值与前一轮次的平均损失值之差,生成多个目标损失值。
在本发明实施例中,计算相邻两个轮次的平均损失值之间之差,生成多个目标损失值。
S24、若所有目标损失值的绝对值均小于预设的标准阈值时,停止训练,生成目标函数注释生成网络模型。
值得一提的是,至于具体计算多少个轮次的平均损失值,一般取总轮次的1/3或者1/5,可由模型训练者自行决定。
在本发明实施例中,若所有目标损失值的绝对值均小于预设的标准阈值时,停止训练,生成目标函数注释生成网络模型。
进一步地,步骤203还包括以下子步骤:
S25、若任一目标损失值的绝对值大于或等于预设的标准阈值时,则按照预设梯度调整初始函数注释生成网络模型的参数,并跳转将代码函数序列数据输入初始函数注释生成网络模型,生成对应的训练代码函数注释的步骤。
在本发明实施例中,若任一目标损失值的绝对值大于或等于预设的标准阈值时,则按照梯度下降法调整初始函数注释生成网络模型的参数,并跳转将代码函数序列数据输入初始函数注释生成网络模型,生成对应的训练代码函数注释的步骤,重新进行训练。
在本发明另一个示例中,在构建的初始函数注释生成网络模型基础上训练并更新各层的参数,先初始化所有神经网络参数,设置模型相关的超参数,如:词嵌入的维度、批处理的大小、优化器的选用、学习率的大小、梯度剪裁策略的最大值、在解码器阶段集束搜索方法的宽度等。在初始化参数后,将处理过的训练集和验证集数据划分为多个批次,每次将一批次的训练集数据输入到模型当中进行训练,得到该批次的训练损失值loss。当对整个训练集的所有批次数据完成一轮训练后(在实际训练过程中,很可能会有多轮),将验证集按照批次输入至模型,得到相应批次损失值batch_loss。在训练和验证时,网络模型将根据每次loss和batch_loss情况自动学习并进行参数调整。当训练过程进行了一轮或多轮,直至batch_loss值趋于收敛时,模型训练结束。
值得一提的是,梯度下降法(Gradient descent)是一个一阶最优化算法。要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。
进一步地,目标函数注释生成网络模型包括源代码编码器、驼峰代码编码器和基于图神经网络搭建的语法树编码器、目标解码器和信息聚合层。
步骤204、对目标代码函数数据进行函数预处理,生成对应的原始单词编号序列、驼峰单词编号序列和ASG语法图数据。
在本发明实施例中,当接收到目标代码函数数据时,也就是当接收到源代码时,对目标代码函数数据进行函数预处理,生成对应的原始单词编号序列、驼峰单词编号序列和ASG语法图数据,其函数预处理的步骤与步骤201相同,在此不在论述。
步骤205、通过源代码编码器对原始单词编号序列进行编码,提取对应的函数权重信息。
在本发明实施例中,由于经过驼峰处理的标识符已被拆分为一个单词序列,无法提供整个标识符的注意力权重,所以本实施例使用一个源代码编码器(Source-codeEncoder)去分配拆分处理之前整个标识符的注意力权重信息。Source-code Encoder用于对原始单词编号序列Q1进行编码,使函数的不同位置分配不同的注意力权重信息。对于长度为Ls未进行拆分的函数编码向量序列使用基于Transformer神经网络模型编码器(以下简称为Transformer模型)将Xs转换为输出向量公式为/> 其中 WQ,WK,WV分别是queries、keys和values(Transformer模型训练过程中的三个向量)的矩阵表示,/>是关于values编码i和j的相对位置表示,xj为第j个单词编码向量,dk为queries的维度,S代表Source-codeEncoder;Q分别代表Transformer模型训练过程中的queries向量,K分别代表Transformer模型训练过程中的keys向量,V分别代表Transformer模型训练过程中的values向量,eij、eik是由注意力计算得到的相关系数,xi是Xs中的第i个数据。
步骤206、通过驼峰代码编码器对驼峰单词编号序列进行编码,提取对应的函数数语义信息。
在本发明实施例中,对标识符根据驼峰命名规则进行拆分后,可以大大缓解词汇不足(out-of-vocabulary,OOV)的情况,同时能够丰富函数的语义信息。所以本实施例使用一个Camel-code Encoder来对驼峰单词编号序列Q2进行编码,从而提取函数中的语义信息。对于长度为Lc的函数编码向量序列 使用基于Transformer神经网络模型编码器(以下简称为Transformer模型)将Xc转换为输出向量/>对于任意分量/> 其中/> WQ,WK,WV分别是queries、keys和values(Transformer模型训练过程中的三个向量)的矩阵表示,/>是关于values位置编码i和j的相对位置表示,xj为第j个单词编码向量,dk为queries的维度,C代表Camel-code Encoder;Q分别代表Transformer模型训练过程中的queries向量;K分别代表Transformer模型训练过程中的keys向量;V分别代表Transformer模型训练过程中的values向量;eij、eik是由注意力计算得到的相关系数;xi是Xs中的第i个数据。
步骤207、通过基于图神经网络搭建的语法树编码器从ASG语法图数据提取对应的函数结构信息。
进一步地,步骤207可以包括以下子步骤:
S31、获取ASG语法图数据内的ASG节点向量。
S32、对ASG节点向量进行聚合,生成对应的ASG节点聚合向量。
S33、获取ASG节点聚合向量在关联的AST语法树中的关联位置数据。
S34、根据关联位置数据将ASG节点聚合向量作为连接节点,构建对应的函数结构信息。
在本一个示例中,如图5所示,源代码对应的AST可以很好的反映源代码的结构信息,可用于提高生成的代码注释质量。本实施例中采用了一个图神经网络来提取AST的结构信息。相较于使用RNN或者类树结构网络,使用图神经网络能够更好的保留AST的原始结构信息,在不破坏AST结构信息的前提下去提取结构信息。同时为了防止一个AST过大,导致损失预测精度和计算资源耗费过大的问题,本实施例中将AST中的复合结构(即顺序语句块、分支语句、循环语句等)进行拆分,得到一个AST子树序列,并将每一棵AST子树转换为一个相应的ASG,因此会得到一个ASG序列。将每个ASG的各个节点用向量表示,输入到图神经网络中进行训练,结果是一组聚合后的ASG向量。各个ASG向量分别表示AST的各局部结构特征信息。再根据各AST子树在原AST中的位置信息,将各个ASG向量作为节点,生成一棵与原AST结构相同的树。将该树输入到一个循环递归网络当中进行训练,得到AST的全局结构信息。
基于图神经网络的语法树编码器结构图如下图5所示。对于长度为LA的ASG向量序列在t时刻,GNN-AST Encoder接收拆分后的源代码输入/>使用GRU单元fA将上一时刻的隐藏状态/>更新为/>公式/>从而可以得到GNN-AST Encoder的所有隐藏状态/>
步骤208、通过信息聚合层对函数语义信息与函数结构信息进行数据维度压缩,生成目标压缩数据。
在本发明实施例中,采用信息聚合层(Information Aggregation Layer),对GNN-AST Encoder和Camel-code Encoder的最终隐藏状态和/>来进行维度映射,由此得到解码器的初始状态S0。S0的计算过程可以表示为/> 其中Wh是模型需要学习的参数,/>是AST Encoder的最终隐藏状态,/>是Camel-code Encoder的最终隐藏状态,Sigmoid是一个用于将/>和/>映射为S0的线性函数。在实际应用中,也可以使用其它如tanh、ELU(Exponential Linear Units)的线性函数来替换Sigmoid函数。维度映射实际上是将/>和/>聚合为一个解码器初始状态S0,起到了压缩数据维度的作用。
通过信息聚合层,可以将GNN-AST Encoder提取的函数结构信息和Camel-codeEncoder提取的函数语义信息传递到目标解码器。
步骤209、通过目标解码器对函数权重信息与目标压缩数据进行解码,生成对应的目标代码函数注释。
在本发明实施例中,使用了基于Transformer的解码器对经过编码器编码的函数特征信息进行解码以生成代码注释。应用了现有的标准的Transformer解码器方法。
值得一提的是,在每个编码器之后引入了标准的注意力机制,使得目标函数注释生成网络模型能够直接关注函数信息中的各种细节信息。在目标解码器阶段根据注意力机制赋予的权重信息和信息聚合层输出的初始状态S0生成目标代码函数注释。应用了现有的标准的注意力方法。
在本发明中,当接收到训练代码函数数据时,对训练代码函数数据进行函数预处理,生成对应的代码函数序列数据;采用多个预设目标编码器与预设目标解码器构建初始函数注释生成网络模型;采用代码函数序列数据对初始函数注释生成网络模型进行训练,生成目标函数注释生成网络模型;当接收到目标代码函数数据时,对目标代码函数数据进行函数预处理,并通过目标函数注释生成网络模型生成对应的目标代码函数注释。解决现有的代码注释生成技术对输入的源代码时进行注释时,往往会存在代码注释无法快速、准确地生成的技术问题。消除传统方法中将AST转化为序列形式导致函数结构信息丢失,以及传统RNN模型难以捕获函数内部关系中的长期依赖关系的问题;同时解决了使用类树编码器的方法只关注到AST局部结构信息,忽略了AST整体结构信息的问题,以及图编码器的模型使用整个AST作为输入又会存在模型训练量过大的问题;同时,对AST进行拆分,可以有效降低AST的规模,从而减少模型的训练量。将分割得到的子树转化为ASG输入到图神经网络编码器当中进行训练,可以保持其原先结构信息,从而增强编码器对AST结构信息的提取能力。在本实施例中,针对输入的源代码,也就是目标代码函数数据,在函数层次快速、准确地生成对应的注释。
(1)对函数的抽象语法树AST按照复合结构进行切割,每个AST切割后得到一组AST子树,避免AST过大造成模型训练量剧增。
(2)将获得的每组子树转化为对应ASG,以ASG来表示完整的函数语义信息。
(3)使用图神经网络作为基于图神经网络的语法树编码器,将其来更好地提取函数语义信息。
(4)将经过基于图神经网络的语法树编码器的子图特征信息,重新聚合为函数的语法树结构,并对该语法树结构进行结构信息提取。
(5)为了避免驼峰代码编码器和源代码编码器提取的词法信息冗余,所以舍弃了源代码编码器的词法信息,只使用源代码编码器学习到的函数单词的注意力权重信息。
(6)对驼峰代码编码器和基于图神经网络的语法树编码器提取的特征信息经过一个信息聚合层,从而融合函数的词法信息和语义信息。
请参阅图6,图6为本发明实施例三提供的一种代码注释生成系统的结构框图。
本发明提供的一种代码注释生成系统,包括:
数据函数预处理模块301,用于当接收到训练代码函数数据时,对训练代码函数数据进行函数预处理,生成对应的代码函数序列数据。
初始函数注释生成网络模型构建模块302,用于采用多个预设目标编码器与预设目标解码器构建初始函数注释生成网络模型。
目标函数注释生成网络模型生成模块303,用于采用代码函数序列数据对初始函数注释生成网络模型进行训练,生成目标函数注释生成网络模型。
目标代码函数注释生成模块304,用于当接收到目标代码函数数据时,对目标代码函数数据进行函数预处理,并通过目标函数注释生成网络模型生成对应的目标代码函数注释。
进一步地,代码函数序列数据包括原始单词编号序列、驼峰单词编号序列和ASG语法图数据,数据函数预处理模块301包括:
原始单词序列获取子模块,用于获取训练代码函数数据,对训练代码函数数据进行分割,生成对应的原始单词序列。
原始单词编号序列获取子模块,用于对原始单词序列内的原始单词进行编号,得到对应的原始单词编号序列。
驼峰单词编号序列获取子模块,用于对符合标识符类型的原始单词执行编号变换操作,生成对应的驼峰单词编号序列。
AST语法树转换子模块,用于通过预设语法树解析器将训练代码函数数据转换为AST语法树。
ASG语法图数据生成子模块,用于对AST语法树进行语法图转换,生成对应的ASG语法图数据。
进一步地,驼峰单词编号序列获取子模块包括:
切割单元,用于对符合标识符类型的原始单词执行切割操作,生成多个对应的驼峰单词与目标驼峰编号数据。
初始驼峰单词序偶数据获取单元,用于采用各驼峰单词与各驼峰单词关联的目标驼峰编号数据,构建多个对应的初始驼峰单词序偶数据。
目标驼峰单词序偶数据获取单元,用于按照预设切割先后顺序对多个初始驼峰单词序偶数据进行排列,生成多个对应的目标驼峰单词序偶数据。
驼峰单词编号序列生成单元,用于将各目标驼峰单词序偶数据与原始单词编号序列中对应的原始序偶数据进行替换,生成对应的驼峰单词编号序列。
进一步地,ASG语法图数据生成子模块包括:
语句子树获取单元,用于对AST语法树进行先序遍历切分,得到多个语句子树。
AST单词编号对获取单元,用于对各个语句子树内的每个AST单词进行编号,得到多个AST单词编号对。
目标AST子树获取单元,用于采用多个AST单词编号对,生成多个目标AST子树。
ASG语法图数据构建单元,用于采用全部目标AST子树构建ASG语法图数据。
进一步地,ASG语法图数据构建单元包括:
AST子树向量生成子单元,用于对目标AST子树中的每个AST单词编号对进行向量转换,生成多个对应的AST子树向量。
关联目标AST子树获取子单元,用于从多个目标AST子树中选取含有多个AST子树向量的关联目标AST子树。
目标连接边生成子单元,用于将关联目标AST子树内的各AST子树向量依次连接,生成多条目标连接边。
目标权重获取子单元,用于计算目标连接边连接的两个AST子树向量之间的目标欧式距离对应的倒数,得到目标连接边的目标权重。
位置信息获取子单元,用于获取全部目标AST子树在AST语法树中的位置信息。
ASG语法图数据构建子单元,用于根据位置信息将目标AST子树作为目标节点,构建对应的ASG语法图数据。
进一步地,目标函数注释生成网络模型生成模块303包括:
训练代码函数注释获取子模块,用于将代码函数序列数据输入初始函数注释生成网络模型,生成对应的训练代码函数注释。
平均损失值计算子模块,用于连续计算训练代码函数注释与关联的标准代码函数注释之间的多个轮次的平均损失值。
目标损失值获取子模块,用于计算每一轮次的平均损失值与前一轮次的平均损失值之差,生成多个目标损失值。
目标函数注释生成网络模型获取子模块,用于若所有目标损失值的绝对值均小于预设的标准阈值时,停止训练,生成目标函数注释生成网络模型。
进一步地,目标函数注释生成网络模型生成模块303还包括:
跳转子模块,用于若任一目标损失值的绝对值大于或等于预设的标准阈值时,则按照预设梯度调整初始函数注释生成网络模型的参数,并跳转将代码函数序列数据输入初始函数注释生成网络模型,生成对应的训练代码函数注释的步骤。
进一步地,目标函数注释生成网络模型包括源代码编码器、驼峰代码编码器和基于图神经网络搭建的语法树编码器、目标解码器和信息聚合层,目标代码函数注释生成模块304包括:
目标代码函数数据处理子模块,用于对目标代码函数数据进行函数预处理,生成对应的原始单词编号序列、驼峰单词编号序列和ASG语法图数据。
函数权重信息提取子模块,用于通过源代码编码器对原始单词编号序列进行编码,提取对应的函数权重信息。
函数语义信息提取子模块,用于通过驼峰代码编码器对驼峰单词编号序列进行编码,提取对应的函数语义信息。
函数结构信息提取子模块,用于通过基于图神经网络搭建的语法树编码器从ASG语法图数据提取对应的函数结构信息。
目标压缩数据获取子模块,用于通过信息聚合层对函数语义信息与函数结构信息进行数据维度压缩,生成目标压缩数据。
解码子模块,用于通过目标解码器对函数权重信息与目标压缩数据进行解码,生成对应的目标代码函数注释。
进一步地,函数结构信息提取子模块包括:
ASG节点向量获取单元,用于获取ASG语法图数据内的ASG节点向量;
ASG节点聚合向量生成单元,用于对ASG节点向量进行聚合,生成对应的ASG节点聚合向量;
关联位置数据获取单元,用于获取ASG节点聚合向量在关联的AST语法树中的关联位置数据;
函数结构信息获取单元,用于根据关联位置数据将ASG节点聚合向量作为连接节点,构建对应的函数结构信息。
在本发明中,当接收到训练代码函数数据时,对训练代码函数数据进行函数预处理,生成对应的代码函数序列数据;采用多个预设目标编码器与预设目标解码器构建初始函数注释生成网络模型;采用代码函数序列数据对初始函数注释生成网络模型进行训练,生成目标函数注释生成网络模型;当接收到目标代码函数数据时,对目标代码函数数据进行函数预处理,并通过目标函数注释生成网络模型生成对应的目标代码函数注释。解决现有的代码注释生成技术对输入的源代码时进行注释时,往往会存在代码注释无法快速、准确地生成的技术问题。消除传统方法中将AST转化为序列形式导致函数结构信息丢失,以及传统RNN模型难以捕获函数内部关系中的长期依赖关系的问题;同时解决了使用类树编码器的方法只关注到AST局部结构信息,忽略了AST整体结构信息的问题,以及图编码器的模型使用整个AST作为输入又会存在模型训练量过大的问题;同时,对AST进行拆分,可以有效降低AST的规模,从而减少模型的训练量。将分割得到的子树转化为ASG输入到图神经网络编码器当中进行训练,可以保持其原先结构信息,从而增强编码器对AST结构信息的提取能力。在本实施例中,针对输入的源代码,也就是目标代码函数数据,在函数层次快速、准确地生成对应的注释。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
以上,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (4)
1.一种代码注释生成方法,其特征在于,包括:
当接收到训练代码函数数据时,对所述训练代码函数数据进行函数预处理,生成对应的代码函数序列数据;
采用多个预设目标编码器与预设目标解码器构建初始函数注释生成网络模型;
采用所述代码函数序列数据对所述初始函数注释生成网络模型进行训练,生成目标函数注释生成网络模型;
当接收到目标代码函数数据时,对所述目标代码函数数据进行函数预处理,并通过所述目标函数注释生成网络模型生成对应的目标代码函数注释;
所述代码函数序列数据包括原始单词编号序列、驼峰单词编号序列和ASG语法图数据,所述当接收到训练代码函数数据时,对所述训练代码函数数据进行函数预处理,生成对应的代码函数序列数据的步骤,包括:
获取训练代码函数数据,对所述训练代码函数数据进行分割,生成对应的原始单词序列;
对所述原始单词序列内的原始单词进行编号,得到对应的所述原始单词编号序列;
对符合标识符类型的原始单词执行编号变换操作,生成对应的所述驼峰单词编号序列;
通过预设语法树解析器将所述训练代码函数数据转换为AST语法树;
对所述AST语法树进行语法图转换,生成对应的所述ASG语法图数据;
所述对符合标识符类型的原始单词执行编号变换操作,生成对应的所述驼峰单词编号序列的步骤,包括:
对符合标识符类型的原始单词执行切割操作,生成多个对应的驼峰单词与目标驼峰编号数据;
采用各所述驼峰单词与各所述驼峰单词关联的所述目标驼峰编号数据,构建多个对应的初始驼峰单词序偶数据;
按照预设切割先后顺序对多个所述初始驼峰单词序偶数据进行排列,生成多个对应的目标驼峰单词序偶数据;
将各所述目标驼峰单词序偶数据与所述原始单词编号序列中对应的原始序偶数据进行替换,生成对应的所述驼峰单词编号序列;
所述对所述AST语法树进行语法图转换,生成对应的所述ASG语法图数据的步骤,包括:
对所述AST语法树进行先序遍历切分,得到多个语句子树;
对各个所述语句子树内的每个AST单词进行编号,得到多个AST单词编号对;
采用多个所述AST单词编号对,生成多个目标AST子树;
采用全部所述目标AST子树构建ASG语法图数据;
所述采用全部所述目标AST子树构建ASG语法图数据的步骤,包括:
对所述目标AST子树中的每个所述AST单词编号对进行向量转换,生成多个对应的AST子树向量;
从多个所述目标AST子树中选取含有多个所述AST子树向量的关联目标AST子树;
将所述关联目标AST子树内的各所述AST子树向量依次连接,生成多条目标连接边;
计算所述目标连接边连接的两个所述AST子树向量之间的目标欧式距离对应的倒数,得到所述目标连接边的目标权重;
获取全部所述目标AST子树在所述AST语法树中的位置信息;
根据所述位置信息将所述目标AST子树作为目标节点,构建对应的ASG语法图数据;
所述目标函数注释生成网络模型包括源代码编码器、驼峰代码编码器和基于图神经网络搭建的语法树编码器、目标解码器和信息聚合层,所述当接收到目标代码函数数据时,对所述目标代码函数数据进行函数预处理,并通过所述目标函数注释生成网络模型生成对应的目标代码函数注释的步骤,包括:
对目标代码函数数据进行函数预处理,生成对应的所述原始单词编号序列、所述驼峰单词编号序列和所述ASG语法图数据;
通过所述源代码编码器对所述原始单词编号序列进行编码,提取对应的函数权重信息;
通过所述驼峰代码编码器对所述驼峰单词编号序列进行编码,提取对应的函数语义信息;
通过所述基于图神经网络搭建的语法树编码器从所述ASG语法图数据提取对应的函数结构信息;
通过所述信息聚合层对所述函数语义信息与所述函数结构信息进行数据维度压缩,生成目标压缩数据;
通过所述目标解码器对所述函数权重信息与所述目标压缩数据进行解码,生成对应的目标代码函数注释;
所述通过所述基于图神经网络搭建的语法树编码器从所述ASG语法图数据提取对应的函数结构信息的步骤,包括:
获取所述ASG语法图数据内的ASG节点向量;
对所述ASG节点向量进行聚合,生成对应的ASG节点聚合向量;
获取所述ASG节点聚合向量在关联的AST语法树中的关联位置数据;
根据所述关联位置数据将所述ASG节点聚合向量作为连接节点,构建对应的函数结构信息。
2.根据权利要求1所述的代码注释生成方法,其特征在于,所述采用所述代码函数序列数据对所述初始函数注释生成网络模型进行训练,生成目标函数注释生成网络模型的步骤,包括:
将所述代码函数序列数据输入所述初始函数注释生成网络模型,生成对应的训练代码函数注释;
连续计算所述训练代码函数注释与关联的标准代码函数注释之间的多个轮次的平均损失值;
计算每一轮次的所述平均损失值与前一轮次的所述平均损失值之差,生成多个目标损失值;
若所有所述目标损失值的绝对值均小于预设的标准阈值时,停止训练,生成目标函数注释生成网络模型。
3.根据权利要求2所述的代码注释生成方法,其特征在于,还包括:
若任一所述目标损失值的绝对值大于或等于预设的标准阈值时,则按照预设梯度调整所述初始函数注释生成网络模型的参数,并跳转所述将所述代码函数序列数据输入所述初始函数注释生成网络模型,生成对应的训练代码函数注释的步骤。
4.一种代码注释生成系统,其特征在于,包括:
数据函数预处理模块,用于当接收到训练代码函数数据时,对所述训练代码函数数据进行函数预处理,生成对应的代码函数序列数据;
初始函数注释生成网络模型构建模块,用于采用多个预设目标编码器与预设目标解码器构建初始函数注释生成网络模型;
目标函数注释生成网络模型生成模块,用于采用所述代码函数序列数据对所述初始函数注释生成网络模型进行训练,生成目标函数注释生成网络模型;
目标代码函数注释生成模块,用于当接收到目标代码函数数据时,对所述目标代码函数数据进行函数预处理,并通过所述目标函数注释生成网络模型生成对应的目标代码函数注释;
所述代码函数序列数据包括原始单词编号序列、驼峰单词编号序列和ASG语法图数据,所述数据函数预处理模块包括:
原始单词序列获取子模块,用于获取训练代码函数数据,对所述训练代码函数数据进行分割,生成对应的原始单词序列;
原始单词编号序列获取子模块,用于对所述原始单词序列内的原始单词进行编号,得到对应的所述原始单词编号序列;
驼峰单词编号序列获取子模块,用于对符合标识符类型的原始单词执行编号变换操作,生成对应的所述驼峰单词编号序列;
AST语法树转换子模块,用于通过预设语法树解析器将所述训练代码函数数据转换为AST语法树;
ASG语法图数据生成子模块,用于对所述AST语法树进行语法图转换,生成对应的所述ASG语法图数据;
所述驼峰单词编号序列获取子模块包括:
切割单元,用于对符合标识符类型的原始单词执行切割操作,生成多个对应的驼峰单词与目标驼峰编号数据;
初始驼峰单词序偶数据获取单元,用于采用各所述驼峰单词与各所述驼峰单词关联的所述目标驼峰编号数据,构建多个对应的初始驼峰单词序偶数据;
目标驼峰单词序偶数据获取单元,用于按照预设切割先后顺序对多个所述初始驼峰单词序偶数据进行排列,生成多个对应的目标驼峰单词序偶数据;
驼峰单词编号序列生成单元,用于将各所述目标驼峰单词序偶数据与所述原始单词编号序列中对应的原始序偶数据进行替换,生成对应的所述驼峰单词编号序列;
所述ASG语法图数据生成子模块包括:
语句子树获取单元,用于对所述AST语法树进行先序遍历切分,得到多个语句子树;
AST单词编号对获取单元,用于对各个所述语句子树内的每个AST单词进行编号,得到多个AST单词编号对;
目标AST子树获取单元,用于采用多个所述AST单词编号对,生成多个目标AST子树;
ASG语法图数据构建单元,用于采用全部所述目标AST子树构建ASG语法图数据;
所述ASG语法图数据构建单元包括:
AST子树向量生成子单元,用于对所述目标AST子树中的每个所述AST单词编号对进行向量转换,生成多个对应的AST子树向量;
关联目标AST子树获取子单元,用于从多个所述目标AST子树中选取含有多个所述AST子树向量的关联目标AST子树;
目标连接边生成子单元,用于将所述关联目标AST子树内的各所述AST子树向量依次连接,生成多条目标连接边;
目标权重获取子单元,用于计算所述目标连接边连接的两个所述AST子树向量之间的目标欧式距离对应的倒数,得到所述目标连接边的目标权重;
位置信息获取子单元,用于获取全部所述目标AST子树在所述AST语法树中的位置信息;
ASG语法图数据构建子单元,用于根据所述位置信息将所述目标AST子树作为目标节点,构建对应的ASG语法图数据;
所述目标函数注释生成网络模型包括源代码编码器、驼峰代码编码器和基于图神经网络搭建的语法树编码器、目标解码器和信息聚合层,所述目标代码函数注释生成模块包括:
目标代码函数数据处理子模块,用于对目标代码函数数据进行函数预处理,生成对应的所述原始单词编号序列、所述驼峰单词编号序列和所述ASG语法图数据;
函数权重信息提取子模块,用于通过所述源代码编码器对所述原始单词编号序列进行编码,提取对应的函数权重信息;
函数语义信息提取子模块,用于通过所述驼峰代码编码器对所述驼峰单词编号序列进行编码,提取对应的函数语义信息;
函数结构信息提取子模块,用于通过所述基于图神经网络搭建的语法树编码器从所述ASG语法图数据提取对应的函数结构信息;
目标压缩数据获取子模块,用于通过所述信息聚合层对所述函数语义信息与所述函数结构信息进行数据维度压缩,生成目标压缩数据;
解码子模块,用于通过所述目标解码器对所述函数权重信息与所述目标压缩数据进行解码,生成对应的目标代码函数注释;
所述函数结构信息提取子模块包括:
ASG节点向量获取单元,用于获取所述ASG语法图数据内的ASG节点向量;
ASG节点聚合向量生成单元,用于对所述ASG节点向量进行聚合,生成对应的ASG节点聚合向量;
关联位置数据获取单元,用于获取所述ASG节点聚合向量在关联的AST语法树中的关联位置数据;
函数结构信息获取单元,用于根据所述关联位置数据将所述ASG节点聚合向量作为连接节点,构建对应的函数结构信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211261472.3A CN115543437B (zh) | 2022-10-14 | 2022-10-14 | 一种代码注释生成方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211261472.3A CN115543437B (zh) | 2022-10-14 | 2022-10-14 | 一种代码注释生成方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115543437A CN115543437A (zh) | 2022-12-30 |
CN115543437B true CN115543437B (zh) | 2023-08-15 |
Family
ID=84736325
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211261472.3A Active CN115543437B (zh) | 2022-10-14 | 2022-10-14 | 一种代码注释生成方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115543437B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117170673B (zh) * | 2023-08-03 | 2024-05-17 | 浙江大学 | 面向二进制代码文本注释自动化生成方法及装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106250385A (zh) * | 2015-06-10 | 2016-12-21 | 埃森哲环球服务有限公司 | 用于文档的自动化信息抽象处理的系统和方法 |
CN113190219A (zh) * | 2021-05-08 | 2021-07-30 | 南通大学 | 一种基于递归神经网络模型的代码注释生成方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8015554B2 (en) * | 2006-03-24 | 2011-09-06 | International Business Machines Corporation | Source-to-source transformation for language dialects |
-
2022
- 2022-10-14 CN CN202211261472.3A patent/CN115543437B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106250385A (zh) * | 2015-06-10 | 2016-12-21 | 埃森哲环球服务有限公司 | 用于文档的自动化信息抽象处理的系统和方法 |
CN113190219A (zh) * | 2021-05-08 | 2021-07-30 | 南通大学 | 一种基于递归神经网络模型的代码注释生成方法 |
Non-Patent Citations (1)
Title |
---|
Huang Jiawen et al..Improving Just-In-Time Comment Updating via AST Edit Sequence.International Journal of Software Engineering and Knowledge Engineering.2022,第32卷(第10期),全文. * |
Also Published As
Publication number | Publication date |
---|---|
CN115543437A (zh) | 2022-12-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Chen et al. | Tree-to-tree neural networks for program translation | |
JP5128629B2 (ja) | 品詞タグ付けシステム、品詞タグ付けモデルのトレーニング装置および方法 | |
CN109933602B (zh) | 一种自然语言与结构化查询语言的转换方法及装置 | |
CN110489102B (zh) | 一种从自然语言自动生成Python代码的方法 | |
CN111930906A (zh) | 基于语义块的知识图谱问答方法及装置 | |
CN111241209B (zh) | 用于生成信息的方法和装置 | |
CN109325109A (zh) | 基于注意力编码器的抽取式新闻摘要生成装置 | |
CN116661805B (zh) | 代码表示的生成方法和装置、存储介质及电子设备 | |
CN111316296A (zh) | 学习层级提取模型的结构 | |
CN113190219A (zh) | 一种基于递归神经网络模型的代码注释生成方法 | |
CN115543437B (zh) | 一种代码注释生成方法和系统 | |
CN111507070A (zh) | 自然语言生成方法和装置 | |
CN115438709A (zh) | 基于代码属性图的代码相似性检测方法 | |
CN108733359B (zh) | 一种软件程序的自动生成方法 | |
CN117407532A (zh) | 一种利用大模型与协同训练进行数据增强的方法 | |
CN111831624A (zh) | 数据表创建方法、装置、计算机设备及存储介质 | |
CN112148879B (zh) | 一种自动给代码打数据结构标签的计算机可读存储介质 | |
CN117289938A (zh) | 一种软件开发用智能辅助系统 | |
CN115826988A (zh) | 一种基于数据流分析和注意力机制的Java方法注释即时自动更新方法 | |
CN115495085A (zh) | 一种基于深度学习细粒度代码模板的生成方法及装置 | |
CN112069777B (zh) | 一种基于骨架的二阶段数据到文本生成方法 | |
US20230186024A1 (en) | Text Processing Method, Device and Storage Medium | |
CN117573084B (zh) | 一种基于逐层融合抽象语法树的代码补全方法 | |
CN115408506B (zh) | 联合语义解析和语义成分匹配的nl2sql的方法 | |
Chen et al. | On Unified Prompt Tuning for Request Quality Assurance in Public Code Review |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |