CN109960506B - 一种基于结构感知的代码注释生成方法 - Google Patents

一种基于结构感知的代码注释生成方法 Download PDF

Info

Publication number
CN109960506B
CN109960506B CN201811467831.4A CN201811467831A CN109960506B CN 109960506 B CN109960506 B CN 109960506B CN 201811467831 A CN201811467831 A CN 201811467831A CN 109960506 B CN109960506 B CN 109960506B
Authority
CN
China
Prior art keywords
sequence
annotation
vector
abstract syntax
tree
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
CN201811467831.4A
Other languages
English (en)
Other versions
CN109960506A (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.)
Fudan University
Original Assignee
Fudan 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 Fudan University filed Critical Fudan University
Priority to CN201811467831.4A priority Critical patent/CN109960506B/zh
Publication of CN109960506A publication Critical patent/CN109960506A/zh
Application granted granted Critical
Publication of CN109960506B publication Critical patent/CN109960506B/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/40Transformation of program code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Machine Translation (AREA)
  • Compression, Expansion, Code Conversion, And Decoders (AREA)

Abstract

本发明属于计算机应用技术领域,具体为一种基于结构感知的代码注释生成方法。本发明利用抽象语法树得到代码片段的层次信息,以此来构建一个基于结构感知的代码注释生成器。本发明提出一个称为Code2Text的模型将源代码与其抽象语法树结合,应用在代码注释领域。Code2Text中的双重编码器分别对源代码序列输入与抽象语法结构输入进行编码,并通过双重注意力机制,利用源代码中的每一个单词和抽象语法树中的每一个结点来精确调整生成单词,以此来引导解码过程。本发明可以辅助程序员生成注释以减少手工撰写成本,也可为没有经验的程序员理解现有代码提供参考;并且可以用于数据使用的应用程序代码检测。

Description

