一种基于神经网络语言模型的重复代码检测方法与流程

文档序号:11774381阅读:415来源:国知局

一种基于神经网络语言模型的重复代码检测方法,用于发现重复代码,属于重复代码检测方法技术领域。



背景技术:

站在软件工程的角度来说,对于代码克隆可以分为三种类型。第一种是由于代码重复使用而引入的,这去除了软件开发中的一些重复性工作,这些代码体现了软件的良好设计。第二种重复代码可能会导致软件的bug,例如在复制的代码中忘记或是错误地修改了函数名或是变量名。第三种重复代码虽然不会直接引发代码bug,但会对软件后期的可维护性产生重大的影响。例如在mvc模式下进行系统设计时,如果有两个子系统间存在着重复代码,这意味着不满足mvc分层、独立的要求。如果要对其中的一个子系统进行修改,则需要重新编译另一个子系统。因此这种跨越多个不同功能子系统的重复代码会对系统的可维护性产生严重的危害。

对于代码的重复检测任务,可以从几个角度上进行,例如可以从代码文本的角度进行分析。如果只是从文本的角度上进行分析,那么只需要对函数名、变量名稍加修改,就可以得到完全不一样的代码,但是从本质上来说并没有任何改变。而代码的本质,就是一个过程的执行流,可以使用控制流图进行表示。现有技术中的重复代码检测方法,不能检测出没有进行本质性改变的重复代码,造成检测的准确率,容易给代码原创者造成经济损失等问题。



技术实现要素:

本发明的目的在于:解决现有技术中的重复代码检测方法,不能检测出没有进行本质性改变的重复代码,造成检测的准确率,容易给代码原创者造成经济损失等问题,提供了一种基于神经网络语言模型的重复代码检测方法。

本发明采用的技术方案如下:

一种基于神经网络语言模型的重复代码检测方法,其特征在于:包括以下步骤:

步骤1:将所有的代码中的每个代码转换为相应的cfg图;

步骤2:抽取每个cfg图中每一个结点的根子图;

步骤3:将所有根子图采用向量表示;

步骤4:将根子图的向量表示输入到深度图核函数中学习,得到所有cfg图两两间的相似度;

步骤5:将cfg图两两间的相似度输入到ap关联聚类算法中进行cfg图的聚类得到多个聚类簇,在同一个聚类簇中的cfg图所对应的代码即为重复代码。

进一步,所述步骤2的步骤如下:

步骤21:给定cfg图中每一个结点v要抽取的根子图的度d,若d=0,表示并不需要抽取根子图,否则转到步骤22;

步骤22:利用广度优先搜索算法获得结点v的所有邻居结点;

步骤23:对于结点v的每一个邻居结点v'n,获取其度为d-1的邻居子图,并将邻居子图保存在一个列表中,其中,d度邻居子图指的是与结点v距离为d的结点所构成的子图,与根节点距离为d的结点并不需要都出现在根节点的d度邻居子图中,即根节点的d度邻居子图可以有多个;

步骤24:获取结点v的度为d-1的邻居子图,将其与中相同的邻居子图进行连接,即得到了所需要的根子图

进一步,所述步骤3的步骤如下:

步骤31:利用随机值为所有的根子图初始化一个向量表示

步骤32:利用改进的skipgram模型对根子图的初始化向量表示进行更新,输出所有根子图最终的向量表示具体步骤如下:

步骤321:将结点为v的d度邻居子图的上下文sgcont定义为:以结点v的邻居结点为根节点,由所有邻居结点的度为d-1,d,d+1的邻居子图所构成的集合;

步骤322:使用固定长度的滑动窗口技术,在根子图的辐射状上下文进行滑动,进行固定长度选取;

步骤323:将skipgram模型中不同窗口间的投影层与输出层间的权值设置为共享,将步骤322选取的一固定长度上下文输入到skipgram模型中进行学习,得到本次循环的向量表示;

步骤324:若达到给定的循环终止次数,则停止循环,输出所有根子图的最终向量表示否则跳转到步骤322,执行下一次循环。

进一步,所述步骤323的具体步骤为:

步骤3231:将输入层中输入的上下文输入到投影层中,投影层是一个恒等投影,并不需要对输入层数据做任何处理;

步骤3232:将投影层的数据通过目标函数调整后输入到输出层中,输出层对应一棵二叉树,它是以根子图集合中出现过的根子图当叶子结点,以根子图在所有根子图中出现的次数当权值构造出来的huffman树,再由输出层输出本次循环的向量表示;目标函数通常取为:给定v结点的根子图的初始化向量表示最大化初始化向量表示的上下文sgcont中每一个邻居子图的概率使用负采样方法来近似这一概率分布。

