一种基于深度学习的特征依恋代码异味检测方法技术

技术编号:19176643 阅读:127 留言:0更新日期:2018-10-17 00:14
本发明专利技术涉及一种基于深度学习的特征依恋代码异味检测方法,属于计算机软件技术领域。首先提取用于训练的开源软件的可移动方法信息和距离,生成训练集,将提取出来的可移动方法信息和距离转换为词向量表示的训练数据,将训练数据输入卷积神经网络训练神经网络模型。然后,提取用于测试的开源软件的可移动方法的方法信息和距离,生成测试数据集,将测试数据集中的数据全部转换为由词向量表示的待测试数据。将待测试数据输入神经网络模型中,模型自动输出0或1,其中1代表存在特征依恋代码异味,0代表不存在。本发明专利技术所述检测方法,与现有检测方法相比,大幅度提高了平均召回率,同时提高了平均准确率。

A deep learning based odor detection method for feature attachment code

The invention relates to an odor detection method of feature attachment code based on depth learning, which belongs to the technical field of computer software. Firstly, the mobile method information and distance of open source software for training are extracted, and the training set is generated. The extracted mobile method information and distance are transformed into training data represented by word vector. The training data are input into convolution neural network to train neural network model. Then, the method information and distance of the movable method of open source software for testing are extracted, and the test data set is generated. All the data in the test data set is converted into the test data expressed by word vector. When the data to be tested is input into the neural network model, the model automatically outputs 0 or 1, where 1 represents the presence of characteristic attachment code odor, 0 represents the absence of. Compared with the existing detection methods, the detection method of the invention greatly improves the average recall rate and the average accuracy rate.

【技术实现步骤摘要】
一种基于深度学习的特征依恋代码异味检测方法
本专利技术涉及一种针对特征依恋的代码异味检测方法,属于计算机软件

