CN110018820B - 一种基于深度强化学习的Graph2Seq自动生成Java代码注释的方法 - Google Patents

一种基于深度强化学习的Graph2Seq自动生成Java代码注释的方法 Download PDF

Info

Publication number
CN110018820B
CN110018820B CN201910277000.9A CN201910277000A CN110018820B CN 110018820 B CN110018820 B CN 110018820B CN 201910277000 A CN201910277000 A CN 201910277000A CN 110018820 B CN110018820 B CN 110018820B
Authority
CN
China
Prior art keywords
code
graph
reinforcement learning
model
node
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
Application number
CN201910277000.9A
Other languages
English (en)
Other versions
CN110018820A (zh
Inventor
李莹
高建伟
张凌飞
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Binhai Industrial Technology Research Institute of Zhejiang University
Original Assignee
Binhai Industrial Technology Research Institute of Zhejiang University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Binhai Industrial Technology Research Institute of Zhejiang University filed Critical Binhai Industrial Technology Research Institute of Zhejiang University
Priority to CN201910277000.9A priority Critical patent/CN110018820B/zh
Publication of CN110018820A publication Critical patent/CN110018820A/zh
Application granted granted Critical
Publication of CN110018820B publication Critical patent/CN110018820B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code

Abstract

本发明提供了一种基于深度强化学习的Graph2Seq自动生成Java代码注释的方法。在编码器端,通过将代码首先转化为代码图的形式,利用图结构来表达出代码的结构化信息,再使用图神经网络(Graph Neural Network)对程序图进行编码得到代码的结构化语义信息。在解码器端,本发明使用基于深度强化学习框架改进的解码器得到其对应的自然语言注释内容,解决了传统方法中在推理阶段没有真实序列单词指导导致的高偏差问题,从而实现代码注释自然生成的准确和自然。

Description

一种基于深度强化学习的Graph2Seq自动生成Java代码注释 的方法
技术领域
本发明属于Java代码注释自动生成技术领域,尤其是涉及一种基于深度强化学习的Graph2Seq自动生成Java代码注释的方法。
背景技术
随着互联网的高速发展,计算机软件,手机应用等已经成为互联网时代的支柱性产物,它已经广泛的应用在人们生活的方方面面,无数优秀的开发人员参与其中贡献了大量高水平的代码。代码是一种接近于机器语言,具有抽象性、复杂性和可变性的语言,本身具有难以理解的特点。伴随着现在软件的规模也在急剧扩大,而与日俱增的代码开发和维护工作已经成为程序员面临的问题。如何能够辅助开发人员理解代码,以帮助他们更好地完成开发流程,已经成为软件工程领域的研究热点。
据统计,在软件开发的生命周期中,将近60%的工作是用于维护工作,其中大部分的工作用在理解维护任务和相关软件源代码。软件维护需要代码理解,因为程序的阅读和理解是任何代码修改的先决条件。程序理解是意见非常耗时间的任务,会花费程序员大量的时间。在尝试对代码系统进行修改之前,开发人员必须了解即将修改的代码的意义。两种常见的理解代码的方法是搜索和浏览源代码,通常开发人员只浏览源代码(例如,只阅读函数的头部),当这种方法还不能够理解代码功能的时候,他们需要更加详细的阅读代码(例如,阅读函数体部分)。这是两个极端的策略:前者非常快,但是往往会产生误解,而后者非常耗时,理解代码会更加准确。一种显而易见的选择是为开发人员提供源代码的描述,帮助他们更快速的读取和理解代码内容。
开发人员经常使用集成开发环境,调试器和工具来进行代码搜索,测试和程序理解,以减少繁琐的任务。尽管有了很多的技术帮助程序员实现和测试开发的软件,但是在开发过程中保证高质量的代码注释是一项劳动密集型的任务,但是,实际上,因为项目工期十分紧张或者其他原因,代码标注往往会出现不匹配,错误或者更新不及时的问题,导致了在后期维护阶段,开发人员不得不花费大量时间用来去理解代码的功能。所以通过模型自动生成代码的注释不仅可以减少开发人员的写注释的时间,同时可以用来帮助理解代码,这个方法具有非常大的应用价值。
发明内容
有鉴于此,本发明旨在提出一种基于深度强化学习的Graph2Seq自动生成Java代码注释的方法,通过将代码首先转化为代码图的形式,利用图结构来表达出代码的结构化信息,再使用图神经网络(Graph Neural Network)对程序图进行编码得到代码的结构化语义信息,通过基于强化学习的解码器得到其对应的自然语言注释内容,实现代码注释自然生成的准确和自然。
为达到上述目的,本发明的技术方案是这样实现的:
一种基于深度强化学习的Graph2Seq自动生成Java代码注释的方法,包括以下步骤:
(1)数据获取,获取大量Java代码数据;
(2)数据预处理,从上述大量Java代码数据中筛选高质量的Java代码片段,并通过该代码片段生成以代码-注释对作为模型的训练数据集;
(3)代码转化为代码图,将训练数据集中的代码片段通过抽象语法树(AST)转化成代码图结构(Graph);
(4)模型搭建,构建基于门控机制的图神经网络的图编码器和基于深度强化学习的解码器,即基于深度强化学习的Graph2Seq模型(图编码器-解码器),并将步骤(3)中的代码图结构输入该基于深度强化学习的Graph2Seq模型,则该基于深度强化学习的Graph2Seq模型输出对应Java代码图的自然语言注释;
(5)模型训练:通过交叉验证的方法训练得到性能表现最好的模型。进一步的,所述步骤(1)中大量Java代码数据获取过程包括以下步骤:
(1-1)撰写爬虫程序,从github中爬取点赞数靠前的多个Java项目代码,保存到本地;
(1-2)对数据进行初步的清洗,去除其中非Java的代码文件。
进一步的,所述多个Java项目代码优选为十个。
进一步的,所述步骤(2)中从大量Java代码数据中筛选高质量的Java代码片段,并通过该代码片段生成以代码-注释对作为模型的训练数据集的过程包括以下步骤:
(2-1)对Java代码数据使用Eclipse的JDT编译器将Java方法解析为AST并提取相应的Javadoc注释,这些注释是Java方法的标准注释;
(2-2)对上述注释内容进行清洗和预处理,保留其中代码注释质量较高的代码片段,进而生成以代码-注释对作为模型的训练数据集。
进一步的,所述步骤(2-2)中对注释内容进行清洗和预处理过程如下:
忽略没有javadoc的Java代码方法;
对于带注释的函数方法,使用其javadoc描述中的第一个句子作为注释,因为这个句子通常是用来描述Java方法的功能,本发明的训练数据中的代码注释即是这部分;
过滤空注释和只有一个单词的注释,因为这些注释不能够表达出Java函数的具体功能细节。
进一步的,所述步骤(2-1)中的Java代码数据为去除了setter,getter,构造函数以及测试函数的数据集,因为这些代码能够非常容易生成对应的注释,容易导致模型过拟合。
进一步的,所述步骤(3)中将训练数据集中的代码片段通过抽象语法树(AST)转化成代码图结构(Graph)的具体步骤为:
(3-1)代码图的主干是代码的抽象语法树(AST),由语法节点(对应于编程语言语法树的非终端节点)和语法标识(对应于终端节点)组成,在图(Graph)中,对语法节点标记为程序语法树中的非终端节点,语法标记是使用它们标识的字符串作为标记的,代码图(Code Graph)使用AST边来链接AST树中的节点,同时添加一个NEXT_TOKEN标识符的边来连接每个语法标记的后继,来表达一个语法节点的孩子的顺序,
(3-2)代码图还需要添加连接不同用途的附加边以及与变量对应的语法标记的更新,使用LastLexicalUse(源代码与源代码文本中最后一次发生连接的“LastLexicalUse”边)边连接相同变量的所有用法,同时,使用ReturnsTo的边连接函数声明中的返回标识(Return To)(这将会创建其名称和类型的“快捷方式”);
(3-3)代码图将AST中的开放性单词使用字节对编码的方式拆分成子单词的形式,然后将其添加到代码图中,这些子单词和AST树进行连接,连接的边类型设置为SUB_WORD,进一步的对程序图进行了拓展;
(3-4)对于所有类型的边,我们添加它们各自的后向边(转置邻接矩阵),使边和边类型的数量加倍,后向边有助于在图编码器中更快地传播信息,并使模型更具表现力。
进一步的,所述步骤(4)中构建基于深度强化学习的Graph2Seq模型的具体步骤如下:
(4-1)搭建基于门控图神经网络的编码器:Graph2Seq的编码器是基于门控机制的图神经网络,它输入是代码图节点的嵌入向量,并使用图结构之间的边的作用,当遍历到图中某个节点的时候,图神经网络会将与此节点相连接的所有的边的信息(正向和反向)汇总到一起,生产一个“消息向量”的综合,用来更新节点的向量,我们会设置一个迭代次数的超参数T用来控制每个节点被遍历到的次数,通过T轮迭代,生成对应节点的隐藏状态;
(4-2)搭建基于深度强化学习的解码器:在编码器模块中,我们使用LSTM做解码,生成代码对应的自然语言序列,LSTM在预测i时刻对应的标识符yi的时候,通过输入所有的历史标识符y<i=y1,...,yi-1,以及通过注意力机制得到的上下文向量ci,可以计算得到当前时刻的隐藏状态si,然后,根据隐藏状态向量预测i时刻的单词,同时会有一个Critic网络用来Critic当前生成结果的价值,并极大化这种价值。然后,生成一个自然语言序列作为模型预测的代码注释序列。
进一步的,所述步骤(4-1)中代码图中对应节点隐藏状态即表示向量计算过程如下:
(4-11)初始化图顶点的隐藏向量表示,选择使用随机初始化Embedding层的的方法进行初始化,使用函数S表示,即:
Figure GDA0003734529240000051
(4-12)对于T轮更新的每一轮t来说:
a)每个顶点v∈V可以得到接受向量
Figure GDA0003734529240000052
这个向量是通过将邻接的节点的“消息”相加得到的,消息向量又是通过一个生产函数Mt得到:
Figure GDA0003734529240000061
b)每个节点v∈V会根据消息通过一个函数Ut更新它的隐藏状态:
Figure GDA0003734529240000062
从而得到了图节点每个节点的表示向量。
进一步的,所述步骤(4-2)中,所述上下文向量ci是根据编码器编码节点的向量表达(z1,z2,...,zV)得到的,每个节点表达zi包含了第i个节点在整个图中关注部分的信息,上下文向量是通过这些节点表示的加权和得到的,每个节点表示的权值aij是通过步骤(4-11)和步骤(4-12)中的公式计算得到的:
Figure GDA0003734529240000063
Figure GDA0003734529240000064
其中,a表示用来计算第j个输入节点和第i个输出序列匹配的对齐模型,匹配的得分值是基于解码器上一时刻的隐藏状态si-1和编码器编码的第j个节点的表达向量计算得到的。
基于深度强化学习的Graph2Seq模型中的注意力机制是使用一个前馈神经网络进行参数化训练得到,该网络与模型的其他部分共同训练,整个模型是联合训练,目标是对于给定的图,最大化其正确的自然语言描述的条件对数概率。在推理阶段,使用集束搜索的算法生成代码的描述,其中设置的集束大小(beam size)为5。
在解码器生成结果之后,Critic网络会对生成的结果评估其价值,价值是通过以下公式计算得到:
Figure GDA0003734529240000071
其中,π表示策略,st表示时间步t的状态。Critic网络会优化其损失函数,本发明采用平均均方误差损失函数,即:
Figure GDA0003734529240000072
其中,Vπ(st)表示目标价值,
Figure GDA0003734529240000073
表示预测价值。φ是Critic网络的参数。模型在训练过程中,是同时优化Actor网络和Critic网络。
L(Θ)=L(θ)+L(φ)
其中,L(θ)表示Actor网络的损失函数,θ表示Actor网络的参数。
进一步的,所述步骤(5)中的模型训练的具体步骤为:
(5-1)通过步骤(4)搭建好Java代码注释模型的解码器和编码器之后,将二者进行结合,采用端到端的训练方法进行训练;
(5-2)对需要设置的模型的参数,包括了选择优化器、学习率大小、图神经网络的层数、编码器的向量空间维度、嵌入层的维度以及解码器LSTM的输出维度,多个参数进行交叉验证,采用机器翻译质量评测算法BLEU-4作为性能指标,选择表现性能最好的训练参数下的模型。
相对于现有技术,本发明所述的基于深度强化学习的Graph2Seq自动生成Java代码注释的方法具有以下优势:
(1)本发明所述的基于深度强化学习的Graph2Seq自动生成Java代码注释的方法,通过将代码的抽象语法树和数据流结合,将代码的树结构拓展成代码图结构,采用了图结构的数据结构存储代码的结构化语义信息,图结构的优势在于能够表达复杂的代码节点关系信息,使得代码注释更加准确。
(2)本发明所述的基于深度强化学习的Graph2Seq自动生成Java代码注释的方法,同时创新性的提出了采用图神经网络编码图结构的代码图的每个节点,然后使用基于深度强化学习的解码器进行解码的模型结构,相比较于传统的方法,生成的自然语言注释更加准确和自然,更具有鲁棒性。
附图说明
构成本发明的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1为本发明实施例所述的基于深度强化学习的Graph2Seq自动生成Java代码注释方法的模型示意图;
图2为本发明实施例所述的图编码器示意图;
图3为本发明实施例所述的基于深度强化学习的解码器示意图。
图4为本发明的框架示意图。
具体实施方式
需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
在本发明的描述中,需要理解的是,术语“中心”、“纵向”、“横向”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”等的特征可以明示或者隐含地包括一个或者更多个该特征。在本发明的描述中,除非另有说明,“多个”的含义是两个或两个以上。
在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以通过具体情况理解上述术语在本发明中的具体含义。
下面将参考附图并结合实施例来详细说明本发明。
本发明利用深度学习领域的Seq2Seq方法,在其基础上进行了拓展,采用了图神经网络编码代码图,提出了基于深度强化学习的Graph2Seq的Java代码注释方法,能够自动生成给定的Java代码的注释描述。具体步骤为:
(1)数据获取:从github网站中爬取Java代码数据,对数据进行预处理。
(2)数据预处理:对代码数据使用Eclipse的JDT编译器进行注释内容的清洗和预处理,保留其中代码注释质量较高的代码片段。保留代码-注释对作为模型的训练数据集。
(3)代码转化为代码图:对训练数据集中的代码部分,使用Javaparser对其进行处理,将其转化为抽象语法树(AST),在其节点上增加不同类型的边,用这些边来表示数据流和控制流等语义信息。从而将AST树(Tree)拓展成一个图结构(Graph),称之为代码图。
(4)模型搭建:构建基于深度强化学习的Graph2Seq(图编码器-解码器)模型,模型的输入是训练数据得到的Java代码图,输出是对应的自然语言注释。
(5)模型训练:根据上述步骤得到的训练模型的数据和模型,通过交叉验证的方法训练得到性能表现最好的模型。
进一步的,所述步骤(1)中大量Java代码数据获取过程包括以下步骤:
(1-1)撰写爬虫程序,从github中爬取点赞数靠前的多个Java项目代码,保存到本地;
(1-2)对数据进行初步的清洗,去除其中非Java的代码文件。
进一步的,所述多个Java项目代码优选为十个。
进一步的,所述步骤(2)中从大量Java代码数据中筛选高质量的Java代码片段,并通过该代码片段生成以代码-注释对作为模型的训练数据集的过程包括以下步骤:
(2-1)对Java代码数据使用Eclipse的JDT编译器将Java方法解析为AST并提取相应的Javadoc注释,这些注释是Java方法的标准注释;
(2-2)对上述注释内容进行清洗和预处理,保留其中代码注释质量较高的代码片段,进而生成以代码-注释对作为模型的训练数据集。
进一步的,所述步骤(2-2)中对注释内容进行清洗和预处理过程如下:
忽略没有javadoc的Java代码方法;
对于带注释的函数方法,使用其javadoc描述中的第一个句子作为注释,因为这个句子通常是用来描述Java方法的功能,本发明的训练数据中的代码注释即是这部分;
过滤空注释和只有一个单词的注释,因为这些注释不能够表达出Java函数的具体功能细节。
进一步的,所述步骤(2-1)中的Java代码数据为去除了setter,getter,构造函数以及测试函数的数据集,因为这些代码能够非常容易生成对应的注释,容易导致模型过拟合。
数据集示例如下:
Figure GDA0003734529240000111
进一步的,所述步骤(3)中将训练数据集中的代码片段通过抽象语法树(AST)转化成代码图结构(Graph)的具体步骤为:
(3-1)代码图的主干是代码的抽象语法树(AST),由语法节点(对应于编程语言语法树的非终端节点)和语法标识(对应于终端节点)组成,在图(Graph)中,对语法节点标记为程序语法树中的非终端节点,语法标记是使用它们标识的字符串作为标记的,代码图(Code Graph)使用AST边来链接AST树中的节点,同时添加一个NEXT_TOKEN标识符的边来连接每个语法标记的后继,来表达一个语法节点的孩子的顺序,
(3-2)代码图还需要添加连接不同用途的附加边以及与变量对应的语法标记的更新,使用LastLexicalUse(源代码与源代码文本中最后一次发生连接的“LastLexicalUse”边)边连接相同变量的所有用法,同时,使用ReturnsTo的边连接函数声明中的返回标识(Return To)(这将会创建其名称和类型的“快捷方式”)。
本发明定义的边类型包括:
Figure GDA0003734529240000112
Figure GDA0003734529240000121
(3-3)代码图将AST中的开放性单词使用字节对编码的方式拆分成子单词的形式,然后将其添加到代码图中,这些子单词和AST树进行连接,连接的边类型设置为SUB_WORD,进一步的对程序图进行了拓展;
(3-4)对于所有类型的边,我们添加它们各自的后向边(转置邻接矩阵),使边和边类型的数量加倍,后向边有助于在图编码器中更快地传播信息,并使模型更具表现力。
进一步的,所述步骤(4)中构建基于深度强化学习的Graph2Seq模型的具体步骤如下:
(4-1)搭建基于门控图神经网络的编码器:Graph2Seq的编码器是基于门控机制的图神经网络,它输入是代码图节点的嵌入向量,并使用图结构之间的边的作用,当遍历到图中某个节点的时候,图神经网络会将与此节点相连接的所有的边的信息(正向和反向)汇总到一起,生产一个“消息向量”的综合,用来更新节点的向量,我们会设置一个迭代次数的超参数T用来控制每个节点被遍历到的次数,通过T轮迭代,生成对应节点的隐藏状态;
(4-2)搭建基于深度强化学习的解码器:采用Actor-Critic强化学习算法,在编码器模块中,使用LSTM做解码,生成代码对应的自然语言序列,LSTM在预测i时刻对应的标识符yi的时候,通过输入所有的历史标识符y<i=y1,...,yi-1,以及通过注意力机制得到的上下文向量ci,可以计算得到当前时刻的隐藏状态si,然后,根据隐藏状态向量预测i时刻的单词,在此步骤前的网络模型包括解码器端可以看做是一个Actor网络,在生成第i个公式过程中,设计了Critic网络来估计时间步i生产行为的价值,该Critic网络会在每个解码步骤都会输出单个值,而不是概率;具体的Actor-Critic网络策略梯度算法如下所示,经过多个时间步之后,生成一个自然语言序列作为模型预测的代码注释序列,如图3所示。
Actor-Critic网络策略梯度算法属于现有技术,如下:
function QAC:
Figure GDA0003734529240000131
Figure GDA0003734529240000141
进一步的,所述步骤(4-1)中代码图中对应节点隐藏状态即表示向量计算过程如下:
(4-11)初始化图顶点的隐藏向量表示,选择使用随机初始化Embedding层的的方法进行初始化,使用函数S表示,即:
Figure GDA0003734529240000142
(4-12)对于T轮更新的每一轮t来说:
a)每个顶点v∈V可以得到接受向量
Figure GDA0003734529240000143
这个向量是通过将邻接的节点的“消息”相加得到的,消息向量又是通过一个生产函数Mt得到:
Figure GDA0003734529240000144
b)每个节点v∈V会根据消息通过一个函数Ut更新它的隐藏状态:
Figure GDA0003734529240000145
从而得到了图节点每个节点的表示向量。
进一步的,所述步骤(4-2)中,所述上下文向量ci是根据编码器编码节点的向量表达(z1,z2,...,zV)得到的,每个节点表达zi包含了第i个节点在整个图中关注部分的信息,上下文向量是通过这些节点表示的加权和得到的,每个节点表示的权值aij是通过步骤(4-11)和步骤(4-12)中的公式计算得到的:
Figure GDA0003734529240000151
Figure GDA0003734529240000152
其中,a表示用来计算第j个输入节点和第i个输出序列匹配的对齐模型,匹配的得分值是基于解码器上一时刻的隐藏状态si-1和编码器编码的第j个节点的表达向量计算得到的。
在解码器生成结果之后,Critic网络会对生成的结果评估其价值,价值是通过以下公式计算得到:
Figure GDA0003734529240000153
其中,π表示策略,st表示时间步t的状态。Critic网络会优化其损失函数,本发明采用平均均方误差损失函数,即:
Figure GDA0003734529240000154
其中,Vπ(st)表示目标价值,
Figure GDA0003734529240000155
表示预测价值。φ是Critic网络的参数。模型在训练过程中,是同时优化Actor网络和Critic网络。
L(Θ)=L(θ)+L(φ)
其中,L(θ)表示Actor网络的损失函数,θ表示Actor网络的参数。
基于深度强化学习的Graph2Seq模型中的注意力机制是使用一个前馈神经网络进行参数化训练得到,该网络与模型的其他部分共同训练,整个模型是联合训练,目标是对于给定的图,最大化其正确的自然语言描述的条件对数概率,且在推理阶段,使用集束搜索的算法生成代码的描述,其中设置的集束大小(beam size)为5。
进一步的,所述步骤(5)中的模型训练的具体步骤为:
(5-1)通过步骤(4)搭建好Java代码注释模型的解码器和编码器之后,将二者进行结合,采用端到端的训练方法进行训练;
(5-2)对需要设置的模型的参数,包括了选择优化器、学习率大小、图神经网络的层数、编码器的向量空间维度、嵌入层的维度以及解码器LSTM的输出维度,多个参数进行交叉验证,采用机器翻译质量评测算法BLEU-4作为性能指标,选择表现性能最好的训练参数下的模型。
本发明提供了一种有效的自动生成未知Java代码的自然语言注释,可以有效帮助程序员完成维护代码工作,具有很大的应用价值。本发明理论上来说,可以通过更换训练数据集的方法推广到其他语言的自动代码生成。经过数据获取,数据预处理,模型搭建和模型训练之后,获取到性能表现优良的模型,用于辅助开发人员更好的理解工作中的代码。
本发明的创新点在于,代码是一种强结构化的语言,而自然语言是一种弱结构化的语言,为了解决传统方法中将代码当作文本来直接转换为自然语言而没有利用到代码的结构化语义信息的弊端,本发明提出将代码首先转化为代码图的形式,利用图结构来表达出代码的结构化信息,再使用图神经网络对程序图进行编码得到代码的结构化语义信息,通过基于强化学习的解码器得到其对应的自然语言注释内容。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (9)