综上所述,由于采用了上述技术方案,本发明的有益效果是:

1、本发明基于神经网络语言模型,可利用分布式的表示方法表示根子图,能够有效的避免维度灾难的问题,特别是在处理大规模数据问题时;

2、本发明中根子图之间不存在线性关系,故将根子图的上下文定义成辐射状的形式,能够更加准确地获取根子图间的相似性;由于传统的skipgram模型只接收固定长度的输入,本发明利用滑动窗口技术对模型进行修改,使其能够更好地适应于辐射状的上下文结构;能从大量代码中发现完全重复以及只对函数名、变量名稍加修改的重复代码,从而能够有效地保护自己的知识产权,防止了别人盗用所带来的经济损失;

3、本发明在重复代码检测这一任务中,较深度图核函数模型以ari指数为衡量标准是提高了0.17;ari指数是衡量聚类结果的一个标准方法。

附图说明

图1为本发明流程示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。

一种基于神经网络语言模型的重复代码检测方法,包括以下步骤:

步骤1:将所有的代码中的每个代码利用clang工具转换为相应的cfg图;

步骤2:抽取每个cfg图中每一个结点的根子图,根子图是包含了根节点和与根节点距离在一定深度内的结点的子图;所述步骤2的步骤如下:

步骤21:给定cfg图中每一个结点v要抽取的根子图的度d,若d=0,表示并不需要抽取根子图,否则转到步骤22;

步骤22:利用广度优先搜索算法获得结点v的所有邻居结点;

步骤23:对于结点v的每一个邻居结点v'n,获取其度为d-1的邻居子图,并将邻居子图保存在一个列表中,其中,d度邻居子图指的是与结点v距离为d的结点所构成的子图,与根节点距离为d的结点并不需要都出现在根节点的d度邻居子图中,即根节点的d度邻居子图可以有多个;

步骤24:获取结点v的度为d-1的邻居子图,将其与中相同的邻居子图进行连接,即得到了所需要的根子图

步骤3:将所有根子图采用向量表示;所述步骤3的步骤如下:

步骤31:利用随机值为所有的根子图初始化一个向量表示

步骤32:利用改进的skipgram模型对根子图的初始化向量表示进行更新,输出所有根子图最终的向量表示具体步骤如下:

步骤321:将结点为v的d度邻居子图的上下文sgcont定义为:以结点v的邻居结点为根节点,由所有邻居结点的度为d-1,d,d+1的邻居子图所构成的集合;

步骤322:使用固定长度的滑动窗口技术,在根子图的辐射状上下文进行滑动,进行固定长度选取;

步骤323:将skipgram模型中不同窗口间的投影层与输出层间的权值设置为共享,是为了减少模型的参数,同时也因为根子图的上下文间是没有顺序的,再将步骤322选取的一固定长度上下文输入到skipgram模型中进行学习,得到本次循环的向量表示;具体步骤为:

步骤3231:将输入层中输入的上下文输入到投影层中,投影层是一个恒等投影,并不需要对输入层数据做任何处理;

步骤3232:将投影层的数据通过目标函数调整后输入到输出层中,输出层对应一棵二叉树,它是以根子图集合中出现过的根子图当叶子结点,以根子图在所有根子图中出现的次数当权值构造出来的huffman树,再由输出层输出本次循环的向量表示;目标函数通常取为:给定v结点的根子图的初始化向量表示最大化初始化向量表示的上下文sgcont中每一个邻居子图的概率如果训练集中数据较多,那么训练这样一个模型将需要耗费巨大的计算资源。为了避免这一计算瓶颈的出现,使用负采样方法来近似这一概率分布。

步骤324:若达到给定的循环终止次数,则停止循环,输出所有根子图的最终向量表示否则跳转到步骤322,执行下一次循环。

步骤4:将根子图的向量表示输入到深度图核函数中学习,得到所有cfg图两两间的相似度;

步骤5:将cfg图两两间的相似度输入到ap关联聚类算法中进行cfg图的聚类得到多个聚类簇,在同一个聚类簇中的cfg图所对应的代码即为重复代码。

实施例1

从不同的安卓应用市场选取260个app,其中的每一个app都是经过人工分析的,其中的100个克隆代码的集合也是由人工确定的;

利用步骤1,将代码转换为对应的cfg图;

对于所有cfg图利用步骤2,获取其每一个结点的根子图;

利用步骤3,学习到每一个根子图的向量表示;

利用步骤4,得到所有cfg图两两间的相似度;

利用步骤5,对所有cfg图进行聚类,在同一个聚类簇中的cfg图所对应的代码即为重复代码。利用ari指数对聚类结果进行衡量,其值为0.88。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1