技术介绍
代码重构(CodeRefactoring),是指在不改变软件系统外部行为的前提下,改善它的内部结构。代码重构可以通过调整程序代码改善软件的质量、性能,使程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。代码重构是一种经千锤百炼形成的有条不紊的程序整理方法,可以最大限度地减少整理过程中引入错误的概率。本质上说,代码重构就是在代码写好之后改进它的设计。软件重构被广泛应用于通过重构其每部结构来提高软件质量,而其外部行为保持不变。大多数现有的IDE(集成开发环境,IntegratedDevelopmentEnvironment)都为软件重构提供工具支持,例如Eclipse。Eclipse有一个专门用于软件重构的顶级菜单项,提供了大多数流行的软件重构的条目。软件重构的一个关键步骤是确定应用重构的地方。为了便于识别这些地方,人们提出了代码异味的概念。如果一段代码不稳定或者存在一些潜在问题,这段代码往往会包含一些明显的痕迹,类似于食物即将腐坏之前通常会挥发出一些异味一样,因此将这些痕迹称作“代码异味”。在程序开发领域,代码中任何可能导致深层次问题的症状都可以称为代码异味,比如重复代码、长方法、巨类、亲密关系、特征依恋等等。代码异味推动重构的进行,人们分析每个代码异味的特征,以及它们的影响和潜在解决方案(重构)。目前,大多数代码气味检测方法都依赖手动设计的启发式策略将手动定义/选择的代码度量映射到二元预测中,判断有异味或没有异味。但是,手动识别代码异味繁琐且费时,特别是当这种代码异味涉及多个文件或包时。而且手动构建最佳启发式功能也很困难。对这种方法的分析结果表明,不同的人可能会针对相同的代码异味选择不同的度量和不同的重构方式,这导致不同检测工具之间的一致性很低。为了避免手动设计的启发式算法,现在已经有大量的自动或半自动方法来检测不同类型的代码异味的工具。像SVM,朴素贝叶斯和LDA这样的统计机器学习技术被用来建立代码度量以及词汇相似度和预测之间的复杂映射关系。然而,实证研究表明,这种基于统计机器学习的异味检测方法具有关键的局限性,值得进一步的研究。深度神经网络和先进的深度学习技术可以自动从程序源代码(特别是文本特征)中为代码异味检测选择有用的特征,并在这些特征和标签(有异味或无异味)之间建立复杂的映射关系。神经网络和深度学习技术的特点就是从大量数据中选择有用的特征自动构建从输入到输出的复杂映射关系。为了训练基于神经网络的分类器,本专利技术提出了一种自动方法来生成带标签的训练数据。这种方法不需要任何人为干预。基于这些方法正确放置在原始程序中的假设,通过直接从高质量的开源应用程序中提取方法(及其上下文)来生成负样本。为了生成正样本,可以将方法随机地移动到其他可以通过重构工具移动的类中。移动后,方法(连同他们的新环境)被视为特征羡慕。因为这个方法是完全自动的,所以生成大量这样的带标签的训练数据。大数据反过来作为基于机器学习的分类的基础。
技术实现思路
在常见的22中代码异味中,特征依恋是一种特殊的代码异味,表现为在代码中,一个类过度使用另外一个类的方法。本专利技术的目的在于针对现有特征依恋检测方法中结构功能和文本功能很难最佳化并且自动化程度不够的现状,提出了一种基于深度学习的特征依恋代码异味检测方法。本专利技术一种基于深度学习的特征依恋代码异味检测方法,包括以下步骤:步骤1:提取用于训练的开源软件的可移动方法信息和距离,生成训练集。所述可移动方法是指该方法有可移动的类,并且移动之后未出现编译错误。所述方法信息包括方法名、方法源类名和方法目标类名。所述距离包括方法与源类的距离和方法与目标类的距离。步骤1的具体实现过程为:首先,使用EclipseJDT提供的API方法检测“方法”是否可以移动到其他类。若可以移动,提取该可移动方法的方法信息和距离,自动生成标签为0(代表不存在特征依恋代码异味),然后移动该方法,并提取移动后方法的方法信息和距离,自动生成标签为1(代表存在特征依恋代码异味),之后执行撤回操作,将移动后方法回归原位,并转向判断下一个方法。若判断结果为该方法不能移动,则丢弃并转向判断下一个方法。当所有方法判断完毕之后,生成所有可移动方法的方法信息和距离的训练集,其中正样本占50%,负样本占50%。步骤2:将步骤1提取出来的可移动方法信息和距离转换为词向量表示的训练数据。神经网络的输入分为两部分:一部分是将训练集中的每个方法名及其对应的源类名和目标类名转换为一个15维的向量表示,另一部分是将距离用一个二维的向量表示。每一个方法名、方法源类名和方法目标类名均为一个标识符。首先将标识符转换为向量表示。将每个标识符的名称分割为一系列的单词<t1,t2,……,tk>,假定标识符遵循驼峰或蛇形命名规则,因此分割标识符的依据是下划线和大写字母。由于要考虑单词的顺序和语义关系,规定使用定长长度为15的段落向量表示方法名和源类名、目标类名。将每个向量转化为词向量。通过自行训练一个Word2vector模型实现:利用一个输入层输入Word2vector的训练数据,利用一个隐藏层训练生成Word2vector模型。通过一个输出层,利用Word2vector模型将可移动方法信息的每个向量转化为词向量。步骤3:将训练数据输入卷积神经网络(CNN,ConvolutionalNeuralNetwork),训练神经网络模型。具体方式为:构建一个CNN网络,第一层为网络输入层,将文本序列展开成词向量的序列,之后连接卷积层、激活层,然后连接全连接层和激活层,激活层采用sigmoid并输出该文本属于某类的概率。将步骤2中得到的词向量作为网络输入层的输入,将标签作为网络输出基准,进行网络输出词向量的训练,从而得到神经网络模型。其中,为了降低神经网络预测的错误率,利用自适应学习率调整算法(如AdaDelta)进行神经网络模型训练。步骤4:提取用于测试的开源软件的可移动方法的方法信息和距离,生成测试数据集。所述方法信息包括方法名、方法源类名和方法目标类名。所述距离包括方法与源类的距离和方法与目标类的距离。使用EclipseJDT提供的API方法检测“方法”是否可以移动到其他类。若可以移动,则随机划分为50%移动和50%不移动概率。如果属于50%移动概率,则移动该方法,并提取移动后方法的方法信息和距离,自动生成标签为1(代表存在特征依恋代码异味),之后执行撤回操作,将移动后方法回归原位,并转向判断下一个方法。如果属于50%不移动概率,则提取该可移动方法的方法信息和距离,自动生成标签为0(代表不存在特征依恋代码异味)。利用步骤2所述方法,将测试数据集中的数据全部转换为由词向量表示的待测试数据。步骤5:将步骤4得到的待测试数据输入步骤3得到的神经网络模型中,模型自动输出0或1,其中1代表存在特征依恋代码异味,0代表不存在。有益效果本专利技术所述检测方法,与现有JDeodorant、JMove等检测方法相比,大幅度提高了平均召回率,同时提高了平均准确率。附图说明图1是本专利技术所述方法的工作原理示意图;图2是本专利技术所述方法本文档来自技高网
...

