一种用于软件自承认型技术债务的检测方法
技术领域
本发明属于软件
技术领域
,具体涉及一种自承认型技术债务的检测方法。背景技术
技术债务是一种隐喻,它表达的是在软件开发过程中使用一种不完整、临时或者次优的解决方案。这一概念首次由Cunningham于1992年提出,他将“不完全正确的代码”视为债务的一种形式。后来,Potdar和Shihab对指向债务实例的源代码注释进行了研究,他们通过手动处理大量注释发现对于代码中可能存在的问题,开发人员往往倾向于在注释中表明。针对这一发现,Potdar和Shihab提出了自承认技术债务(Self- admitted TechnicalDebt),并总结了62种模式用于识别它。之后,研究者们开始关注 SATD的研究,探讨和改进各种方法和技术,为了更好地分析和管理自承认技术债务,识别成为当前研究的首要问题,也是目前的研究热点。
现有自承认技术债务识别的研究主要有四个方面:基于模式的方法、基于自然语言处理方法、文本挖掘方法及深度神经网络CNN的方法。其中,Ren et al.使用卷积神经网络进行了识别自承认技术债务的初步尝试,他们分析了SATD文本注释的五个特征,这些特征影响着基于模式的SATD检测和传统的基于文本挖掘的方法识别SATD 的性能、可概括性和适用性。为了提高SATD识别的准确性,尤其是跨项目识别准确性,并提高基于机器学习的识别结果的可解释性,他们的方法学习从评论数据中提取 SATD识别任务的信息文本功能。然而,使用卷积神经网络模型进行SATD识别时,过于关注于局部特征,丢失了部分全局特征。并且,单一模型通常仅利用分类模型对已知类别的训练数据进行学习,从而得到一个单一的分类器对未知数据进行分类。相比于多个模型来说,分类精度低,泛化能力弱。
发明内容
为了克服现有技术的不足,本发明提供了一种用于软件自承认型技术债务的检测方法,首先进行数据集的获取和处理;然后构建自承认型技术债务检测模型;包括三个并行的基分类器;分别为CNN、CNN-LSTM混合模型和DPCNN;将词向量矩阵分别输入三个基分类器,每个基分类器输出各自对注释数据属于自承认型技术债务的概率;将三个基分类器输出分类结果进行融合,得到最终的注释数据属于自承认型技术债务的概率;最后判断概率和分类阈值的大小关系,输出检测注释数据是否为自承认型技术债务的结果。本发明可以克服误判率较高的问题,相对于其他方法能够识别出更多数量的SATD,同时减少了单一模型的偏见性,从而解决了在识别SATD时存在的误判,准确率低的问题。
本发明解决其技术问题所采用的技术方案包括如下步骤:
步骤1:数据集的获取和处理;
采用公开的源代码注释数据集,将源代码注释数据集中的数据划分为多个项目数据集,然后分别进行符号化、移除停用词,然后进行文本表示转化为注释矩阵;
将注释矩阵输入神经网络的Embedding层,对Embedding层进行训练,输出词向量;再将词向量按照注释顺序拼接后得到词向量矩阵;
步骤2:构建自承认型技术债务检测模型;
所述自承认型技术债务检测模型包括三个并行的基分类器;
第一个基分类器为CNN;
第二个基分类器为CNN-LSTM混合模型;
第三个基分类器为DPCNN;
将词向量矩阵分别输入三个基分类器,对每个基分类器单独进行训练,训练完成后,每个基分类器输出各自对注释数据属于自承认型技术债务的概率;
将三个基分类器输出结果进行融合,得到最终的注释数据属于自承认型技术债务的概率;
设定分类阈值,若属于自承认型技术债务的概率大于分类阈值,则判定该注释数据为自承认型技术债务;若属于自承认型技术债务的概率小于等于分类阈值,则判定该注释数据为非自承认型技术债务;
步骤3:将待检测注释数据输入自承认型技术债务检测模型,输出结果为该待检测注释数据是否为自承认型技术债务的结果。
优选地,所述公开的源代码注释数据集为Maldonado和Shihab所整理的数据集。
优选地,所述对每个基分类器单独进行训练时,采用Adam算法,损失函数采用focal loss损失函数。
优选地,所述分类阈值为0.5。
本发明的有益效果如下:
1、本发明可以克服误判率较高的问题,相对于其他方法能够识别出更多数量的SATD。
2、本发明通过集成CNN、LSTM、DPCNN深度学习模型,可以使提取的特征更加全面,同时减少了单一模型的偏见性,从而解决了在识别SATD时存在的误判,准确率低的问题。
3、本发明应用于十个项目分别进行了项目内和跨项目的实验。结果表明该方法的有效性,尤其是项目内预测,该方法可以明显改善以往研究存在着识别准确率低,尤其对于数据不平衡条件下识别难度大的问题,识别效果有显著提升。
4、此外,在数据不平衡明显的数据集上,该方法提升效果更加明显,而在实际的项目中数据不平衡情况比较普遍,因此本发明相比其他方法更适合应用于实际。
附图说明
图1为本发明的自承认型技术债务检测模型框架图。
图2为本发明数据集的处理过程示意图。
图3为本发明方法与其他方法在10个项目上的F-Measure结果图示。
图4为本发明实施例可视化SATD重要特征示意图。
具体实施方式
下面结合附图和实施例对本发明进一步说明。
传统的卷积神经网络模型,在进行SATD识别时,过于关注于局部特征,丢失了部分全局特征。并且,单一模型通常仅利用分类模型对已知类别的训练数据进行学习,从而得到一个单一的分类器对未知数据进行分类。相比于多个模型来说,分类精度低,泛化能力弱。本发明采用集成学习通过将多个学习器进行结合,能够有效地提高模型的泛化能力,集成模型相比于单个模型能够有效提高识别准确度。集成深度神经网络的方法可以将深度学习的高性能和集成学习的泛化能力相结合。
本发明的检测模型框架如图1所示。集成分类器相对于单个分类器的优势在于它们能够纠正单个集成成员的错误以提高整体集成性能的能力。并且根据研究表明,与基本分类器相比,集成分类器通过降低选择错误学习模型的风险,被认为比单个分类器更可靠,并且能够提高预测准确性。本发明选用了三种性能较好的深度学习模型进行集成,包括CNN模型、CNN-LSTM模型、DPCNN模型。通过每个模型的训练并优化模型,输出层进行最终融合,融合后的结果作为最终的分类结果否为SATD。
一种用于软件自承认型技术债务的检测方法,包括如下步骤:
步骤1:数据集的获取和处理;
采用公开的源代码注释数据集,如Maldonado和Shihab数据集,将源代码注释数据集中的数据划分为多个项目数据集,然后分别进行符号化、移除停用词,然后进行文本表示转化为注释矩阵;
将注释矩阵输入神经网络的Embedding层,对Embedding层进行训练,输出词向量;再将词向量按照注释顺序拼接后得到词向量矩阵;
步骤2:构建自承认型技术债务检测模型;
所述自承认型技术债务检测模型包括三个并行的基分类器;
第一个基分类器为CNN;
第二个基分类器为CNN-LSTM混合模型;
第三个基分类器为DPCNN;
将词向量矩阵分别输入三个基分类器,对每个基分类器采用Adam算法单独进行训练,损失函数采用focal loss损失函数。训练完成后,每个基分类器输出各自对注释数据属于自承认型技术债务的概率;
将三个基分类器输出结果进行融合,得到最终的注释数据属于自承认型技术债务的概率;
设定分类阈值,若属于自承认型技术债务的概率大于0.5,则判定该注释数据为自承认型技术债务;若属于自承认型技术债务的概率小于等于0.5,则判定该注释数据为非自承认型技术债务;
步骤3:将待检测注释数据输入自承认型技术债务检测模型,输出结果为该待检测注释数据是否为自承认型技术债务的结果。
具体实施例:
1、数据集的获取和处理
本发明的数据集来源于Maldonado和Shihab,已经公开在gethub网站上,且被多个研究者们使用。该数据集选取了十个项目的源代码注释共33090条,项目名称是Ant、ArgoUML、Columba、EMF、Hibernate、JEdit、JFreeChart、JRuby及SQuirrel,项目详细信息如表1所示,包括项目的版本,贡献者数量,源代码行数(Software Lines of Code),项目所属领域,包含注释条数,及自承认技术债务个数和比例如表2所示。Maldonado和Shihab使用开源插件解析并提取源代码,并运用五种过滤启发式规则对其过滤,得到62566条注释评论,将这62566条注释分类成自承认技术债务和非自承认技术债务。将自承认技术债务分为五类,包括设计债务,缺陷债务,文档债务,需求债务及测试债务。
表1项目相关信息
Project
Release
#of Contributors
SLOC
Ant
1.7.0
74
115,881
ArgoUML
0.34
87
176,839
Columba
1.4
9
100,200
EMF
2.4.1
30
228,191
Hibernate
3.3.2GA
226
173,467
JEdit
4.2
57
88,583
JFreeChart
1.0.19
19
132,296
JMeter
2.10
33
81,307
JRuby
1.4.0
328
150,060
SQuirrel
3.0.3
46
215,234
表2项目相关数据统计
如图2所示,是数据准备的过程,首先将源代码数据划分十个项目数据集,然后分别进行符号化、移除停用词等,然后进行文本表示转化为注释矩阵。具体的,为了方便词向量表示,以便于更好的表征语义,移除了源代码注释的停用词,并截长补短。例如遇到类似于“a”,“can”等对于文本分析是无助的,进行移除,这样不仅可以有效减少数据文件的大小,而且可以提高运算效率。
为了解决传统的独热编码高纬度及高稀疏性问题,本发明采用词向量方式。与图像不同,注释文本本身不具有丰富的高维向量表示,不能直接作为神经网络的输入数据进行特征提取,因此自承认技术债务识别的一部分重要工作是要训练词向量,将注释文本转换为网络能够识别的特征,才能够对语义信息进行学习。在本发明中,使用神经网络提供的Embedding层实现词向量的训练,将生成的词向量按照注释顺序拼接后得到的词向量矩阵作为作为卷积层的输入,以便于更好的提取特征。
2、集成模型的选取和训练
卷积神经网络有强大的特征提取能力,它通过使用卷积神经网络中多个不同size的kernal来提取句子中的关键信息,可以捕捉局部相关性。CNN在文本分类应用效果显著,并且将CNN用于SATD识别相比基于模式的方法和文本挖掘的方法,CNN能够自动的提取特征,减少了人工的参与,并且识别的准确率也有所提升。为此,本发明将卷积神经网络作为集成模型中的一个基分类器。其次,CNN进行文本分类时虽然能够提取文本特征,并根据特征对文本进行分类,但只能关注到局部特征,而没有关注到全局特征,容易造成一条注释分为多个类别的现象,这种现象影响了分类结果。
LSTM是序列化的处理方式,能较好的联系上下文,对识别自承认技术债务任务中注释的这种短文本分类的准确性好,但由于其结构复杂,随着输入文本量增加,计算量随之增大,从而降低了上下文本的联系,使得识别准确率降低。因此,本发明结合CNN和LSTM的各自优势,构建CNN-LSTM混合模型作为集成模型中的第二个基分类器。
最后,CNN不能通过卷积获得文本的长距离依赖关系,而DPCNN通过不断加深网络,可以抽取长距离的文本依赖关系。在不增加太多计算成本的情况下,增加网络深度就可以获得较高的准确率。因此,选取了DPCNN作为集成模型中的第三个基分类器。
集成模型中的每一个模型都需要进行训练,并且每个模型都会进行多次迭代优化。在每次迭代中,模型会根据已知训练数据标签获取到一个预测标签,根据预测标签衡量与真实标签的损失来调整模型的参数,尝试逐渐降低损失,同时使用Adam算法解决了优化问题。此外,针对数据的不平衡问题,受何凯明解决异常检测中的样本不平衡问题的启发,使用focal loss损失函数,通过减少多数样本的权重,使得模型在训练时更加专注于少数类样本。
3、SATD的检测
集成模型经过训练后可以对未分类的样本来识别注释是否是自承认技术债务。对于一条待分类的注释样本,每个模型先将建立的字典序列转化为数字序列表示的数字矩阵,然后经过Embedding层训练词向量,再经过各自模型的特征提取及模型训练最终进行分类。例如对于卷积神经网络会经过卷积层和池化层提取特征并进行模型的训练,然后再由sotfmax分类器进行分类。每个模型的分类器输出层都会给出相应的分类结果,将模型的输出结果融合,给出待分类注释的SATD概率,如果概率值大于0.5 认为是SATD,否则不是SATD。
根据数据集的分类标签SATD和non-SATD可知这是一个二元分类问题。针对每一条注释文本进行识别时,可能会产生四种结果,如表3所示。当预测类别和真实类别相符时,称其为正确分类结果,例如真阳性(TP)和真阴性(TN)。当不相符时,称为错误分类结果,例如假阳性(FP)和假阴性(FN)。其中,TP代表预测结果属于 SATD,真实结果也属于SATD;TN代表预测结果不属于SATD,最终真实结果也不属于SATD;FP代表预测结果不属于SATD,但最终真实结果属于SATD;FN代表预测结果属于SATD,但是实际真实结果不属于SATD。不同的分类模型有不同的实验结果,本实施例通过计算不同分类模型的准确率、查全率、查准率以及F1值,来判断分类模型的分类性能。
表3分类结果矩阵
查准率:表示模型预测为正类的样本中真实结果也为正类的样本比例。如式(1)所示:
查全率:表示模型预测为正类的样本与真实预测为正类的样本比例。如式(2)所示:
F1值:查全率和查准率不能全面的评估性能,为此补充性地引入F1,它是查全率和查准率的调和均值趋向于接近较小的值,因此F1度量值高可以确保查准率和查全率都比较高。F1的公式如(3)所示:
本发明所采用方法将CNN、CNN-LSTM、DPCNN神经网络模型集成。为了验证该方法相对于现有的SATD识别方法的有效性,进行项目内预测的对比实验。一共进行了五组实验。第一,本发明方法;第二,CNN方法;第三,Huang的文本挖掘方法;第四,Maldonado和Shihab的自然语言处理的方法;第五,Guo’s模式识别方法。
结果表明,本发明方法查准率平均值达到了0.800。相比于CNN方法的0.637、 TM方法的0.702及NLP方法的0.537,本发明方法提高了25.59%、13.96%及48.97%。五种方法的查全率平均值分别为0.736、0.705、0.714、0.604及0.612,本发明方法分别提高了4.40%、3.08%及21.85%。如图3所示是本发明方法与其他四种方法在10个项目上的F-Measure结果。五种方法F-Measure得分的平均值分别为0.763、0.662、 0.697、0.561及0.689,本发明方法分别提高了15.26%、9.47%、36.01%及10.74%,五种方法在ArgoUML项目上达到了较高的F1得分,本发明方法在Columba上的F1得分达到最高的0.913。值得注意的是,在JEdit项目上本发明方法相比于其他方法分别提高了23.2%,22.71%,34.20%及101.97%。另外,在EMF项目上也有较大提高。由此可见,在JEdit和EMF这些SATD占比较低的项目中本发明方法能够显著优于其他方法。
为了提高方法的可解释性,本发明提出基于Attention机制的可视化SATD重要特征。CNN-LSTM模型相比CNN模型更加关注句子特征,相比DPCNN模型来说,更加简单易于收敛。目前Attention在NLP中已经有广泛的应用。Attention机制利用每个元素被赋予的重要性评分来对序列数据进行编码,通过可视化attention矩阵来判断神经网络在进行任务时关注了哪些部分。因其能在一系列任务上对模型性能产生显著的提升从而提高了可解释性,尤其是基于循环神经网络结构。为此,在CNN-LSTM模型上加入Attention来验证可解释性。具体做法是为整个句子构建一个热力图,热力图强度与每个单词接收到的标准化注意力得分成正比。也就是说,词的贡献越大,颜色越深,来证明某些词比其它词重要。
如图4所示是可视化结果的展示,集中关注了含有SATD的注释,为此图4展示的10个句子都为SATD,可以看出通过Attention赋予词的权重,在模型训练时,可以相对的关注某些词或模型,衡量它们对于整个句子分类的重要程度,来达到分类的目的,并且利用Attention将句子中的某些对分类贡献比较大的词提取出来,以有助于人类理解的方式展示出来,在一定程度上提高可解释性。例如“todo”“workaground”的词的出现在很大程度上被认为该句为SATD,在实验中,这些词也被识别出,并且如“todo”,“fixme”等词汇在Guo的实验中也印证了属于强模式,他们仅使用四个模式识别SATD 也取得了不错的效果。此外,在表4也例举出了使用这种方法识别出的每个项目前20 个特征词。
表4:基于CNN-LSTM注意力机制提取的10个项目的Top 20关键词
- 上一篇:石墨接头机器人自动装卡簧、装栓机
- 下一篇:无线通信模组的测试系统和方法