一种基于信息检索和神经网络的代码摘要自动生成方法

文档序号:32392285发布日期:2022-11-30 08:47阅读:75来源:国知局
一种基于信息检索和神经网络的代码摘要自动生成方法

1.本发明涉及计算机代码摘要技术领域,特别涉及一种基于信息检索和神经网络的代码摘要自动生成方法。


背景技术:

2.在软件工程领域,当工程师遇到规模较大或复杂的软件系统时,通常很难快速地检查源代码。根据调查显示,软件工程师花在理解源代码上的时间占整个开发时间的59%。为了解决这一问题,人们提出了代码摘要。通过自动生成代码摘要的方式来帮助软件工程师快速理解代码功能,他们就可以将宝贵的精力集中在程序开发上,以提高开发效率。
3.早在十年前,信息检索(ir)技术就被引入到代码摘要领域,即参考检索到的相似代码片段的注释,对某一特定代码片段生成摘要。例如,将源代码的每个函数视为一个文档,然后根据从源代码中检索到的术语派生出新的注释。这种基于ir技术的代码摘要的性能在很大程度上取决于代码数据库的规模和质量。
4.近年来,基于端到端神经机器翻译(nmt)的研究逐渐成为了代码自动摘要的主流方法,例如利用lstm和注意力机制,或利用端到端nmt框架自动生成代码摘要。考虑到将源代码作为纯文本处理可能会失去其结构和语法信息,设计了一种基于结构的遍历(sbt)来保留抽象语法树(ast)的序列唯一性,而不是纯代码序列。
5.基于ir方法擅长利用代码的信息或相应的注释,而基于nmt的方法通过构建语言模型生成摘要。尽管后者近年来已成为主流研究方法,但是它主要关注高频词,而在一定程度上忽略了低频词。并且,nmt模型在处理自然语言翻译中不常见的n-gram方面很弱,而增加数据集的大小并不能解决这个问题。
6.因此,如何提高代码摘要生成中的低频词命中率,准确地产生摘要,已成为本领域技术人员亟需解决的技术问题。


技术实现要素:

7.鉴于上述技术问题,本发明提供至少解决上述部分技术问题的一种基于信息检索和神经网络的代码摘要自动生成方法,通过该方法可以提高代码摘要生成中的低频词命中率,准确地产生摘要。
8.为实现上述目的,本发明采取的技术方案为:本发明提供一种基于信息检索和神经网络的代码摘要自动生成方法,该方法包括以下步骤:s1、构建包含源代码和对应的自然语言注释的训练集,使用codebert模型作为一个自编码器的方式进行训练;s2、将所述训练集中的所有代码段解析为抽象语法树ast,通过前序遍历将其转换为ast单词序列,并基于所述ast单词序列建立结构信息数据库;s3、利用训练好的codebert模型将源代码片段编码为单词级向量,进行池化操作
将单词级向量压缩为片段级向量,并基于所述片段级向量建立语义信息数据库;s4、给定一段待摘要代码,视其为一个查询,从所述结构信息数据库和所述语义信息数据库进行检索,获得对应的最相似结构代码和最相似语义代码;s5、将所述待摘要代码、以及检索出的最相似结构代码、最相似语义代码三个代码片段输入到训练后的codebert模型中,使用混合网络不断融合输出产生最终的摘要。
9.进一步地,所述步骤s1中,所述codebert模型为具有注意力机制的编码器-解码器模型,其中编码器部分与roberta-base相同,解码器具有6层transformer,每层transformer有12个多头注意力和一个768维的隐藏层向量。
10.进一步地,所述步骤s3中,所述利用训练好的codebert模型将源代码片段编码为单词级向量具体为:给定一个源代码片段c,通过codebert模型的编码器对其进行编码并生成一个单词级向量的向量列表,其中t代表源代码片段c中单词对应的词向量,r代表域,n是源代码片段c中的单词总数,k是向量维度。
11.进一步地,所述步骤s3中,所述进行池化操作将单词级向量压缩为片段级向量,计算公式为:其中,是片段级向量的第个分量,t代表源代码片段c中单词对应的词向量,n是源代码片段c中的单词总数,,是向量维度。
12.进一步地,所述步骤s4中,所述从结构信息数据库和语义信息数据库进行检索具体为:利用检索引擎lucene的bm25相似度从所述结构信息数据库中对ast单词序列进行检索;利用余弦相似度从所述语义信息数据库中对片段级向量的进行检索。
13.进一步地,所述余弦相似度的计算公式为:其中,为测试数据对应的向量表示,为训练集中数据的向量表示,,是训练集的大小;具有最高余弦分数的代码片段将作为查询结果返回。
14.进一步地,所述步骤s5中,所述混合网络为:其中,代表第二层线性层的权重矩阵,代表第一层线性层的权重矩阵,,和分别代表待摘要代码、以及检索出的最相似结构代码、最相似语义代码在每个时间步获得相应的隐藏状态,代表第一层线性层的偏置向量,代表第二层线性层的偏置向量。
15.与现有技术相比,本发明具有如下有益效果:本发明提供的一种基于信息检索和神经网络的代码摘要自动生成方法,利用源代码的结构和语义信息来生成合适的注释,并且设计了混合网络进行信息融合生成摘要,可以提高代码摘要生成中的低频词命中率,准确地产生摘要;其性能、预测效果均优于现有技术。
附图说明
16.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
17.附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制;在附图中:图1为本发明实施例提供的一种基于信息检索和神经网络的代码摘要自动生成方法的流程图。
18.图2为本发明实施例提供的一种基于信息检索和神经网络的代码摘要自动生成方法流程结构示意图。
19.图3为本发明实施例提供的混合网络工作示意图。
20.图4为本发明实施例提供的生成的python代码片段摘要示例图。
具体实施方式
21.为使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,下面结合具体实施方式,进一步阐述本发明。
22.在本技术的说明书和权利要求书及上述附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些操作可以不按照其在本文中出现的顺序来执行或并行执行。
23.下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
24.参照图1和图2所示,本发明实施例提供的一种基于信息检索和神经网络的代码摘要自动生成方法,该方法包括以下步骤:s1、构建包含源代码和对应的自然语言注释的训练集,使用codebert模型作为一个自编码器的方式进行训练;s2、将所述训练集中的所有代码段解析为抽象语法树ast,通过前序遍历将其转换为ast单词序列,并基于所述ast单词序列建立结构信息数据库;s3、利用训练好的codebert模型将源代码片段编码为单词级向量,进行池化操作将单词级向量压缩为片段级向量,并基于所述片段级向量建立语义信息数据库;s4、给定一段待摘要代码,视其为一个查询,从所述结构信息数据库和所述语义信
息数据库进行检索,获得对应的最相似结构代码和最相似语义代码;s5、将所述待摘要代码、以及检索出的最相似结构代码、最相似语义代码三个代码片段输入到训练后的codebert模型中,使用混合网络不断融合输出产生最终的摘要。
25.下面分别对上述各个步骤进行详细的说明:在上述步骤s1中,收集一个大型语料库,其中包含源代码和对应的自然语言注释,构成训练集,使用codebert模型作为一个自编码器的方式进行训练;在本实施例中,codebert模型为具有注意力机制的编码器-解码器模型,在提取代码的远程依赖关系时,采用了基于transformer的预训练codebert模型来提高摘要性能。其自注意机制可以更有效地捕获代码单词之间的远程依赖关系。codebert是一种用于自然语言和编程语言的双模态预训练模型,基于端到端的模型,在本实施例中,codebert模型由一个编码器和一个解码器组成,其中编码器部分与roberta-base完全相同,解码器具有6层transformer,每层transformer有12个多头注意力和一个768维的隐藏层向量。
26.在预训练时由一个混合目标函数进行优化,考虑到其同时处理自然语言和编程语言的优势,以及捕获远程依赖关系的能力,使用codebert对python和java数据集中的训练集进行微调。
27.在上述步骤s2中,将训练集中的所有代码段解析为抽象语法树ast,并通过前序遍历将其转换为ast单词序列(即结构信息数据);并建立结构信息数据库;由于ast赋予了源代码的关键结构信息,本方法可将输入的训练阶段代码解析为ast;由于数据库的规模较大,基于树结构的相似度计算的时间复杂度是不可接受的。因此,通过前序遍历将树结构转换为单词序列,并根据这种序列结构计算相似度。
28.在上述步骤s3中,重用训练好的codebert编码器将源代码片段编码为单词级向量,并进行池化操作压缩为片段级向量(即语义信息数据);为了便于检索和应用,本发明实施例中,定义一种用数值向量表示的程序语义,具体方式为选择seq2seq模型codebert编码器,将每个输入的每个词映射成数值向量,这种向量具有了代码语义的一些特征。通过挖掘一段程序代码中所有词对应的编码向量,虽然不能准确描述程序的执行结果,但可以比较两段程序的相似程度。具体来说,给定一个源代码片段c,通过codebert模型的编码器对其进行编码并生成一个单词级向量的向量列表 ,其中t代表源代码片段c中单词对应的词向量,r代表域,n是源代码片段c中的单词总数,k是向量维度。然后我们对向量列表进行全局最大池化操作,得到语义向量,如下所示:其中是向量的第个分量。
29.在上述步骤s4中,给定一段待摘要代码,视其为一个查询,从结构信息数据库和语义信息数据库进行检索;利用开源的搜索引擎lucene评估文档相似度的核心算法bm25(一种词袋检索模型),实现评估查询文档和候选文档之间的相关性。在构建的结构信息数据库中查找最相似的ast,然后返回匹配的代码。
30.对于测试代码片段和训练集中的任何代码片段,我们计算它们的余弦相似度:cos其中,为测试数据对应的向量表示,为训练集中数据的向量表示,n是训练集的大小。具有最高余弦分数的代码片段将作为查询结果返回。
31.在上述步骤s5中,将待摘要代码、以及检索后的最相似结构代码、最相似语义代码三个代码片段输入到训练后的codebert中;以在每个时间步获得相应的隐藏状态,和;进一步地,可以获得目标词汇表上的条件概率分布来预测下一个单词。
32.本实施例中,用,,和来表示这些概率分布。
33.为了将它们更好的融合在一起,采用如下的混合网络:其中,代表第二层线性层的权重矩阵,代表第一层线性层的权重矩阵,,和分别代表待摘要代码、以及检索出的最相似结构代码、最相似语义代码在每个时间步获得相应的隐藏状态,代表第一层线性层的偏置向量,代表第二层线性层的偏置向量。
34.上述的混合网络由两个多层感知器(mlp)组成,其输入具有三个隐藏状态,并学习一个三维向量作为其输出。最后,根据权重结合条件概率生成最终分布:进而输出产生最终的摘要。
35.下面在python和java语言的两个大型数据集上对本方法进行实验验证;具体操作如下:1、实验设置。
36.1)准备数据集。
37.实验中使用了python和java语言的两个大型数据集,它们包含的代码注释对均在10万量级。表1列出了两个数据集的详细统计数据,其中sumw表示所有评论中低频词的数量,numw表示单词标记词汇中低频词的数量,nums表示包含低频词的评论的数量。按照已有研究结果定义频率小于100的词称为低频词。括号内的百分比是对应项占整个数据集的比例。
38.表 1: 两个数据集的详细统计数据
2)确立基准线。
39.为了验证本方法的有效性,将与五种最先进的代码摘要方法进行比较。它们可以分为三类:a)基于ir的方法:隐语义索引(lsi)和向量空间模型(vsm)。
40.b)基于神经网络的方法:codenn和tl-codesum。
41.c)ir增强的神经方法:rencos。
42.3)确定评价指标。
43.选择两个典型的自动评价指标来生成摘要:bleu和bertscore。前者是机器翻译中最常用的自动评估指标,由于生成的摘要可能很短,且高阶n-gram的命中率可能为零,通过使用平滑的bleu评分来解决这个问题。而后者对词汇变化不敏感,可以识别句子中的语义或语法变化,这在一定程度上克服了n-gram方法的缺点。
44.4)实验过程。
45.实验是基于pytorch框架实现的,每个实验运行三次,并取平均结果。硬件设备选择为ubuntu 16.04服务器,该服务器使用nvidia rtx 2080ti gpu和11gb内存。
46.a)按照步骤s1对codebert开展训练。
47.codebert是基于端到端的模型,由一个编码器和一个解码器组成。编码器部分与roberta-base完全相同,解码器是一个6层transformer,每层transformer有12个多头注意力和一个768维的隐藏层向量。
48.词汇表之外的单词被替换为unk (unknow)。为了最大限度地利用gpu内存,设置批大小(batchsize)为16,最大迭代次数为150k,并使用adam提出的方法对所有参数进行优化,初始学习率为5e-5。束大小和词汇表长度分别设置为10和50265。对于编码器和解码器,相应地设置它们的最大长度为256和128。实验表明,在python和java数据集上训练codebert大约需要50小时和40小时。
49.b)按照步骤s2、s3完成结构信息数据、语义信息数据及数据库准备工作。
50.c)按照步骤s4在测试阶段,给定测试集中的一段待摘要代码,视其为一个查询,从数据库中搜索两个最相似的代码片段。其中一个是利用现有的检索引擎lucene的bm25相速度对ast单词序列进行检索,另一种是余弦相似度对片段级向量的进行检索。
51.d)按照步骤s5对混合网络进行训练。其中,按照公式(3)的计算权重矩阵w_mix和w_hid的维数分别为[12,2304]和[3,12]。每个解码器输入的隐藏状态大小为768。利用交叉熵损失函数和adam优化器在每个验证集上训练10个epoch。实验表明,在python和java数据集上训练这个混合网络大约需要15个小时和12个小时。
[0052]
5)实验结果评估。
[0053]
a)源代码汇总方法性能结果比对表2显示了实验结果。从中可以看到,本发明在两个评估指标上都取得了最好的性能,在两个数据集上,与最佳的基于神经网络的tl-codesum相比,在bleu-4指标上提高了48%/27%;在两个数据集上,与基于ir的最佳方法vsm相比,bleu的性能提高了21%/14%。
[0054]
另外,对于tl-codesum和codenn这两种基于神经网络的方法,可以看到前者的性能明显优于后者。这是因为codenn将源代码视为纯文本,并使用token序列学习代码模式,而tl-codesum通过使用学习的api序列从源代码获得更多信息。从这两个指标的实验中可以看到,基于ir的方法明显比基于神经网络的方法有更好的性能,原因在于纯神经网络方法无法处理低频词。
[0055]
rencos在两个数据集上的bleu-4评分分别为42.36/33.01和91.64/90.14,明显优于单纯基于ir和基于神经网络的方法。这主要归功于结构信息和语义信息的结合。而本发明方法引入了注意力编码器-解码器模型codebert以准确地理解源代码的语义,并进一步设计了一个混合网络,以更细粒度的水平调整检索到的相似代码片段的融合权重。实验结果表明,本方法的bleu值为43.04/34.09,bertscore值为91.88/90.94。与纯神经网络方法相比,虽然本方法需要更多的时间来建立可检索的代码库,但可以并行地执行该任务和codebert训练。此外,由于使用了lucene和混合网络,本方法平均只需要0.2秒就可以生成摘要。
[0056]
表 2: 各模型表现b)对低频词的预测结果比对低频词通常包含影响代码摘要准确性的关键语义信息,下面将验证本发明方法在低频词预测上的有效性。首先在测试集上生成摘要,并与标准摘要进行比较,然后统计所有正确生成的单词的频率,并记录有代表性的低频单词的命中次数。实验结果如表3和表4所示,表中的比值是本发明方法和codebert的商,表示对低频词的提升程度。从表中可以看出,本发明方法在两个数据集中都比codebert命中了更多的低频词,并且获得了比rencos更高的命中率。这表明本发明方法能够有效地生成低频词,并且优于rencos算法。而且单词出现的频率越低,本方法效果越好。这是因为codebert可以很容易地预测高频词,这在高频段降低了检索源代码所带来的优势。
[0057]
表 3: 预测正确的低频词数量 (python)表 4: 预测正确的低频词数量 (java)c)本方法的各个组件的有效性验证。
[0058]
在实验设置上,进行了五组实验:

结构感知检索,以结构级检索出的代码的摘要作为最终输出;

语义感知检索,同样将检索到的语义级代码的摘要作为最终输出;

纯codebert,不使用任何检索信息或融合机制;

codebert+检索+句级权重,利用结构感知和语义感知检索,以及以往研究报告的句子级融合机制;

codebert+双检索+混合网络(本发明方法),除了结构感知和语义感知检索外,还涉及到单词(token)级融合机制。实验结果如表5所示。
[0059]
表5: 消融实验d)样例分析。
[0060]
为了直观地说明本方法的有效性,如图4所示,其中显示了一个带有不同方法生成的摘要的python代码片段,其中正确的单词被标记为加粗。
[0061]
参见图4所示,可以看到,vsm成功地预测了“detect”这个低频词,lsi也输出了它的同义词“verify”。tl-codesum方法匹配高频单词“bytes”。这个例子有些复杂,因此要想进行适当的摘要,需要理解程序的结构和api中包含的语义信息。因此,rencos和本方法表
现更好,都涵盖了一些高频词和低频词。此外,标记“unicode”只有通过本发明方法才能正确预测。
[0062]
与现有技术相比,本发明实施例提供的一种基于信息检索和神经网络的代码摘要自动生成方法,通过利用源代码的结构和语义信息来生成合适的注释。具体来说,对于结构信息,将代码片段解析为ast进行相似性计算。对于语义信息,将源代码转换为上下文语义向量,以便进一步检索。然后根据结构和语义信息设计了一种混合网络,将三个译码器的输出信息融合在一起生成摘要,可以提高代码摘要生成中的低频词命中率,准确地产生摘要;其性能、预测效果均优于现有技术。
[0063]
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1