一种基于结构感知的代码注释生成方法
技术领域
本发明属于计算机应用技术领域,具体涉及基于结构感知的代码注释生成方法。
背景技术
我们观察了最近几年发布的大量程序源码,发现为它们手工撰写详细的注释是一件乏味而且消耗时间的工作。但是,这些注释在软件开发中扮演了不可替代的角色。举个例子,它可以指导新手工程师快速理解每一块代码的用途,也可以帮助他们读懂一段用非主流编程语言编写的遗留代码。因此,我们需要一个有效的自动源代码注释方法,目标是能够为代码自动添加相应的高质量的自然语言,也就是注释。
由代码生成注释的方法还可以运用在对数据使用的应用程序代码的检测中。数据拥有者将数据提供给数据使用者访问使用,数据使用者会上传他们针对数据所编写的代码,同时也需要标注这段代码的功能。通过本发明的方法,可以自动为使用者上传的代码生成注释,然后将使用者标注的功能与自动生成的注释进行比对,确认使用者通过代码的对数据进行的实际操作与他所标注的功能是否相符,同时也可以避免用户上传一些对系统或者数据进行恶意破坏、修改,或是会对数据造成泄露的代码。
针对上述问题,本发明提出了一种基于结构感知的代码注释自动生成方法,相较于传统的基于模板和基于规则的生成固定模式的结构化注释,本发明提出的方法可无人工干预地自动为代码生成自然语言注释,并且能捕捉到源代码中的语义信息与层次信息。
发明内容
本发明的目的在于提供一种能够有效提高程序员编程效率的基于结构感知的代码注释生成方法。
本发明提出基于结构感知的代码注释生成方法,采用一个名为Code2Text的语法注释模型,将源代码与其抽象语法树(abstract syntax tree,AST)结合到注释生成中,其架构如图1所示,该模型具体分为如下三个部分:
(1)双重编码器,该模块包含了两个编码器,一个是针对源代码进行编码的序列编码器,另一个是针对抽象语法树进行编码的树编码器,分别将源代码和抽象语法树嵌入到不同的向量空间中;
(2)解码器。该模块根据双重编码器生成的源代码与抽象语法树在各自向量空间中的向量,预测与源代码相关的注释;
(3)双重注意力机制。该模块借鉴人脑的视觉注意力机制,帮助解码器在生成注释时,能够将生成的每一个词语与输入的源代码和抽象语法树中的部分词语和结点相关联,以此来选择更加合理且精确的词语。
代码注释生成方法的具体步骤如下:
已知一行源代码序列
Figure BDA0001890252210000021
以及对应注释的单词序列y=(y1,y2,…,ym)。其中,n是源代码中的单词个数,m是注释中的单词个数。
(1)生成抽象语法树
根据xs生成抽象语法树序列
Figure BDA0001890252210000022
以及抽象语法树父母结点序号列表p=(p1,p2,…,pq)。其中,q是抽象语法树序列中的单词个数。
(2)用序列编码器对源代码的数据进行编码
序列编码器采用长短期记忆网络LSTM(Long Short-Term Memory),目的是将源代码序列
Figure BDA0001890252210000023
嵌入到d维的向量空间中。设第j个LSTM单元有三个门:一个输入门
Figure BDA0001890252210000024
一个遗忘门
Figure BDA0001890252210000025
一个输出门
Figure BDA0001890252210000026
以及两个状态:一个隐层状态
Figure BDA0001890252210000027
和一个记忆单元
Figure BDA0001890252210000028
每个LSTM单元的更新法则如下:
Figure BDA0001890252210000029
Figure BDA00018902522100000210
Figure BDA00018902522100000211
Figure BDA00018902522100000212
Figure BDA00018902522100000213
Figure BDA00018902522100000214
其中,
Figure BDA00018902522100000215
表示记忆单元
Figure BDA00018902522100000216
用来更新的状态;函数embed()将一个词语嵌入到一个d维向量中,它可以采用预训练模型中的固定向量或者由模型本身训练出来;W(·),U(·)∈Rd×d是权重矩阵,b(·)∈Rd×1是一个偏差向量,σ是逻辑函数,运算符⊙表示两个向量的点积。我们使用一个d维的全零向量来初始化
Figure BDA0001890252210000031
后使用上述更新规则对源代码序列进行迭代,最终序列编码器在源代码的末尾处得到序列隐层状态
Figure BDA0001890252210000032
它综合了这条源代码的序列语义信息。
(3)用树形编码器对抽象语法树的数据进行编码
树形解码器采用一种特殊的长短记忆单元——树形长短记忆(Tree-LSTM)单元来对抽象语法树进行编码,将抽象语法树序列
Figure BDA0001890252210000033
嵌入到d维的向量空间中。我们规定Cj表示抽象语法树中第j个结点的子节点数。每个树形结点隐层状态
Figure BDA0001890252210000034
与记忆单元
Figure BDA0001890252210000035
的更新规则如下:
Figure BDA0001890252210000036
Figure BDA0001890252210000037
Figure BDA0001890252210000038
Figure BDA0001890252210000039
Figure BDA00018902522100000310
Figure BDA00018902522100000311
Figure BDA00018902522100000312
其中,在③式中,k∈Cj
Figure BDA00018902522100000313
是子隐层状态的求和;
Figure BDA00018902522100000314
表示记忆单元
Figure BDA00018902522100000315
用来更新的状态;
Figure BDA00018902522100000316
分别是是输入门、输出门和遗忘门;W(·),U(·)∈Rd×d是权重矩阵,b(·)∈Rd×1是一个偏差向量,σ是逻辑函数,运算符⊙表示两个向量的点积。我们使用一个d维的全零向量来初始化
Figure BDA00018902522100000317
使用上述更新规则对树形结构进行迭代,最终在语法树根节点处得到
Figure BDA00018902522100000318
它综合了这棵抽象语法树的结构信息。
(4)用解码器进行解码
经过步骤(2)、(3),我们得到两个嵌入后的向量:序列表示向量
Figure BDA0001890252210000041
和树结构表示向量
Figure BDA0001890252210000042
解码器同样使用长短记忆单元来预测注释的序列。我们定义dj为解码器的第j个隐层状态,已知作为输入的源代码序列的嵌入后向量embed(xs),抽象语法树序列的嵌入后向量embed(xt),以及之前生成的注释单词序列y<j,我们得到第j个单词的概率分布:
p(yj|y<j,embed(xs),embed(xt))=softmax(dj),
其中,softmax()函数根据第j个隐层状态dj来生成概率,dj由另一个非线性函数fd计算得到:
dj=fd(dj-1,embed(yj-1)),
我们使用
Figure BDA0001890252210000043
Figure BDA0001890252210000044
来初始化解码器的隐层状态d0
Figure BDA0001890252210000045
其中,
Figure BDA00018902522100000413
表示连接操作。
(5)利用双重注意力机制来改善训练
注意力机制将解码器的隐层状态与编码器的输出状态进行关联。我们首先计算源代码序列的注意力权重:已知在解码器j时刻的隐层状态dj和序列编码器的隐层状态
Figure BDA0001890252210000046
计算注意力权重
Figure BDA0001890252210000047
Figure BDA0001890252210000048
其中,score()函数将解码器的隐层状态dj与每一个序列编码器的隐层状态
Figure BDA0001890252210000049
进行比较,计算它们的相似度,再进行标准化操作生成注意力权重。接下来,根据注意力权重来计算第j个源代码序列的上下文向量
Figure BDA00018902522100000410
即原始隐层状态的加权平均:
Figure BDA00018902522100000411
类似地上述计算源代码序列的注意力权重的步骤用于计算抽象语法树的分层注意力权重:已知在解码器j时刻的隐层状态dj和树形编码器的隐层状态
Figure BDA00018902522100000412
计算注意力权重
Figure BDA0001890252210000051
Figure BDA0001890252210000052
接着计算第j个抽象语法树的上下文向量
Figure BDA0001890252210000053
然后将
Figure BDA0001890252210000054
Figure BDA0001890252210000055
连结在一起,得到综合的上下文向量wj
Figure BDA0001890252210000056
然后根据如下公式计算最终的注意力向量aj
Figure BDA0001890252210000057
其中Wd∈Rd×2d是权重矩阵,bd∈Rd×1是偏差向量;
最后根据如下公式计算每一个输出词的概率分布:
p(yj|y<1,embed(xs),embed(xt))=softmax(aj),
(6)迭代优化函数
本方法中的学习误差函数采用了语言模型评价指标:困惑度(Perplexity),公式如下:
Figure BDA0001890252210000058
其中S表示注释,n表示注释的长度,xi表示注释中的第i个词,p(xi|x1x2…xi-1)表示已知前i-1个词,接下来生成的第i个词是xi的概率。PP(S)越小,说明生成目标注释的概率越大。
我们使用迭代优化函数对参数做梯度下降操作。
(7)重复上述(2)~(6)步骤,直至达到预定义的训练步数或者优化函数的值不再下降,此时得到一个训练好的注释生成器;
(8)在测试步骤或预测步骤时,我们将注释生成器生成的所有注释单词连接在一起,得到代码对应的注释。
本发明使用深度学习方法,提供基于结构感知的代码注释生成模型。该模型能够从大量已有的代码与注释中自动学习注释的撰写,优点在于无人工干预地自动生成自然语言注释,无需设定特定的注释撰写规则,也无需设计特定规则的模板,可直接给程序员提供代码阅读的帮助。
本发明可用于代码注释的自动生成,为没有经验的程序员阅读代码提供指导,降低程序员的工作强度与难度。
本发明方法还可以运用在对数据使用的应用程序代码的检测中。数据拥有者将数据提供给数据使用者访问使用,数据使用者会上传他们针对数据所编写的代码,同时也需要标注这段代码的功能。本发明方法可以为使用者上传的代码自动生成注释,然后将使用者标注的功能与自动生成的注释进行比对,确认使用者通过代码的对数据进行的实际操作与他所标注的功能是否相符,同时也可以避免用户上传一些对系统或者数据进行恶意破坏、修改,或是会对数据造成泄露的代码。
附图说明
图1为本发明架构图示。
图2为由代码“for cache in caches.all():”生成的语法树。
图3为注意力矩阵的可视化效果图。
具体实施方式
下面将给出注释生成器的具体训练过程以及Python代码的注释生成的具体实施方式。
1、注释生成器的训练,具体步骤为:
(1)准备大量的代码以及其每一句代码对应的注释作为训练数据。此处以Python代码为例,例如训练数据集中的一句代码为“for cache in caches.all():”,对应的注释是“for every cache in return value of the function caches.all.”。接下来我们将主要关注这句代码在训练过程中对模型参数的调整。
(2)为每一句代码序列xs生成其对应的抽象语法树。对于Python的代码,可以使用自带的ast包完成该过程。此时,抽象语法树中的每一个结点所代表的单词组成抽象语法树序列xt;对语法树中的每一个结点进行标号,再记录下每一个结点的父节点的标号,记为p,其中根(root)节点的标号为0。由代码“for cache in caches.all():”生成的语法树如图2所示。
(3)将代码序列xs中的每一个单词嵌入(embed)到向量空间(设为256维),输入到序列编码器中。例如“for”对应的向量空间为[-0.0647,-0.0777,…,-0.0142,-0.0382]。序列编码器中的LSTM单元包含了输入门
Figure BDA0001890252210000061
遗忘门
Figure BDA0001890252210000062
输出门
Figure BDA0001890252210000063
隐层状态
Figure BDA0001890252210000064
记忆单元
Figure BDA0001890252210000065
根据发明内容中代码注释生成方法的具体步骤里第(2)步的更新法则,最终得到隐层状态
Figure BDA0001890252210000066
其中
Figure BDA0001890252210000067
作为源代码序列的综合信息。
(4)将抽象语法树序列xt中的每一个单词嵌入(embed)到向量空间之后,输入到树形LSTM(Tree-LSTM)编码器中。树形编码器中的LSTM单元与序列编码器类似,根据发明内容中代码注释生成方法的具体步骤里第(3)步骤的更新法则,最终得到隐层状态
Figure BDA0001890252210000071
其中
Figure BDA0001890252210000072
作为这句代码的树结构信息。
(5)将
Figure BDA00018902522100000715
Figure BDA0001890252210000074
连结后作为初始隐层状态d0输入到解码器中,开始注释的生成。例如,此处得到的d0=[-9.1565,11.8005,…,8.8580,2.2221]。
(6)在注释生成过程中,我们应用双重注意力模块。首先分别计算出序列和树形的注意力权重
Figure BDA0001890252210000075
Figure BDA0001890252210000076
然后再计算序列的与树形的上下文向量
Figure BDA0001890252210000077
Figure BDA0001890252210000078
连结成wj,将wj与隐层状态dj,以及之前预测的单词向量yj,根据代码注释生成方法的具体步骤里第(4)、(5)步里的公式,经过一系列计算后得到下一个单词的概率分布。简单选择概率最大的作为该步骤的单词,若该单词为<eos>则结束,输出之前的所有单词作为该步骤的句子输出,否则继续下一个单词的生成直至达到最大句子长度,这里设置为300。举个例子,在第(4)步中得到的隐层向量d0之后,先根据公式d1=fd(d0,embed(y0)),将起始词y0=<st>的嵌入后向量与d0输入到LSTM单元中,根据上述的LSTM的更新法则,计算得到隐层向量d1。接着对d1与(2)、(3)步中的隐层状态
Figure BDA0001890252210000079
进行计算,根据公式:
Figure BDA00018902522100000710
Figure BDA00018902522100000711
计算得到
Figure BDA00018902522100000712
Figure BDA00018902522100000713
再根据公式:
Figure BDA00018902522100000714
计算得到第1个上下文向量w1,然后再利用公式:
Figure BDA0001890252210000081
计算得到最终的注意力向量a1,接着可以利用公式:
p(y1|y<1,embed(xs),embed(xt))=softmax(a1)
来计算第一个位置输出的所有词的概率分布,根据一定的规则选择输出词y1。接着再根据d0与第一个位置的输出词y1计算d1,再结合
Figure BDA0001890252210000082
计算
Figure BDA0001890252210000083
Figure BDA0001890252210000084
然后依次计算得到w2、a2,最后就可以得到第二个输出词的概率分布,选择第二个输出词y2……依此类推,直到出现输出词为<eos>或者达到最大句子长度300时停止输出。
(7)在第(6)步中计算每一个位置的输出词的概率分布时,对照代码序列xs对应的注释“for every cache in return value of the function caches.all.”,假设在每一个输出位置下出现的就是这条注释中对应位置的那个词,记录这个词出现的概率,根据困惑度(Perplexity)公式
Figure BDA0001890252210000085
计算误差。例如第一个输出位置的概率分布为[0.012,0.947,0.041],实际际样本为[0,1,0],此时的误差值为
Figure BDA0001890252210000086
利用反向传播将误差从最后一个LSTM单元往回传,最终调整权重矩阵W(·)、U(·)、偏差向量b(·)、计算注意力向量时的权重矩阵Wd和偏差向量bd,以及所有输入词
Figure BDA0001890252210000087
和输出词yj的嵌入后向量
Figure BDA0001890252210000088
embed(yj)。此处选择了Adam优化算法来进行梯度下降。
(8)针对其他输入的代码和注释,重复步骤(2)到(6),直到误差函数不再下降或者达到预定的最大训练轮数。此处最大训练轮数设为20。最后将网络里的参数确定下来,就完成了注释生成器的训练。
2、利用注释生成器的进行注释生成
(1)如图3左部所示,输入的Python代码为“status_code=400”,源代码序列标为xs=["status_code","=","400"],对应的抽象语法树序列为xt=["root","Assign","expr*","expr","targets","expr","value","Num","Name","str","id","source_code","int","n","400"]。
(2)将上述序列中的每个词嵌入到256维的向量空间中,例如,“status_code”的向量为[0.0576,-0.0439,…,0.0694,-0.0519],其他源代码序列和抽象语法树序列中的单词按照类似方法转化。
(3)与注释生成器的训练过程中的(3)~(5)类似,将上述嵌入向量输入到双重编码器中,得到解码器的初始隐层状态d0(设为256维)。例如,上述源代码“status_code=400”对应的d0为[11.2955,-9.5370,…,-1.9248,3.7074]。
(4)在解码过程中,每计算出一个新的隐层向量,将其与序列编码器和树形编码器的隐层输出进行权重计算。例如,给定解码器初始输入<st>,生成第一个256维的隐层向量d1=[0.5895,0.2659,…,-3.3518,-5.1875],再根据(6)中的公式计算得到第一个位置的注意力向量a1=[-2.0321,-2.6163,…,0.3313,2.3193]。
(5)下一步,利用softmax(a1)来计算第一个位置输出的所有词的概率分布,再根据一定的规则选择输出词y1。例如,我们计算得到的第一个词的概率分布为[0.0325,0.1263,…,0.6178,0.0058],选择出现概率最高的(0.6178)位置所对应的单词(status_code),作为我们的第一个输出词y1。重复解码器的过程,将所有输出词序列(y1,y2,…,ym)作为这句代码的注释。最终生成的注释内容为:“status_code is an integer400.”。
(6)图3为注意力矩阵的可视化效果图。我们将代码生成的注释单词与源代码序列和抽象语法树节点之间的注意力权重以灰度值的形式描绘,颜色越浅,表明单词和源代码或树节点的关系最强。例如,注释中的“status_code”和“400”与源代码中的相应部分注意力关系最强,而注释中的“integer”则与抽象语法树中的“int”节点注意力关系最强。这个例子可以证明,我们的模型既可以学习源代码序列的基本语义信息,也可以学习代码抽象语法树隐含的层次信息,从而生成合理、准确的自然语言注释。
本发明方法能够自动生成注释,耗时短,生成的注释语言流畅自然,能够捕捉到代码中的语义与层次信息。这对于新手工程师,可提供一个参考;对于有经验的工程师,先提供一个基础版本的注释,工程师可以根据进一步的观察修改注释。这样可为工程师减少工作强度,缩短写注释的时间,方便他们进一步对其精细化;并且可以用于数据使用的应用程序代码检测。

