本发明涉及软件测试技术领域,尤其涉及一种基于循环神经网络和代价敏感的软件bug分派方法。
背景技术:
软件bug,是软件程序在运行过程中出现的问题,它们的存在会使得软件失效,所以及时修复软件bug,是保证软件质量的基础。软件bug仓库是用来管理软件bug报告的一种高效工具,用户提交的bug报告将会存储到软件bug仓库中,管理人员通过阅读这些bug报告来指派合适的开发者对它们进行修复。但是随着软件项目规模的逐渐扩大,软件bug及参与bug修复的开发者的数量都大大增加,这种人工进行bug指派的方式耗费时间长、成本高效率低,人们需要一种更加高效的方式来完成bug指派的工作。所以自动化bug分派技术应运而生,研究者们通过机器学习将bug分派问题转换成文本分类问题,提出了众多的自动bug分派技术。但是当前很多自动bug分派技术只考虑将bug报告分派给最合适的开发者,而不考虑开发者的负担问题,容易导致某一开发者积压大量需要修复的bug报告,从而拖慢项目的整体修复进程。
技术实现要素:
根据现有技术存在的问题,本发明公开了一种基于循环神经网络和代价敏感的软件bug分派方法,具体包括以下步骤:
s1:对采集历史bug报告仓库中的原始数据集进行预处理;其中预处理包括筛选bug报告、提取筛选出的bug报告的文本信息、提取开发者活跃度信息;
s2:在训练集上对csdbt模型进行预训练;
s3:使用自适应差分进化算法求解最优的误分类代价矩阵:验证集的数据进行求解,获取误分类代价矩阵的最优值;
s4:将预训练好的的csdbt模型和上一步得到的最优误分类代价矩阵相结合得到新csdbt模型,最后输入测试集对新csdbt模型进行测试。
进一步的,对原始数据集进行预处理具体采用如下方式:
s11:对bug报告进行筛选保留状态为已修复的bug,删除无效和修复的低效bug;
s12:从筛选出的bug报告中提取文本信息,选取文本信息来进行分词、去停用词处理,删除出现次数过多和过少的单词;
s13:提取开发者活跃度信息,收集当前bug报告的产品和模块信息相同的开发者活动序列;
s14:将预处理过的数据集划分成训练集、验证集和测试集。
进一步的,s2中具体采用如下方式:
s21:使用one-hot编码文本信息和开发者信息;
s22:使用双向循环神经网络抽取文本信息的高层特征,使用单向循环神经网络抽取活跃度信息的高层特征,将两种高层特征以元素间相乘的方式进行融合;
s23:完成高层特征到开发者概率的转换;
s24:在训练集数据中,以最小化交叉熵为目标,优化神经网络模型至收敛。
进一步的,s3中具体采用如下方式:
s31:初始化误分类代价种群,其中种群中有n个个体,每个个体代表一个误分类代价矩阵的可行解;
s32:基于自适应生成的突变算子和交叉算子生成一个新的误分类代价种群;
s33:计算种群中所有个体的适应度值,将每个个体代表的误分类代价矩阵分别带入预训练好的csdbt模型,将获得的新csdbt模型在验证集上运行得到正确率数值,该正确率数值为一个可行解的适应度值;
s34:根据当前个体同上一代对应个体的适应度值,从中选择适应度更高的个体,丢弃表现差的个体;
s35:自适应调整种群的突变算子和交叉算子;
s36:返回s32步骤持续迭代,直到达到设定的最大迭代次数,并选择最后一代中适应度最高的个体作为最优解。
进一步的,s4中具体采用如下方式:
s41:在完成预训的csdbt模型上,结合优化得到的误分类代价矩阵,输入经过预处理的测试集;
s42:csdbt模型将针对测试集中的每个样本返回一个长度为k的推荐者列表。
由于采用了上述技术方案,本发明提供的一种基于循环神经网络和代价敏感的软件bug分派方法,该方法采用差分进化算法,在没有任何先验知识的前提下,为每个数据集优化求解最合适的误分类代价矩阵。以原有deeptriage模型为基础,既兼顾了文本的次序和开发者的活跃度信息,也通过误分类代价矩阵解决了数据类别不平衡的问题。基于上述原因,本发明有效避免了同一个开发者出现大量bug报告积压的问题,加快了项目的修复进程。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明方法的流程图
图2为本发明中方法测试部分的流程图。
具体实施方式
为使本发明的技术方案和优点更加清楚,下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚完整的描述:
如图1和图2所示的一种基于循环神经网络和代价敏感的软件bug分派方法(costsensitivedeepbugtriage,csdbt),具体包括以下步骤:
s1:对采集历史bug报告仓库中的原始数据集进行预处理;其中预处理包括筛选bug报告、提取筛选出的bug报告的文本信息、提取开发者活跃度信息。
进一步的,对原始数据集进行预处理具体采用如下步骤:
s11:对bug报告进行筛选保留状态为已修复的bug,删除无效和修复的低效bug;
s12:从筛选出的bug报告中提取文本信息,选取文本信息来进行分词、去停用词处理,删除出现次数过多和过少的单词;
s13:提取开发者活跃度信息,收集当前bug报告的产品和模块信息相同的开发者活动序列;
s14:将预处理过的数据集划分成训练集、验证集和测试集。
s2:在训练集上对csdbt模型进行预训练,具体采用如下方式:
s21:输入,使用one-hot编码文本信息和开发者信息;
s22:特征抽取,使用双向循环神经网络抽取文本信息的高层特征,使用单向循环神经网络抽取活跃度信息的高层特征,将两种高层特征以元素间相乘的方式进行融合;
s23:完成高层特征到开发者概率的转换;
s24:在训练集数据中,以最小化交叉熵为目标,优化神经网络模型至收敛。其中保证神经网络的参数不变,输入验证集中新的bug报告,可返回按概率大小排列的开发者列表。
s3:使用自适应差分进化算法求解最优的误分类代价矩阵:验证集的数据进行求解,获取误分类代价矩阵的最优值。该步骤的目的是得到一个最优的误分类代价矩阵,因为种群中每个个体都代表了一个代价矩阵的可行解,所以我们需要对所有可行解进行评价,从而选出最好的可行解,也就是选择出适应度最高的个体。
其中代价敏感学习是指为不同类别的样本提供不同的权重,核心是误分类代价矩阵。不同类别样本的误分类代价就构成了误分类代价矩阵。假设类别的个数为m,该数据集对应的误分类代价矩阵就是一个m×m的矩阵:
其中ci,j表示实际上属于i类的样本被误分成j类所造成的代价。
通常情况下,传统的训练算法假设所有误分类的代价都是相等的,即
但是在实际应用中,不同类别的错误往往对应不同的误分类代价。例如在医疗中,"将病人误诊为健康人的代价"与"将健康人误诊为病人的代价"肯定是不同的;代价敏感学习就是考虑不同的误分类代价,为不同类型的错误分配不同的代价,使得在分类时,高代价错误产生的数量和错误分类的代价总和最小。本发明中将代价敏感学习与神经网络相结合,传统的神经网络模型,经过分类之后,一个样本x属于类别i的后验概率可以表示成:
p(y=j|x)=softmaxi
之后神经网络会使用这样得到的后验概率来推荐开发者列表。
但是我们额外加一步,在这里引入代价敏感机制,基于贝叶斯风险理论,对后验概率进行惩罚:
然后再用上面这种经过误分类代价矩阵惩罚之后的新概率来推荐开发者列表。但是由于缺少先验知识,我们无法得知该数据集对应的误分类代价矩阵的具体值,所以我们需要通过差分进化算法来优化出一个最优的误分类代价矩阵。将该可行解代表的误分类代价矩阵,按照上面的方式同预训练好的神经网络相结合,以模型在验证集上的正确率数值作为该可行解的适应度值。以上是对一个可行解的评价方式,如果种群中有100个个体,则我们需要将上述过程独立的执行100次,从而得到每一个个体的适应度值。
s4:将预训练好的的csdbt模型和上一步得到的最优误分类代价矩阵相结合得到新csdbt模型,最后输入测试集对新csdbt模型进行测试。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,根据本发明的技术方案及其发明构思加以等同替换或改变,都应涵盖在本发明的保护范围之内。