1.一种基于深度强化学习的Graph2Seq自动生成Java代码注释的方法,其特征在于:包括以下步骤:
(1)数据获取,获取大量Java代码数据;
(2)数据预处理,从上述大量Java代码数据中筛选高质量的Java代码片段,并通过该代码片段生成以代码-注释对作为模型的训练数据集;
(3)代码转化为代码图,将训练数据集中的代码片段通过抽象语法树AST转化成代码图结构Graph;
(4)模型搭建,构建基于门控机制的图神经网络的图编码器和基于深度强化学习框架的解码器,即基于深度强化学习的Graph2Seq模型图编码器-深度强化学习解码器,并将步骤(3)中的代码图结构输入该基于深度强化学习的Graph2Seq模型,输出Java代码的自然语言注释;
(5)模型训练:通过交叉验证的方法训练得到性能表现最好的模型;
所述步骤(4)中构建基于深度强化学习的Graph2Seq模型的具体步骤如下:
(4-1)搭建基于门控图神经网络的编码器:Graph2Seq的编码器是基于门控机制的图神经网络,它输入是代码图节点的嵌入向量,并使用图结构之间的边的作用,当遍历到图中某个节点的时候,图神经网络会将与此节点相连接的所有的边的信息汇总到一起,生产一个“消息向量”的综合,用来更新节点的向量,设置一个迭代次数的超参数T用来控制每个节点被遍历到的次数,通过T轮迭代,生成对应节点的隐藏状态;
(4-2)搭建基于深度强化学习的解码器:采用Actor-Critic强化学习算法,在编码器模块中,使用LSTM做解码,生成代码对应的自然语言序列,LSTM在预测i时刻对应的标识符yi的时候,通过输入所有的历史标识符y<i=y1,...,yi-1,以及通过注意力机制得到的上下文向量ci,可以计算得到当前时刻的隐藏状态si,然后,根据隐藏状态向量预测i时刻的单词,在此步骤前的网络模型包括解码器端可以看做是一个Actor网络,在生成第i个公式过程中,设计了Critic网络来估计时间步i生产行为的价值,该Critic网络会在每个解码步骤都会输出单个值,而不是概率;经过多个时间步之后,生成一个自然语言序列作为模型预测的代码注释序列。
2.根据权利要求1所述的基于深度强化学习的Graph2Seq自动生成Java代码注释的方法,其特征在于:所述步骤(2)中从大量Java代码数据中筛选高质量的Java代码片段,并通过该代码片段生成以代码-注释对作为模型的训练数据集的过程包括以下步骤:
(2-1)对Java代码数据使用Eclipse的JDT编译器将Java方法解析为AST并提取相应的Javadoc注释;
(2-2)对上述注释内容进行清洗和预处理,保留其中代码注释质量较高的代码片段,进而生成以代码-注释对作为模型的训练数据集。
3.根据权利要求2所述的基于深度强化学习的Graph2Seq自动生成Java代码注释的方法,其特征在于:所述步骤(2-2)中对注释内容进行清洗和预处理过程如下:
忽略没有javadoc的Java代码方法;
对于带注释的函数方法,使用其javadoc描述中的第一个句子作为注释;
过滤空注释和只有一个单词的注释。
4.根据权利要求2所述的基于深度强化学习的Graph2Seq自动生成Java代码注释的方法,其特征在于:所述步骤(2-1)中的Java代码数据为去除了setter,getter,构造函数以及测试函数的数据集。
5.根据权利要求1所述的基于深度强化学习的Graph2Seq自动生成Java代码注释的方法,其特征在于:所述步骤(3)中将训练数据集中的代码片段通过抽象语法树AST转化成代码图结构Graph的具体步骤为:
(3-1)代码图的主干是代码的抽象语法树AST,由语法节点和语法标识组成,在代码图结构Graph中,对语法节点标记为程序语法树中的非终端节点,语法标记是使用它们标识的字符串作为标记的,代码图结构Graph使用AST边来链接AST树中的节点,同时添加一个NEXT_TOKEN标识符的边来连接每个语法标记的后继;
(3-2)代码图还需要添加连接不同用途的附加边以及与变量对应的语法标记的更新,使用LastLexicalUse边连接相同变量的所有用法,同时,使用ReturnsTo的边连接函数声明中的返回标识ReturnTo;
(3-3)代码图将AST中的开放性单词使用字节对编码的方式拆分成子单词的形式,然后将其添加到代码图中,这些子单词和AST树进行连接,连接的边类型设置为SUB_WORD;
(3-4)对于所有类型的边,我们添加它们各自的后向边转置邻接矩阵,使边和边类型的数量加倍。
6.根据权利要求1所述的基于深度强化学习的Graph2Seq自动生成Java代码注释的方法,其特征在于:所述步骤(4-1)中代码图中对应节点隐藏状态即表示向量计算过程如下:
(4-11)初始化图顶点的隐藏向量表示,选择使用随机初始化Embedding层的的方法进行初始化,使用函数S表示,即:
Figure FDA0003734529230000031
(4-12)对于T轮更新的每一轮t来说:
a)每个顶点v∈V可以得到接受向量
Figure FDA0003734529230000041
这个向量是通过将邻接的节点的“消息”相加得到的,消息向量又是通过一个生产函数Mt得到:
Figure FDA0003734529230000042
b)每个节点v∈V会根据消息通过一个函数Ut更新它的隐藏状态:
Figure FDA0003734529230000043
从而得到了图节点每个节点的表示向量。
7.根据权利要求1所述的基于深度强化学习的Graph2Seq自动生成Java代码注释的方法,其特征在于:所述步骤(4-2)中,所述上下文向量ci是根据编码器编码节点的向量表达(z1,z2,...,zV)得到的,每个节点表达zi包含了第i个节点在整个图中关注部分的信息,上下文向量是通过这些节点表示的加权和得到的,每个节点表示的权值aij是通过以下公式计算得到的:
Figure FDA0003734529230000044
eij=a(si-1,hj)
Figure FDA0003734529230000045
其中,a表示用来计算第j个输入节点和第i个输出序列匹配的对齐模型,匹配的得分值是基于解码器上一时刻的隐藏状态si-1和编码器编码的第j个节点的表达向量计算得到的。
8.根据权利要求1所述的基于深度强化学习的Graph2Seq自动生成Java代码注释的方法,其特征在于:所述步骤(4-2)中,Critic网络中的价值是通过以下公式计算得到:
Figure FDA0003734529230000051
其中,π表示策略,st表示时间步t的状态,Critic网络会优化其损失函数,采用平均均方误差损失函数,即:
Figure FDA0003734529230000052
其中,Vπ(st)表示目标价值,
Figure FDA0003734529230000053
表示预测价值。φ是Critic网络的参数;模型在训练过程中,是同时优化Actor网络和Critic网络;
L(Θ)=L(θ)+L(φ)
其中,L(θ)表示Actor网络的损失函数,θ表示Actor网络的参数。
9.根据权利要求1所述的基于深度强化学习的Graph2Seq自动生成Java代码注释的方法,其特征在于:所述步骤(5)中的模型训练的具体步骤为:
(5-1)通过步骤(4)搭建好Java代码注释模型的解码器和编码器之后,将二者进行结合,采用端到端的训练方法进行训练;
(5-2)对需要设置的模型的参数,包括了选择优化器、学习率大小、图神经网络的层数、编码器的向量空间维度、嵌入层的维度以及解码器LSTM的输出维度,多个参数进行交叉验证,采用机器翻译质量评测算法BLEU-4作为性能指标,选择表现性能最好的训练参数下的模型。
CN201910277000.9A 2019-04-08 2019-04-08 一种基于深度强化学习的Graph2Seq自动生成Java代码注释的方法 Active CN110018820B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910277000.9A CN110018820B (zh) 2019-04-08 2019-04-08 一种基于深度强化学习的Graph2Seq自动生成Java代码注释的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910277000.9A CN110018820B (zh) 2019-04-08 2019-04-08 一种基于深度强化学习的Graph2Seq自动生成Java代码注释的方法