Claims (1)

1.一种基于结构感知的代码注释生成方法,其特征在于采用Code2Text的语法注释模型,将源代码与其抽象语法树结合到注释生成中;该模型分为如下三个模块:
(1)双重编码器,该模块包含了两个编码器,一个是针对源代码进行编码的序列编码器,另一个是针对抽象语法树进行编码的树编码器,分别将源代码和抽象语法树嵌入到不同的向量空间中;
(2)解码器,该模块根据双重编码器生成的源代码与抽象语法树在各自向量空间中的向量,预测与源代码相关的注释;
(3)双重注意力机制,该模块借鉴人脑的视觉注意力机制,帮助解码器在生成注释时,能够将生成的每一个词语与输入的源代码和抽象语法树中的部分词语和结点相关联,以此来选择更加合理且精确的词语;
代码注释生成的具体步骤如下:
已知一行源代码序列
Figure FDA0004073050330000011
以及对应注释的单词序列y=(y1,y2,…,ym),其中,n是源代码中的单词个数,m是注释中的单词个数;
(1)生成抽象语法树
根据xs生成抽象语法树序列
Figure FDA0004073050330000012
以及抽象语法树父母结点序号列表p=(p1,p2,…,pq),q是抽象语法树序列中的单词个数;
(2)用序列编码器对源代码的数据进行编码
序列编码器采用长短期记忆网络LSTM,目的是将源代码序列:
Figure FDA0004073050330000013
嵌入到d维的向量空间中;
设第j个LSTM单元有三个门:一个输入门
Figure FDA0004073050330000014
一个遗忘门
Figure FDA0004073050330000015
一个输出门
Figure FDA0004073050330000016
以及两个状态:一个隐层状态
Figure FDA0004073050330000017
和一个记忆单元
Figure FDA0004073050330000018
每个LSTM单元的更新法则如下:
Figure FDA0004073050330000019
Figure FDA00040730503300000110
Figure FDA00040730503300000111
Figure FDA0004073050330000021
Figure FDA0004073050330000022
Figure FDA0004073050330000023
其中,
Figure FDA0004073050330000024
表示记忆单元
Figure FDA0004073050330000025
用来更新的状态;函数embed()将一个词语嵌入到一个d维向量中,它采用预训练模型中的固定向量或者由模型本身训练出来;W(·),U(·)∈Rd×d是权重矩阵,b(·)∈Rd×1是一个偏差向量,σ是逻辑函数,运算符⊙表示两个向量的点积;使用一个d维的全零向量来初始化
Figure FDA0004073050330000026
然后使用上述更新规则对源代码序列进行迭代,最终序列编码器在源代码的末尾处得到序列隐层状态
Figure FDA0004073050330000027
它综合了这条源代码的序列语义信息;
(3)用树形编码器对抽象语法树的数据进行编码
树形解码器采用一种特殊的长短记忆单元——树形长短记忆(Tree-LSTM)单元来对抽象语法树进行编码,将抽象语法树序列
Figure FDA0004073050330000028
嵌入到d维的向量空间中;规定Cj表示抽象语法树中第j个结点的子节点数;每个树形结点隐层状态
Figure FDA0004073050330000029
与记忆单元
Figure FDA00040730503300000210
的更新规则如下:
Figure FDA00040730503300000211
Figure FDA00040730503300000212
Figure FDA00040730503300000213
Figure FDA00040730503300000214
Figure FDA00040730503300000215
Figure FDA00040730503300000216
Figure FDA00040730503300000217
其中,在③式中,k∈Cj
Figure FDA0004073050330000031
是子隐层状态的求和;
Figure FDA0004073050330000032
表示记忆单元
Figure FDA0004073050330000033
用来更新的状态;
Figure FDA0004073050330000034
分别是是输入门、输出门和遗忘门;W(·),U(·)∈Rd×d是权重矩阵,b(·)∈Rd×1是一个偏差向量,σ是逻辑函数,运算符⊙表示两个向量的点积;使用一个d维的全零向量来初始化
Figure FDA0004073050330000035
使用上述更新规则对树形结构进行迭代,最终在语法树根节点处得到
Figure FDA0004073050330000036
它综合了这棵抽象语法树的结构信息;
(4)用解码器进行解码
经过步骤(2)、(3),得到两个嵌入后的向量:序列表示向量
Figure FDA0004073050330000037
和树结构表示向量
Figure FDA0004073050330000038
解码器同样使用长短记忆单元来预测注释的序列;定义dj为解码器的第j个隐层状态,已知作为输入的源代码序列的嵌入后向量embed(xs),抽象语法树序列的嵌入后向量embed(xt),以及之前生成的注释单词序列y<j,得到第j个单词的概率分布:
p(yj|y<j,embed(xs),embed(xt))=softmax(dj),
其中,softmax()函数根据第j个隐层状态dj来生成概率,dj由另一个非线性函数fd计算得到:
dj=fd(dj-1,embed(yj-1)),
使用
Figure FDA0004073050330000039
Figure FDA00040730503300000310
来初始化解码器的隐层状态d0
Figure FDA00040730503300000311
其中,
Figure FDA00040730503300000312
表示连接操作;
(5)利用双重注意力机制来改善训练
注意力机制将解码器的隐层状态与编码器的输出状态进行关联;首先计算源代码序列的注意力权重:已知在解码器j时刻的隐层状态dj和序列编码器的隐层状态
Figure FDA00040730503300000313
计算注意力权重
Figure FDA00040730503300000314
Figure FDA00040730503300000315
其中,score()函数将解码器的隐层状态dj与每一个序列编码器的隐层状态
Figure FDA0004073050330000041
进行比较,计算它们的相似度,再进行标准化操作生成注意力权重;接下来,根据注意力权重来计算第j个源代码序列的上下文向量
Figure FDA0004073050330000042
即原始隐层状态的加权平均:
Figure FDA0004073050330000043
类似地上述计算源代码序列的注意力权重的步骤用于计算抽象语法树的分层注意力权重:已知在解码器j时刻的隐层状态dj和树形编码器的隐层状态
Figure FDA0004073050330000044
计算注意力权重
Figure FDA0004073050330000045
Figure FDA0004073050330000046
接着计算第j个抽象语法树的上下文向量
Figure FDA0004073050330000047
然后将
Figure FDA0004073050330000048
Figure FDA0004073050330000049
连结在一起,得到综合的上下文向量wj
Figure FDA00040730503300000410
然后根据如下公式计算最终的注意力向量aj
Figure FDA00040730503300000411
其中,Wd∈Rd×2d是权重矩阵,bd∈Rd×1是偏差向量;
最后根据如下公式计算每一个输出词的概率分布:
p(yj|y<1,embed(xs),embed(xt))=softmax(aj);
(6)迭代优化函数
学习误差函数采用语言模型评价指标:困惑度,公式如下:
Figure FDA00040730503300000412
其,中S表示注释,n表示注释的长度,xi表示注释中的第i个词,p(xi|x1x2…xi-1)表示已知前i-1个词;接下来生成的第i个词是xi的概率;PP(S)越小,说明生成目标注释的概率越大;使用迭代优化函数对参数做梯度下降操作;
(7)重复上述(2)~(6)步骤,直至达到预定义的训练步数或者优化函数的值不再下降,此时得到一个训练好的注释生成器;
(8)在测试步骤或预测步骤时,将注释生成器生成的所有注释单词连接在一起,得到代码对应的注释。
CN201811467831.4A 2018-12-03 2018-12-03 一种基于结构感知的代码注释生成方法 Active CN109960506B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811467831.4A CN109960506B (zh) 2018-12-03 2018-12-03 一种基于结构感知的代码注释生成方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811467831.4A CN109960506B (zh) 2018-12-03 2018-12-03 一种基于结构感知的代码注释生成方法

