CN111427775A - 一种基于Bert模型的方法层次缺陷定位方法 - Google Patents
一种基于Bert模型的方法层次缺陷定位方法 Download PDFInfo
- Publication number
- CN111427775A CN111427775A CN202010169037.2A CN202010169037A CN111427775A CN 111427775 A CN111427775 A CN 111427775A CN 202010169037 A CN202010169037 A CN 202010169037A CN 111427775 A CN111427775 A CN 111427775A
- Authority
- CN
- China
- Prior art keywords
- defect
- model
- code
- defects
- training
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging using diagnostics
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
Abstract
本发明公开了一种基于Bert模型的方法层次缺陷定位方法,该方法包括:构建并训练Bert模型;获取与待定位缺陷相关的历史已修复缺陷;基于Bert模型构建缺陷定位模型;训练缺陷定位模型;利用训练后的缺陷定位模型预测待定位缺陷对应的缺陷方法。本发明提出的方法采用历史数据和深度学习技术相结合训练缺陷定位模型,同时利用Bert模型分别训练缺陷报告编码器和源代码编码器,并利用其确定缺陷定位模型中源代码编码器的参数,增强了定位模型中源代码编码器的特征提取能力。此外,通过提炼相关的历史已修复缺陷,缩小了缺陷定位的搜索范围,提高了定位的准确度,很好地达到了在方法级别上定位软件缺陷的目的,进而提升软件缺陷修复的效率。
Description
技术领域
本发明属于软件维护领域,特别涉及一种基于Bert模型的方法层次缺陷定位方法。
背景技术
软件质量对于软件项目的成功至关重要。尽管已经有了许多软件质量保证活动(例如测试、检查、静态检查等)来提高软件质量,但实际上,软件系统通常都会附带缺陷(错误)。对于大型且不断发展的软件系统,项目团队可能会在很长一段时间内收到大量缺陷报告。例如,2009年Eclipse项目报告了大约4414个错误。
在收到并确认缺陷报告后,项目团队应找到需要更改的源代码文件以修复该缺陷。但是,基于初始缺陷报告来手动定位需要更改的文件通常会非常耗时耗力,尤其是在源文件和报告的数量很大的时候。对于包含数百个甚至数千个源文件的大型项目,手动进行缺陷定位是一项艰巨而费时的工作。因此,缺陷修复时间通常会延长,维护成本会增加,并且客户满意度会受到影响。
开发过程中,缺陷的产生是无法避免的。在传统的开发过程中,当软件测试人员或软件使用者发现缺陷后,会在缺陷跟踪管理系统中编写缺陷报告告知软件开发、维护人员。缺陷报告记录了程序缺陷的报告时间、严重程度、异常的程序表现以及如何重现软件缺陷的细节。软件开发人员和维护人员需要根据提交的缺陷报告人工确定缺陷位置,以修复该缺陷。在实际缺陷修复过程中,修复者往往会在缺陷定位这一环节中花费大量时间。因此如何自动定位缺陷位置,以应对不断增长的缺陷数量和代码规模,从而提高软件修复效率与质量,成为了研究人员关注的热点之一。
近年来,一些研究人员利用信息检索技术,根据缺陷报告自动搜索相关源文件。基于信息检索的缺陷定位方法,将初始缺陷报告视为查询,并根据与此查询的相关性来对源代码文件进行排名,将排名靠前的源文件返回给开发人员。然后,开发人员可以检查返回的源文件并修复缺陷。与基于频谱的故障定位技术不同,基于信息检索(IR)的缺陷定位不需要程序执行信息(例如通过了和失败了的程序执行跟踪),而是根据初始缺陷报告查找与缺陷相关的源文件。但目前这类研究都将缺陷报告和源代码文件的文本看作是“词包”,虽然同一个词在缺陷报告和代码中语义往往是相似的,但只关注两者的之间单词相似程度,会丢失整个文本的上下文信息,因而丢失了一部分语义信息,对缺陷定位的效果产生了负面的影响。另一方面,现有技术通常缺陷报告与源代码文件采用统一的表示模型,测量相同词汇特征空间中的相似性来关联缺陷报告和源代码。但缺陷报告和源代码文件存在词汇不匹配问题(lexical mismatch):即缺陷报告中用于描述缺陷的术语与源文件中使用的术语和代码tokens不同。因此词汇不匹配问题会降低定位的准确率。
发明内容
本发明的目的在于提供一种能帮助缺陷修复人员快速找到缺陷产生位置,提高缺陷修复效率的缺陷定位方法。
实现本发明目的的技术解决方案为:一种基于Bert模型的方法层次缺陷定位方法,所述方法包括以下步骤:
步骤1,构建并训练Bert模型;
步骤2,获取与待定位缺陷相关的历史已修复缺陷;
步骤3,基于Bert模型构建缺陷定位模型;
步骤4,基于所述相关的历史已修复缺陷构建所述缺陷定位模型的训练样本;
步骤5,利用所述训练样本训练所述缺陷定位模型;
步骤6,利用训练后的缺陷定位模型预测待定位缺陷对应的缺陷方法。
进一步地,步骤1中所述训练Bert模型,具体包括:
步骤1-1,提取缺陷库中的缺陷报告和代码库中源代码的方法代码;
步骤1-2,分别对所述缺陷报告和方法代码进行文本预处理;
步骤1-3,利用文本预处理后的结果分别训练两个Bert模型,作为缺陷报告编码器和源代码编码器。
进一步地,步骤1-2中对所述缺陷报告和源代码的方法代码进行文本预处理,具体包括:
步骤1-2-1,对缺陷报告依次执行分词、去除标点符号、拆分驼峰命名法和下划线命名法的单词、转为小写处理,将缺陷报告转为单词序列;
步骤1-2-2,利用词法分析工具将方法代码转为token序列,并将该序列中使用驼峰命名法和下划线命名法的token拆分为单个单词;
步骤1-2-3,利用步骤1-2-1、步骤1-2-2中的序列分别构建缺陷报告语料库和源代码语料库;语料库中的每个单词都有一个对应的one-hot向量表示。
进一步地,步骤2所述获取与待定位缺陷相关的历史已修复缺陷,具体过程包括:
步骤2-1,从缺陷库中提取状态处于Fixed的历史缺陷的缺陷报告;
步骤2-2,利用上述步骤1-3获得的缺陷报告编码器对每一个已修复的历史缺陷的缺陷报告和待定位缺陷的缺陷报告进行编码;
步骤2-3,由每一个已修复的历史缺陷的缺陷报告编码和待定位缺陷的缺陷报告编码构成一组样本,由此获得若干组样本;
步骤2-4,将步骤2-3获得的样本作为多层全连接神经网络的输入,由此输出每一个已修复的历史缺陷的缺陷报告与待定位缺陷的缺陷报告的相关度;
步骤2-5,提取相关度值超过预设阈值h的已修复的历史缺陷的缺陷报告,并根据缺陷原因对其中所有的缺陷进行分类,之后提取出数量最多的那一类缺陷作为与待定位缺陷相关的历史已修复缺陷;其中h值自定义设置。
进一步地,步骤3所述缺陷定位模型包括一个编码层、一个双层全连接层和一个softmax层;其中编码层包括依次相连的输入层、嵌入层、transformer网络层、输出层。
进一步地,步骤3所述基于Bert模型构建缺陷定位模型,具体包括:
步骤3-1,构建一个源代码编码器,其结构与步骤1获得的源代码编码器相同,且参数也相同,其输入为方法代码与对应预设相关度值的拼接序列,输出为输入的向量表示;
步骤3-2,依次构建一个双层全连接层和一个softmax层,双层全连接层的输入为源代码编码器输出的向量表示序列,用于将输入映射到另一个维度空间的向量表示;softmax层将双层全连接层的输出映射为概率值,即softmax层的输出为0到1之间的值,表示方法的可疑度,即待定位缺陷与方法代码的相关度。
进一步地,步骤4中基于所述相关的历史已修复缺陷构建所述缺陷定位模型的训练样本,具体过程包括:提取所述相关的历史已修复缺陷对应的修改的和未修改的方法代码,生成若干组训练样本;每组训练样本包括2个数据:修改的或未修改的方法代码、方法代码与待定位缺陷的相关度。
进一步地,步骤4中基于所述相关的历史已修复缺陷构建所述缺陷定位模型的训练样本,具体过程包括:
步骤4-1,提取为修复步骤2获得的某一个历史已修复缺陷而更改的文件的前后版本;
步骤4-2,利用gumtree获取两个文件在AST层面发生的变更,并找出发生更改的结点的祖先结点中类型值为“MethodDeclaration”的结点;
步骤4-3,将缺陷修复前的文件中类型值为“MethodDeclaration”的结点转为代码,获得的代码即为修复步骤4-1所述的缺陷所需修改的方法代码;
步骤4-4,从缺陷修复前的文件中随机抽取若干个未需修改的方法代码;
步骤4-5,将步骤4-3和步骤4-4获得的方法代码均转为token序列;
步骤4-6,利用步骤4-5的token序列构建代码语料库,语料库中的每个token都有一个唯一对应的one-hot向量即独热向量表示;
步骤4-7,针对每个需修改的方法代码,将需修改的方法代码对应的token序列和标签1组合为一个正训练样本;针对每个未需修改的方法代码,将未需修改的方法代码对应的token序列和标签0组合为一个负训练样本。
进一步地,步骤5中利用所述训练样本训练所述缺陷定位模型,具体过程包括:
步骤5-1,将训练样本按比例分为训练集、验证集以及测试集;
步骤5-2,利用训练集对缺陷定位模型进行训练,具体包括:
结合步骤4-6构建的代码语料库,将训练集中方法代码对应的token序列转为one-hot 向量序列;
将训练集中每一个样本对应的one-hot向量序列依次输入缺陷定位模型;
计算缺陷定位模型的输出值与真实值即标签值的损失值loss;
根据损失值loss,利用梯度下降算法更新缺陷定位模型中的可变参数。
进一步地,步骤6所述利用训练后的缺陷定位模型预测待定位缺陷对应的缺陷方法,具体过程包括:
步骤6-1,将待定位缺陷的缺陷报告在项目代码库中对应的所有缺陷方法和随机初始化的相关度值依次成对输入训练后的缺陷定位模型,输出每一个缺陷方法与待定位缺陷的相关度值;
步骤6-2,对所有相关度值进行降序排列,将前n个相关度值对应的缺陷方法作为最终预测的缺陷方法,其中n值自定义设置。
本发明与现有技术相比,其显著优点为:1)传统技术中基于缺陷报告的缺陷定位往往只定位到文件级别,而本方法能够定位到方法级别,这大幅降低使用者在修复缺陷时需要浏览的代码行数;2)对缺陷报告和源代码分别进行编码,借助相关历史缺陷,避免了传统的基于信息检索技术的缺陷定位方法中存在的缺陷报告与源代码的词汇不匹配问题;3)通过对缺陷原因进行分类,精炼了与待定位缺陷相关的历史缺陷的范围,此步骤等同于对待定位缺陷进行了缺陷产生原因的推理,最终提高了缺陷定位的准确度;4)本编码器使用Bert模型进行编码,不仅避免了传统RNN的梯度消失与梯度爆炸问题,训练时间缩短,而且更适用于方法级别的源代码文本编码;5)以特征提取器 transformer为基础,构建Bert模型捕获整个文本的语义信息,相比于现有的词包模型,能够很好地理解缺陷报告和代码中的语义信息。
下面结合附图对本发明作进一步详细描述。
附图说明
图1为一个实施例中基于Bert模型的方法层次缺陷定位方法流程图。
图2为一个实施例中Bert模型的示意图。
图3为一个实施例中缺陷定位模型的示意图。
图4为一个实施例中构建缺陷定位模型训练样本的流程图。
图5为一个实施例中缺陷定位过程的流程图。
图6为一个实施例中利用训练后的缺陷定位模型预测待定位缺陷对应的缺陷方法的流程图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
在一个实施例中,结合图1,提供了一种基于Bert模型的方法层次缺陷定位方法,该方法包括以下步骤:
步骤1,构建并训练Bert模型;
步骤2,获取与待定位缺陷相关的历史已修复缺陷;
步骤3,基于Bert模型构建缺陷定位模型;
步骤4,基于相关的历史已修复缺陷构建缺陷定位模型的训练样本;
步骤5,利用训练样本训练缺陷定位模型;
步骤6,利用训练后的缺陷定位模型预测待定位缺陷对应的缺陷方法。
这里,方法是指面向对象编程中,类方法或者是实例方法的一种子程序。一个方法通常由一系列的语句所组成,并以之完成一个动作。其可以输入一组参数以制订所需的动作,且一部分的方法可能会有输出值(即返回值)。
进一步地,在其中一个实施例中,步骤1中训练Bert模型,具体包括:
步骤1-1,提取缺陷库中的缺陷报告和代码库中源代码的方法代码;
步骤1-2,分别对缺陷报告和方法代码进行文本预处理;
步骤1-3,利用文本预处理后的结果分别训练两个Bert模型,作为缺陷报告编码器和源代码编码器。
这里,Bert模型为由多个双层双向的transfomer特征抽取器构成的网络结构。Bert 模型的输入是预处理好的文本序列,输出是模型预测的每个词的向量表示构成的序列。
采用本实施例的方案,编码器使用transformer网络进行编码,避免了传统RNN的梯度消失与梯度爆炸问题,训练时间缩短,且能捕获代码或文本中间隔和延迟非常长的重要事件。此外,对缺陷报告和源代码分别构建表示模型(编码),避免了词汇不匹配问题。
进一步地,在其中一个实施例中,步骤1-2中对缺陷报告和源代码的方法代码进行文本预处理,具体包括:
步骤1-2-1,对缺陷报告依次执行分词、去除标点符号、拆分驼峰命名法和下划线命名法的单词、转为小写处理,将缺陷报告转为单词序列;
步骤1-2-2,利用词法分析工具将方法代码转为token序列,并将该序列中使用驼峰命名法和下划线命名法的token拆分为单个单词;
步骤1-2-3,利用步骤1-2-1、步骤1-2-2中的序列分别构建缺陷报告语料库和源代码语料库;语料库中的每个单词都有一个对应的one-hot向量表示。
采用本实施例的方案,利用针对编程语言的词法分析对代码进行分词,相比于传统的自然语言分词,具有更高的准确率,由此进一步提高缺陷定位的准确率。
进一步地,在其中一个实施例中,步骤2获取与待定位缺陷相关的历史已修复缺陷,具体过程包括:
步骤2-1,从缺陷库中提取状态处于Fixed的历史缺陷的缺陷报告;
步骤2-2,利用上述步骤1-3获得的缺陷报告编码器对每一个已修复的历史缺陷的缺陷报告和待定位缺陷的缺陷报告进行编码;
步骤2-3,由每一个已修复的历史缺陷的缺陷报告编码和待定位缺陷的缺陷报告编码构成一组样本,由此获得若干组样本;
步骤2-4,将步骤2-3获得的样本作为多层全连接神经网络的输入,由此输出每一个已修复的历史缺陷的缺陷报告与待定位缺陷的缺陷报告的相关度;
步骤2-5,提取相关度值超过预设阈值h的已修复的历史缺陷的缺陷报告,并根据缺陷原因对其中所有的缺陷进行分类,之后提取出数量最多的那一类缺陷作为与待定位缺陷相关的历史已修复缺陷;其中h值自定义设置。
采用本实施例的方案,对缺陷报告和源代码分别进行编码,借助相关历史缺陷,避免了传统的基于信息检索技术的缺陷定位方法中存在的缺陷报告与源代码的词汇不匹配问题。此外,抽取与待定位缺陷相关的历史已修复缺陷,并对抽取的缺陷进行分类,精炼了与待定位缺陷相关的历史缺陷的范围,此步骤等同于对待定位缺陷进行了缺陷产生原因的推理,最终提高了缺陷定位的准确度。
示例性地,步骤2-5中提取相关度值超过预设阈值h的已修复的历史缺陷的缺陷报告,并根据缺陷原因对其中所有的缺陷进行分类,具体包括:
获取每一个已修复的历史缺陷对应的源代码文件更改前后的版本;
将两个版本文件作为现有的基于修复树的缺陷原因自动分类模型的输入,从而实现对缺陷的自动分类。
示例性优选地,上述h=0.5。
进一步地,在其中一个实施例中,步骤3中缺陷定位模型包括一个编码层、一个双层全连接层和一个softmax层;其中编码层包括依次相连的输入层、嵌入层、transformer网络层、输出层。
进一步地,在其中一个实施例中,步骤3中基于Bert模型构建缺陷定位模型,具体包括:
步骤3-1,构建一个源代码编码器,其结构与步骤1获得的源代码编码器相同,且参数也相同,其输入为方法代码与对应预设相关度值的拼接序列,输出为输入的向量表示;
步骤3-2,依次构建一个双层全连接层和一个softmax层,双层全连接层的输入为源代码编码器输出的向量表示序列,用于将输入映射到另一个维度空间的向量表示,进而使模型能更好地线性划分数据特征;softmax层将双层全连接层的输出映射为概率值,即softmax层的输出为0到1之间的值,表示方法的可疑度,即待定位缺陷与方法代码的相关度。
采用本实施例的方案,利用双层全连接层和softmax层计算方法代码的可疑程度,相比于传统的余弦相似度,性能更优。此外,源代码编码器的训练独立于缺陷定位网络模型并作为定位模型的预训练步骤,提高了缺陷定位模型中源代码编码器的特征抽取能力。
进一步地,在其中一个实施例中,步骤4中基于相关的历史已修复缺陷构建缺陷定位模型的训练样本,具体过程包括:提取相关的历史已修复缺陷对应的修改的和未修改的方法代码,生成若干组训练样本;每组训练样本包括2个数据:修改的或未修改的方法代码、方法代码与待定位缺陷的相关度。
进一步地,在其中一个实施例中,步骤4中基于相关的历史已修复缺陷构建缺陷定位模型的训练样本,具体过程包括:
步骤4-1,提取为修复步骤2获得的某一个历史已修复缺陷而更改的文件的前后版本;
步骤4-2,利用gumtree获取两个文件在AST层面发生的变更,并找出发生更改的结点的祖先结点中类型值为“MethodDeclaration”的结点;
步骤4-3,将缺陷修复前的文件中类型值为“MethodDeclaration”的结点转为代码,获得的代码即为修复步骤4-1的缺陷所需修改的方法代码;
步骤4-4,从缺陷修复前的文件中随机抽取若干个未需修改的方法代码;
步骤4-5,将步骤4-3和步骤4-4获得的方法代码均转为token序列;
步骤4-6,利用步骤4-5的token序列构建代码语料库,语料库中的每个token都有一个唯一对应的one-hot向量即独热向量表示;
步骤4-7,针对每个需修改的方法代码,将需修改的方法代码对应的token序列和标签1组合为一个正训练样本;针对每个未需修改的方法代码,将未需修改的方法代码对应的token序列和标签0组合为一个负训练样本。
进一步地,在其中一个实施例中,步骤5中利用训练样本训练缺陷定位模型,具体过程包括:
步骤5-1,将训练样本按比例分为训练集、验证集以及测试集;
步骤5-2,利用训练集对缺陷定位模型进行训练,具体包括:
结合步骤4-6构建的代码语料库,将训练集中方法代码对应的token序列转为one-hot 向量序列;
将训练集中每一个样本对应的one-hot向量序列依次输入缺陷定位模型;
计算缺陷定位模型的输出值与真实值即标签值的损失值loss;
根据损失值loss,利用梯度下降算法更新缺陷定位模型中的可变参数。
进一步地,在其中一个实施例中,步骤6利用训练后的缺陷定位模型预测待定位缺陷对应的缺陷方法,具体过程包括:
步骤6-1,将待定位缺陷的缺陷报告在项目代码库中对应的所有缺陷方法和随机初始化的相关度值依次成对输入训练后的缺陷定位模型,输出每一个缺陷方法与待定位缺陷的相关度值;
步骤6-2,对所有相关度值进行降序排列,将前n个相关度值对应的缺陷方法作为最终预测的缺陷方法,其中n值自定义设置。
示例性优选地,上述n=10。
作为一种具体示例,本发明提出的一种基于Bert模型的方法层次缺陷定位方法,包括以下内容:
1、构建并训练如图2所示的Bert模型,用于将文本序列转换成语义向量表示。Bert模型为由多个双层双向的transfomer特征抽取器构成的网络结构。该步具体包括:
(1)提取缺陷库中的缺陷报告和代码库中源代码的方法代码;
(2)分别对缺陷报告和方法代码进行文本预处理:
对缺陷报告依次执行分词、去除标点符号、拆分驼峰命名法和下划线命名法的单词、转为小写处理,将缺陷报告转为单词序列;
利用词法分析工具将方法代码转为token序列,并将该序列中使用驼峰命名法和下划线命名法的token拆分为单个单词;
利用上述两个序列分别构建缺陷报告语料库和源代码语料库;语料库中的每个单词都有一个对应的one-hot向量表示。
(3)利用文本预处理后的结果分别训练两个Bert模型,作为缺陷报告编码器和源代码编码器。
文本预处理前的某一缺陷报告训练样本和源代码训练样本如下表1所示。
表1缺陷报告训练样本和源代码训练样本
2、获取与待定位缺陷相关的历史已修复缺陷,结合图3,具体过程包括:
步骤2-1,从缺陷库中提取状态处于Fixed的历史缺陷的缺陷报告;
步骤2-2,利用上述获得的缺陷报告编码器对每一个已修复的历史缺陷的缺陷报告和待定位缺陷的缺陷报告进行编码;
步骤2-3,由每一个已修复的历史缺陷的缺陷报告编码和待定位缺陷的缺陷报告编码构成一组样本,由此获得若干组样本;
步骤2-4,将步骤2-3获得的样本作为多层全连接神经网络的输入,由此输出每一个已修复的历史缺陷的缺陷报告与待定位缺陷的缺陷报告的相关度;
步骤2-5,提取相关度值超过预设阈值0.5的已修复的历史缺陷的缺陷报告,获取其中每一个已修复的历史缺陷对应的源代码文件更改前后的版本,将两个版本文件作为现有的基于修复树的缺陷原因自动分类模型的输入,对缺陷进行自动分类,之后提取出数量最多的那一类缺陷作为与待定位缺陷相关的历史已修复缺陷。
3、构建一个缺陷定位模型,如图4所示。缺陷定位模型包括一个源代码编码器、一个双层全连接层、一个softmax层。源代码编码器结构与上述过程1中的编码器结构一致,且将上述过程1中源代码编码器的参数提取出来作为缺陷定位模型中的源代码编码器参数的初始值,并将源代码编码器中所有参数的梯度置为0。双层全连接层和 softmax层的参数随机初始化。
4、提取上述过程2中相关的历史已经修复缺陷的修改的和未修改的方法代码,生成若干组训练样本,如图5所示,训练样本包括正样本和负样本。每组训练样本包含2 个数据:修改的或未修改的方法代码,方法代码与待定位缺陷的相关度值(相关为1,不相关为0)。生成样本的具体过程如下:
步骤4-1,提取为修复上述过程2获得的某一个历史已修复缺陷而更改的文件的前后版本;
步骤4-2,利用gumtree获取两个文件在AST层面发生的变更,并找出发生更改的结点的祖先结点中类型值为“MethodDeclaration”的结点;
步骤4-3,将缺陷修复前的文件中类型值为“MethodDeclaration”的结点转为代码,获得的代码即为修复步骤4-1的缺陷所需修改的方法代码;
步骤4-4,从缺陷修复前的文件中随机抽取若干个未需修改的方法代码;
步骤4-5,将步骤4-3和步骤4-4获得的方法代码均转为token序列;
步骤4-6,利用步骤4-5的token序列构建代码语料库,语料库中的每个token都有一个唯一对应的one-hot向量即独热向量表示;
步骤4-7,针对每个需修改的方法代码,将需修改的方法代码对应的token序列和标签1组合为一个正训练样本;针对每个未需修改的方法代码,将未需修改的方法代码对应的token序列和标签0组合为一个负训练样本。
6、利用上述获得的训练样本,训练缺陷定位模型,具体过程包括:
结合步骤4-6中构建的代码语料库,将训练集中方法代码对应的token序列转为one-hot向量序列;
将训练集中每一个样本对应的one-hot向量序列依次输入缺陷定位模型;
计算缺陷定位模型的输出值与真实值即标签值的损失值loss;
根据损失值loss,利用梯度下降算法更新缺陷定位模型中的可变参数。
7、结合图6,将待定位缺陷的缺陷报告在项目代码库中对应的所有缺陷方法和随机初始化的相关度值依次成对输入训练后的缺陷定位模型,输出每一个缺陷方法与待定位缺陷的相关度值,对所有相关度值进行降序排列,将前10个相关度值对应的方法代码作为最终预测的可疑方法代码,即获得10个包含缺陷的方法代码。
本发明提出的方法采用历史数据和深度学习技术相结合训练缺陷定位模型,并利用 Bert模型分别训练缺陷报告编码器和源代码编码器,通过将自然语言描述的缺陷报告和编程语言描述的源代码分别编码,可解决自然语言和编程语言的词汇不匹配问题,还利用其确定缺陷定位模型中源代码编码器的参数,这增强了定位模型中源代码编码器的特征提取能力。此外,利用已有的缺陷自动分类模型提炼相关的历史已修复缺陷,缩小了缺陷定位的搜索范围,提高了定位的准确度,很好地达到了在方法级别上定位软件缺陷的目的,进而提升软件缺陷修复的效率。
Claims (10)
1.一种基于Bert模型的方法层次缺陷定位方法,其特征在于,所述方法包括以下步骤:
步骤1,构建并训练Bert模型;
步骤2,获取与待定位缺陷相关的历史已修复缺陷;
步骤3,基于Bert模型构建缺陷定位模型;
步骤4,基于所述相关的历史已修复缺陷构建所述缺陷定位模型的训练样本;
步骤5,利用所述训练样本训练所述缺陷定位模型;
步骤6,利用训练后的缺陷定位模型预测待定位缺陷对应的缺陷方法。
2.根据权利要求1所述的基于Bert模型的方法层次缺陷定位方法,其特征在于,步骤1中所述训练Bert模型,具体包括:
步骤1-1,提取缺陷库中的缺陷报告和代码库中源代码的方法代码;
步骤1-2,分别对所述缺陷报告和方法代码进行文本预处理;
步骤1-3,利用文本预处理后的结果分别训练两个Bert模型,作为缺陷报告编码器和源代码编码器。
3.根据权利要求1或2所述的基于Bert模型的方法层次缺陷定位方法,其特征在于,步骤1-2中对所述缺陷报告和源代码的方法代码进行文本预处理,具体包括:
步骤1-2-1,对缺陷报告依次执行分词、去除标点符号、拆分驼峰命名法和下划线命名法的单词、转为小写处理,将缺陷报告转为单词序列;
步骤1-2-2,利用词法分析工具将方法代码转为token序列,并将该序列中使用驼峰命名法和下划线命名法的token拆分为单个单词;
步骤1-2-3,利用步骤1-2-1、步骤1-2-2中的序列分别构建缺陷报告语料库和源代码语料库;语料库中的每个单词都有一个对应的one-hot向量表示。
4.根据权利要求3所述的基于Bert模型的方法层次缺陷定位方法,其特征在于,步骤2所述获取与待定位缺陷相关的历史已修复缺陷,具体过程包括:
步骤2-1,从缺陷库中提取状态处于Fixed的历史缺陷的缺陷报告;
步骤2-2,利用上述步骤1-3获得的缺陷报告编码器对每一个已修复的历史缺陷的缺陷报告和待定位缺陷的缺陷报告进行编码;
步骤2-3,由每一个已修复的历史缺陷的缺陷报告编码和待定位缺陷的缺陷报告编码构成一组样本,由此获得若干组样本;
步骤2-4,将步骤2-3获得的样本作为多层全连接神经网络的输入,由此输出每一个已修复的历史缺陷的缺陷报告与待定位缺陷的缺陷报告的相关度;
步骤2-5,提取相关度值超过预设阈值h的已修复的历史缺陷的缺陷报告,并根据缺陷原因对其中所有的缺陷进行分类,之后提取出数量最多的那一类缺陷作为与待定位缺陷相关的历史已修复缺陷;其中h值自定义设置。
5.根据权利要求4所述的基于Bert模型的方法层次缺陷定位方法,其特征在于,步骤3所述缺陷定位模型包括一个编码层、一个双层全连接层和一个softmax层;其中编码层包括依次相连的输入层、嵌入层、transformer网络层、输出层。
6.根据权利要求5所述的基于Bert模型的方法层次缺陷定位方法,其特征在于,步骤3所述基于Bert模型构建缺陷定位模型,具体包括:
步骤3-1,构建一个源代码编码器,其结构与步骤1获得的源代码编码器相同,且参数也相同,其输入为方法代码与对应预设相关度值的拼接序列,输出为输入的向量表示;
步骤3-2,依次构建一个双层全连接层和一个softmax层,双层全连接层的输入为源代码编码器输出的向量表示序列,用于将输入映射到另一个维度空间的向量表示;softmax层将双层全连接层的输出映射为概率值,即softmax层的输出为0到1之间的值,表示方法的可疑度,即待定位缺陷与方法代码的相关度。
7.根据权利要求6所述的基于Bert模型的方法层次缺陷定位方法,其特征在于,步骤4中基于所述相关的历史已修复缺陷构建所述缺陷定位模型的训练样本,具体过程包括:提取所述相关的历史已修复缺陷对应的修改的和未修改的方法代码,生成若干组训练样本;每组训练样本包括2个数据:修改的或未修改的方法代码、方法代码与待定位缺陷的相关度。
8.根据权利要求7所述的基于Bert模型的方法层次缺陷定位方法,其特征在于,步骤4中基于所述相关的历史已修复缺陷构建所述缺陷定位模型的训练样本,具体过程包括:
步骤4-1,提取为修复步骤2获得的某一个历史已修复缺陷而更改的文件的前后版本;
步骤4-2,利用gumtree获取两个文件在AST层面发生的变更,并找出发生更改的结点的祖先结点中类型值为“MethodDeclaration”的结点;
步骤4-3,将缺陷修复前的文件中类型值为“MethodDeclaration”的结点转为代码,获得的代码即为修复步骤4-1所述的缺陷所需修改的方法代码;
步骤4-4,从缺陷修复前的文件中随机抽取若干个未需修改的方法代码;
步骤4-5,将步骤4-3和步骤4-4获得的方法代码均转为token序列;
步骤4-6,利用步骤4-5的token序列构建代码语料库,语料库中的每个token都有一个唯一对应的one-hot向量即独热向量表示;
步骤4-7,针对每个需修改的方法代码,将需修改的方法代码对应的token序列和标签1组合为一个正训练样本;针对每个未需修改的方法代码,将未需修改的方法代码对应的token序列和标签0组合为一个负训练样本。
9.根据权利要求8所述的基于Bert模型的方法层次缺陷定位方法,其特征在于,步骤5中利用所述训练样本训练所述缺陷定位模型,具体过程包括:
步骤5-1,将训练样本按比例分为训练集、验证集以及测试集;
步骤5-2,利用训练集对缺陷定位模型进行训练,具体包括:
结合步骤4-6构建的代码语料库,将训练集中方法代码对应的token序列转为one-hot向量序列;
将训练集中每一个样本对应的one-hot向量序列依次输入缺陷定位模型;
计算缺陷定位模型的输出值与真实值即标签值的损失值loss;
根据损失值loss,利用梯度下降算法更新缺陷定位模型中的可变参数。
10.根据权利要求9所述的基于Bert模型的方法层次缺陷定位方法,其特征在于,步骤6所述利用训练后的缺陷定位模型预测待定位缺陷对应的缺陷方法,具体过程包括:
步骤6-1,将待定位缺陷的缺陷报告在项目代码库中对应的所有缺陷方法和随机初始化的相关度值依次成对输入训练后的缺陷定位模型,输出每一个缺陷方法与待定位缺陷的相关度值;
步骤6-2,对所有相关度值进行降序排列,将前n个相关度值对应的缺陷方法作为最终预测的缺陷方法,其中n值自定义设置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010169037.2A CN111427775B (zh) | 2020-03-12 | 2020-03-12 | 一种基于Bert模型的方法层次缺陷定位方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010169037.2A CN111427775B (zh) | 2020-03-12 | 2020-03-12 | 一种基于Bert模型的方法层次缺陷定位方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111427775A true CN111427775A (zh) | 2020-07-17 |
CN111427775B CN111427775B (zh) | 2023-05-02 |
Family
ID=71546468
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010169037.2A Active CN111427775B (zh) | 2020-03-12 | 2020-03-12 | 一种基于Bert模型的方法层次缺陷定位方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111427775B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112380111A (zh) * | 2020-10-09 | 2021-02-19 | 华南理工大学 | 一种基于新项目的即时缺陷定位方法及系统 |
CN113327241A (zh) * | 2021-06-16 | 2021-08-31 | 南昌航空大学 | 一种轴承端面的表面缺陷视觉检测方法及系统 |
CN113656325A (zh) * | 2021-08-31 | 2021-11-16 | 中国农业银行股份有限公司 | 软件缺陷预测的方法、装置、电子设备和计算机存储介质 |
CN113722218A (zh) * | 2021-08-23 | 2021-11-30 | 南京审计大学 | 一种基于编译器中间表示的软件缺陷预测模型构建方法 |
CN114490163A (zh) * | 2022-03-28 | 2022-05-13 | 北京天维信通科技有限公司 | 一种故障自愈方法、装置及电子设备 |
CN114816497A (zh) * | 2022-04-18 | 2022-07-29 | 南京航空航天大学 | 基于bert预训练模型的链接生成方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105930277A (zh) * | 2016-07-11 | 2016-09-07 | 南京大学 | 一种基于缺陷报告分析的缺陷源代码定位方法 |
CN107844414A (zh) * | 2016-09-21 | 2018-03-27 | 南京大学 | 一种基于缺陷报告分析的跨项目、并行化缺陷定位方法 |
CN107967208A (zh) * | 2016-10-20 | 2018-04-27 | 南京大学 | 一种基于深度神经网络的Python资源敏感缺陷代码检测方法 |
US20190138731A1 (en) * | 2016-04-22 | 2019-05-09 | Lin Tan | Method for determining defects and vulnerabilities in software code |
CN110502361A (zh) * | 2019-08-29 | 2019-11-26 | 扬州大学 | 面向bug报告的细粒度缺陷定位方法 |
-
2020
- 2020-03-12 CN CN202010169037.2A patent/CN111427775B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20190138731A1 (en) * | 2016-04-22 | 2019-05-09 | Lin Tan | Method for determining defects and vulnerabilities in software code |
CN105930277A (zh) * | 2016-07-11 | 2016-09-07 | 南京大学 | 一种基于缺陷报告分析的缺陷源代码定位方法 |
CN107844414A (zh) * | 2016-09-21 | 2018-03-27 | 南京大学 | 一种基于缺陷报告分析的跨项目、并行化缺陷定位方法 |
CN107967208A (zh) * | 2016-10-20 | 2018-04-27 | 南京大学 | 一种基于深度神经网络的Python资源敏感缺陷代码检测方法 |
CN110502361A (zh) * | 2019-08-29 | 2019-11-26 | 扬州大学 | 面向bug报告的细粒度缺陷定位方法 |
Non-Patent Citations (2)
Title |
---|
刘艾侠;刘丹丹;: "基于代码结构信息和历史缺陷报告软件缺陷定位研究" * |
路鹏程: "基于深度学习的安全缺陷报告识别和缺陷定位" * |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112380111A (zh) * | 2020-10-09 | 2021-02-19 | 华南理工大学 | 一种基于新项目的即时缺陷定位方法及系统 |
CN113327241A (zh) * | 2021-06-16 | 2021-08-31 | 南昌航空大学 | 一种轴承端面的表面缺陷视觉检测方法及系统 |
CN113722218A (zh) * | 2021-08-23 | 2021-11-30 | 南京审计大学 | 一种基于编译器中间表示的软件缺陷预测模型构建方法 |
CN113656325A (zh) * | 2021-08-31 | 2021-11-16 | 中国农业银行股份有限公司 | 软件缺陷预测的方法、装置、电子设备和计算机存储介质 |
CN113656325B (zh) * | 2021-08-31 | 2023-12-08 | 中国农业银行股份有限公司 | 软件缺陷预测的方法、装置、电子设备和计算机存储介质 |
CN114490163A (zh) * | 2022-03-28 | 2022-05-13 | 北京天维信通科技有限公司 | 一种故障自愈方法、装置及电子设备 |
CN114490163B (zh) * | 2022-03-28 | 2022-08-05 | 北京天维信通科技有限公司 | 一种故障自愈方法、装置及电子设备 |
CN114816497A (zh) * | 2022-04-18 | 2022-07-29 | 南京航空航天大学 | 基于bert预训练模型的链接生成方法 |
CN114816497B (zh) * | 2022-04-18 | 2023-11-28 | 南京航空航天大学 | 基于bert预训练模型的链接生成方法 |
Also Published As
Publication number | Publication date |
---|---|
CN111427775B (zh) | 2023-05-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111427775B (zh) | 一种基于Bert模型的方法层次缺陷定位方法 | |
CN109697162B (zh) | 一种基于开源代码库的软件缺陷自动检测方法 | |
CN110502361B (zh) | 面向bug报告的细粒度缺陷定位方法 | |
CN111459799B (zh) | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 | |
CN111309607B (zh) | 一种代码方法级别的软件缺陷定位方法 | |
CN112597038B (zh) | 软件缺陷预测方法及系统 | |
CN112183094A (zh) | 一种基于多元文本特征的中文语法查错方法及系统 | |
CN113191148A (zh) | 一种基于半监督学习和聚类的轨道交通实体识别方法 | |
CN116821318B (zh) | 基于大语言模型的业务知识推荐方法、装置及存储介质 | |
CN113672931B (zh) | 一种基于预训练的软件漏洞自动检测方法及装置 | |
CN112818008A (zh) | 核电调试故障智能诊断的方法、系统、介质及电子设备 | |
CN112000802A (zh) | 基于相似度集成的软件缺陷定位方法 | |
CN113127339A (zh) | 一种Github开源平台数据的获取方法及源代码缺陷修复系统 | |
CN116108191A (zh) | 一种基于知识图谱的深度学习模型推荐方法 | |
CN114385491A (zh) | 一种基于深度学习的js转译器缺陷检测方法 | |
CN112559741B (zh) | 核电设备缺陷记录文本分类方法、系统、介质及电子设备 | |
CN111737993B (zh) | 一种配电网设备的故障缺陷文本提取设备健康状态方法 | |
CN113065356A (zh) | 一种基于语义分析算法的it设备运维故障建议处理方法 | |
CN117332858A (zh) | 基于知识图谱的汽车故障智能诊断系统的构建方法 | |
CN114707507B (zh) | 一种基于人工智能算法的清单信息检测方法及装置 | |
CN115617689A (zh) | 一种基于cnn模型和领域特征的软件缺陷定位方法 | |
CN115828888A (zh) | 一种针对多种网络日志进行语义解析及结构化的方法 | |
CN112835620B (zh) | 一种基于深度学习的语义相似代码在线检测方法 | |
CN114610882A (zh) | 一种基于电力短文本分类的异常设备编码检测方法和系统 | |
CN114943229B (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 |