Publications (2)

Publication Number Publication Date
CN110018820A CN110018820A (zh) 2019-07-16
CN110018820B true CN110018820B (zh) 2022-08-23

Family

ID=67190745

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910277000.9A Active CN110018820B (zh) 2019-04-08 2019-04-08 一种基于深度强化学习的Graph2Seq自动生成Java代码注释的方法

Country Status (1)

Country Link
CN (1) CN110018820B (zh)

Families Citing this family (31)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110673840B (zh) * 2019-09-23 2022-10-11 山东师范大学 一种基于标签图嵌入技术的自动代码生成方法及系统
CN110795731B (zh) * 2019-10-09 2022-02-25 新华三信息安全技术有限公司 一种页面检测方法及装置
CN110750297B (zh) * 2019-10-11 2021-08-20 南京大学 一种基于程序分析和文本分析的Python代码参考信息生成方法
CN110737466B (zh) * 2019-10-16 2021-04-02 南京航空航天大学 基于静态程序分析的源代码编码序列表示方法
CN110780878A (zh) * 2019-10-25 2020-02-11 湖南大学 一种基于深度学习进行JavaScript类型推断的方法
WO2021090890A1 (ja) * 2019-11-08 2021-05-14 大日本印刷株式会社 ソフトウェア作成装置、ソフトウェア作成方法、およびプログラム
CN110928550B (zh) * 2019-11-19 2023-11-24 上海工程技术大学 基于关键词Trie树消除GCC抽象语法树冗余的方法
CN110908709B (zh) * 2019-11-25 2023-05-02 中山大学 一种基于代码更改关键类判定的代码提交注释预测方法
CN110888644B (zh) * 2019-12-06 2023-03-31 成都安恒信息技术有限公司 一种自定义混淆方案的JavaScript代码混淆方法
CN112987713A (zh) * 2019-12-17 2021-06-18 杭州海康威视数字技术股份有限公司 自动驾驶设备的控制方法、装置及存储介质
CN111142857B (zh) * 2019-12-17 2023-04-25 华东师范大学 基于离线监督学习的函数式程序自动合成方法
CN111274134B (zh) * 2020-01-17 2023-07-11 扬州大学 基于图神经网络的漏洞识别与预测方法、系统、计算机设备和存储介质
CN111290785B (zh) * 2020-03-06 2023-06-06 北京百度网讯科技有限公司 评估深度学习框架系统兼容性的方法、装置、电子设备以及存储介质
CN111488582B (zh) * 2020-04-01 2023-09-29 杭州云象网络技术有限公司 一种基于图神经网络的智能合约重入性漏洞检测的方法
CN111507070B (zh) * 2020-04-15 2023-08-01 思必驰科技股份有限公司 自然语言生成方法和装置
CN111625276B (zh) * 2020-05-09 2023-04-21 山东师范大学 基于语义与语法信息融合的代码摘要生成方法及系统
CN112114791B (zh) * 2020-09-08 2022-03-25 南京航空航天大学 一种基于元学习的代码自适应生成方法
CN112162775A (zh) * 2020-10-21 2021-01-01 南通大学 一种基于Transformer和混合代码表示的Java代码注释自动生成方法
CN112381280B (zh) * 2020-11-06 2023-01-24 北京航空航天大学 一种基于人工智能的算法预测方法
CN112394974B (zh) * 2020-11-23 2024-05-07 平安科技(深圳)有限公司 代码变更的注释生成方法、装置、电子设备及存储介质
CN112580372A (zh) * 2020-12-26 2021-03-30 内蒙古工业大学 一种基于Actor-Critic的蒙汉神经机器翻译方法
CN112433754B (zh) * 2021-01-13 2022-05-31 南京大学 一种基于程序分析的Java函数注释自动生成方法
CN113157255B (zh) * 2021-03-22 2022-07-05 成都淞幸科技有限责任公司 一种面向语法树解码器的代码生成方法
CN113342318B (zh) * 2021-04-19 2022-06-10 山东师范大学 基于多视图代码特征的细粒度代码自动生成方法及系统
CN113076133B (zh) * 2021-04-25 2023-09-26 南京大学 基于深度学习的Java程序内部注释的生成方法及系统
CN113190219A (zh) * 2021-05-08 2021-07-30 南通大学 一种基于递归神经网络模型的代码注释生成方法
CN113377422B (zh) * 2021-06-09 2024-04-05 大连海事大学 一种基于深度学习识别自我承认技术债务方法
CN113297385B (zh) * 2021-07-28 2021-09-28 西南石油大学 基于改进GraphRNN的多标签文本分类系统及分类方法
CN113741886B (zh) * 2021-08-02 2023-09-26 扬州大学 一种基于图的语句级程序修复方法及系统
CN113849162B (zh) * 2021-09-28 2024-04-02 哈尔滨工业大学 一种利用模型驱动和深度神经网络相结合的代码生成方法
CN116841609B (zh) * 2023-08-28 2023-11-24 中国兵器装备集团兵器装备研究所 代码注释信息的补全方法、系统、电子设备和存储介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108491459A (zh) * 2018-03-05 2018-09-04 中国人民解放军国防科技大学 一种软件代码摘要自动生成模型的优化方法
CN108519890A (zh) * 2018-04-08 2018-09-11 武汉大学 一种基于自注意力机制的鲁棒性代码摘要生成方法
CN109271629A (zh) * 2018-09-07 2019-01-25 中山大学 基于强化学习的生成式文本摘要方法
CN109299237A (zh) * 2018-09-26 2019-02-01 苏州大学 基于行动者评论家强化学习算法的循环网络人机对话方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108491459A (zh) * 2018-03-05 2018-09-04 中国人民解放军国防科技大学 一种软件代码摘要自动生成模型的优化方法
CN108519890A (zh) * 2018-04-08 2018-09-11 武汉大学 一种基于自注意力机制的鲁棒性代码摘要生成方法
CN109271629A (zh) * 2018-09-07 2019-01-25 中山大学 基于强化学习的生成式文本摘要方法
CN109299237A (zh) * 2018-09-26 2019-02-01 苏州大学 基于行动者评论家强化学习算法的循环网络人机对话方法