Publications (2)

Publication Number Publication Date
CN109960506A CN109960506A (zh) 2019-07-02
CN109960506B true CN109960506B (zh) 2023-05-02

Family

ID=67023300

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811467831.4A Active CN109960506B (zh) 2018-12-03 2018-12-03 一种基于结构感知的代码注释生成方法

Country Status (1)

Country Link
CN (1) CN109960506B (zh)

Families Citing this family (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110399162B (zh) * 2019-07-09 2021-02-26 北京航空航天大学 一种源代码注释自动生成方法
CN111090461B (zh) * 2019-11-18 2023-04-28 中山大学 一种基于机器翻译模型的代码注释生成方法
CN110908709B (zh) * 2019-11-25 2023-05-02 中山大学 一种基于代码更改关键类判定的代码提交注释预测方法
CN111158691B (zh) * 2019-12-05 2023-10-13 杭州安恒信息技术股份有限公司 实现规则引擎动态化的方法
CN111290756B (zh) * 2020-02-10 2023-08-18 大连海事大学 一种基于对偶强化学习的代码-注释转换方法
US11262985B2 (en) 2020-03-10 2022-03-01 International Business Machines Corporation Pretraining utilizing software dependencies
CN113535136A (zh) * 2020-04-14 2021-10-22 北京沃东天骏信息技术有限公司 Python函数类型声明模型建立方法及装置、介质及设备
CN111522581B (zh) * 2020-04-22 2021-06-25 山东师范大学 一种增强型代码注释自动生成方法及系统
CN111857660B (zh) * 2020-07-06 2021-10-08 南京航空航天大学 一种基于查询语句的情境感知api推荐方法及终端
CN112162775A (zh) * 2020-10-21 2021-01-01 南通大学 一种基于Transformer和混合代码表示的Java代码注释自动生成方法
CN112394974B (zh) * 2020-11-23 2024-05-07 平安科技(深圳)有限公司 代码变更的注释生成方法、装置、电子设备及存储介质
CN112698831B (zh) * 2020-12-25 2022-08-09 昆明理工大学 一种代码自动生成质量评估方法
CN112783505B (zh) * 2021-01-28 2023-07-18 东北大学 一种用于源代码的函数智能重命名方法
CN113065322B (zh) * 2021-04-06 2022-02-08 中山大学 一种代码段注释生成方法、系统及可读存储介质
CN113128229B (zh) * 2021-04-14 2023-07-18 河海大学 一种中文实体关系联合抽取方法
CN113342343B (zh) * 2021-04-20 2022-05-27 山东师范大学 基于多跳推理机制的代码摘要生成方法及系统
CN113076133B (zh) * 2021-04-25 2023-09-26 南京大学 基于深度学习的Java程序内部注释的生成方法及系统
CN114185595B (zh) * 2021-11-02 2024-03-29 武汉大学 基于代码结构引导的方法名生成方法
CN116628707A (zh) * 2023-07-19 2023-08-22 山东省计算中心(国家超级计算济南中心) 一种可解释性的基于多任务的源代码漏洞检测的方法

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108519890A (zh) * 2018-04-08 2018-09-11 武汉大学 一种基于自注意力机制的鲁棒性代码摘要生成方法

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10070145B2 (en) * 2014-02-07 2018-09-04 Mediatek Singapore Pte. Ltd. Method of coding based on string matching for video compression
US20150363196A1 (en) * 2014-06-13 2015-12-17 The Charles Stark Draper Laboratory Inc. Systems And Methods For Software Corpora
CN108345457B (zh) * 2018-01-24 2021-03-09 上海交通大学 一种对程序源代码自动生成功能描述性注释的方法
CN108491208A (zh) * 2018-01-31 2018-09-04 中山大学 一种基于神经网络模型的代码注释分类方法

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108519890A (zh) * 2018-04-08 2018-09-11 武汉大学 一种基于自注意力机制的鲁棒性代码摘要生成方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
张峰逸 ; 彭鑫 ; 陈驰 ; 赵文耘 ; .基于深度学习的代码分析研究综述.计算机应用与软件.2018,(第06期),全文. *

Also Published As

Publication number Publication date
CN109960506A (zh) 2019-07-02

Similar Documents

Publication Publication Date Title
CN109960506B (zh) 一种基于结构感知的代码注释生成方法
CN109359293B (zh) 基于神经网络的蒙古文命名实体识别方法及其识别系统
CN107967262B (zh) 一种神经网络蒙汉机器翻译方法
CN109800298B (zh) 一种基于神经网络的中文分词模型的训练方法
CN110688394B (zh) 面向新型供电城轨列车大数据运维的nl生成sql方法
CN108519890A (zh) 一种基于自注意力机制的鲁棒性代码摘要生成方法
CN111291534A (zh) 面向中文长文本自动摘要的全局编码方法
CN110688861B (zh) 一种多特征融合的句子级译文质量估计方法
CN109522403A (zh) 一种基于融合编码的摘要文本生成方法
CN112000772B (zh) 面向智能问答基于语义特征立方体的句子对语义匹配方法
CN112347796B (zh) 一种基于蒸馏BERT与改进Transformer相结合的蒙汉神经机器翻译方法
CN111291175B (zh) 一种基于策略梯度算法的自动生成提交需求摘要的方法
KR102352251B1 (ko) 자질 선별을 통한 고성능 기계독해 방법
CN109062907A (zh) 融入依存关系的神经机器翻译方法
CN112613326B (zh) 一种融合句法结构的藏汉语言神经机器翻译方法
CN112446221B (zh) 翻译评估方法、装置、系统及计算机存储介质
CA3135717A1 (en) System and method for transferable natural language interface
CN112417901A (zh) 基于环顾解码和词汇注意力的非自回归蒙汉机器翻译方法
CN115906815B (zh) 一种用于修改一种或多种类型错误句子的纠错方法及装置
CN114925170B (zh) 文本校对模型训练方法及装置、计算设备
CN114648015A (zh) 一种基于依存关系注意力模型的方面级情感词识别方法
CN117094325B (zh) 水稻病虫害领域命名实体识别方法
CN111382333A (zh) 基于案件相关性联合学习与图卷积的新闻文本句中案件要素抽取方法
CN113239166B (zh) 一种基于语义知识增强的自动化人机互动方法
CN113515960A (zh) 一种融合句法信息的翻译质量自动评估方法

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