【技术保护点】
1.一种基于深度学习的特征依恋代码异味检测方法,其特征在于,包括以下步骤:步骤1:提取用于训练的开源软件的可移动方法信息和距离,生成训练集;所述可移动方法是指该方法有可移动的类,并且移动之后未出现编译错误;所述方法信息包括方法名、方法源类名和方法目标类名;所述距离包括方法与源类的距离和方法与目标类的距离;具体实现过程为:首先,检测“方法”是否可以移动到其他类;若可以移动,提取该可移动方法的方法信息和距离,自动生成标签为0,代表不存在特征依恋代码异味,然后移动该方法,并提取移动后方法的方法信息和距离,自动生成标签为1,代表存在特征依恋代码异味,之后执行撤回操作,将移动后方法回归原位,并转向判断下一个方法;若判断结果为该方法不能移动,则丢弃并转向判断下一个方法;当所有方法判断完毕之后,生成所有可移动方法的方法信息和距离的训练集,其中正样本占50%,负样本占50%;步骤2:将步骤1提取出来的可移动方法信息和距离转换为词向量表示的训练数据;神经网络的输入分为两部分:一部分是将训练集中的每个方法名及其对应的源类名和目标类名转换为一个15维的向量表示,另一部分是将距离用一个二维的向量表示;每一个方法名、方法源类名和方法目标类名均为一个标识符;首先将标识符转换为向量表示,将每个标识符的名称分割为一系列的单词...

【技术特征摘要】
1.一种基于深度学习的特征依恋代码异味检测方法,其特征在于,包括以下步骤:步骤1:提取用于训练的开源软件的可移动方法信息和距离,生成训练集;所述可移动方法是指该方法有可移动的类,并且移动之后未出现编译错误;所述方法信息包括方法名、方法源类名和方法目标类名;所述距离包括方法与源类的距离和方法与目标类的距离;具体实现过程为:首先,检测“方法”是否可以移动到其他类;若可以移动,提取该可移动方法的方法信息和距离,自动生成标签为0,代表不存在特征依恋代码异味,然后移动该方法,并提取移动后方法的方法信息和距离,自动生成标签为1,代表存在特征依恋代码异味,之后执行撤回操作,将移动后方法回归原位,并转向判断下一个方法;若判断结果为该方法不能移动,则丢弃并转向判断下一个方法;当所有方法判断完毕之后,生成所有可移动方法的方法信息和距离的训练集,其中正样本占50%,负样本占50%;步骤2:将步骤1提取出来的可移动方法信息和距离转换为词向量表示的训练数据;神经网络的输入分为两部分:一部分是将训练集中的每个方法名及其对应的源类名和目标类名转换为一个15维的向量表示,另一部分是将距离用一个二维的向量表示;每一个方法名、方法源类名和方法目标类名均为一个标识符;首先将标识符转换为向量表示,将每个标识符的名称分割为一系列的单词<t1,t2,……,tk>,假定标识符遵循驼峰或蛇形命名规则,分割标识符的依据是下划线和大写字母;然后将每个向量转化为词向量;步骤3:将训练数据输入卷积神经网络,训练神经网络模型;具体方式为:构建一个卷积神经网络,第一层为网络输入层,将文本序列展开成词向量的序列,之后连接卷积层、激活层,然后连接全连接层和激活层,激活层采用sigmoid并输出该文本属于某类的概率;将步骤2中得到的词向量作为网络输...

【专利技术属性】
技术研发人员:刘辉许志凤
申请(专利权)人:北京理工大学
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1