Non-Patent Citations (6)

* Cited by examiner, † Cited by third party
Title
Deep code comment generation;Xing Hu等;《ICPC "18: Proceedings of the 26th Conference on Program Comprehension》;20180530;第2-5节,图2、3 *
Graph2Seq: Graph to Sequence Learning withAttention-based Neural Networks 阅读笔记;孙健东;《https://zhuanlan.zhihu.com/p/37278426》;20180528;第1-7页 *
Graph2Seq: Graph to Sequence Learning withAttention-based Neural Networks;Kun Xu等;《https://arxiv.org/abs/1804.00823》;20180404;全文 *
Improving Automatic Source Code Summarization via Deep Reinforcement Learning;Yao Wan等;《ASE 2018: Proceedings of the 33rd ACM/IEEE International Conference on Automated Software Engineering》;20180930;全文 *
Learning to represent programs with graphs;Miltiadis Allamanis等;《https://arxiv.53yu.abs/1711.00740v3》;20180404;第4节 *
Neural Message Passing for Quantum Chemistry;Justin Gilmer等;《https://arxiv.53yu.abs/1704.01212》;20170712;全文 *

Also Published As

Publication number Publication date
CN110018820A (zh) 2019-07-16

Similar Documents

Publication Publication Date Title
CN110018820B (zh) 一种基于深度强化学习的Graph2Seq自动生成Java代码注释的方法
CN111639344B (zh) 一种基于神经网络的漏洞检测方法及装置
CN113342318B (zh) 基于多视图代码特征的细粒度代码自动生成方法及系统
CN108388425A (zh) 一种基于lstm自动补全代码的方法
JP2019215841A (ja) 質問生成装置、質問生成方法及びプログラム
CN111090461A (zh) 一种基于机器翻译模型的代码注释生成方法
CN113064586B (zh) 一种基于抽象语法树增广图模型的代码补全方法
CN111930906A (zh) 基于语义块的知识图谱问答方法及装置
CN110673840A (zh) 一种基于标签图嵌入技术的自动代码生成方法及系统
CN112764738A (zh) 基于多视图程序特征的代码自动生成方法及系统
CN110807335A (zh) 基于机器学习的翻译方法、装置、设备及存储介质
Gómez-Abajo et al. Wodel: a domain-specific language for model mutation
US20220012021A1 (en) Artificial intelligence-based intelligent programming assistance
CN113641819A (zh) 基于多任务稀疏共享学习的论辩挖掘系统及方法
CN113190219A (zh) 一种基于递归神经网络模型的代码注释生成方法
CN114528398A (zh) 一种基于交互双重图卷积网络的情感预测方法及系统
CN113342343B (zh) 基于多跳推理机制的代码摘要生成方法及系统
CN114816517A (zh) 一种层次语义感知的代码表示学习方法
Loaiza et al. Partial Survey on AI Technologies Applicable to Automated Source Code Generation
CN112162775A (zh) 一种基于Transformer和混合代码表示的Java代码注释自动生成方法
CN112148879B (zh) 一种自动给代码打数据结构标签的计算机可读存储介质
CN114816516A (zh) 基于多重源码表示和循环神经网络的代码注释生成方法
CN113986251A (zh) 基于卷积和循环神经网络的gui原型图转代码方法
CN113076089A (zh) 一种基于对象类型的api补全方法
US20240134640A1 (en) Source code summary method based on ai using structural information, apparatus and computer program for performing the method

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