System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind()
【技术实现步骤摘要】
本专利技术涉及代码查重技术,具体涉及一种基于深度学习的双图代码查重方法及其系统。
技术介绍
1、代码查重,也称为代码克隆检测或代码抄袭检测,是一种用于识别和比较源代码文件中相似或相同代码片段的过程。它的目的是确保代码的原创性,防止非法复制或滥用代码,以及维护软件开发中的知识产权。随着计算机编程在教育、工业和研究领域的广泛应用,代码查重技术成为了确保代码原创性和维护知识产权的重要工具。代码查重技术的发展与计算机编程教育的普及密切相关。在学术环境中,教师需要确保学生提交的代码作业是原创的,而在工业界,企业需要保护其软件产品的代码不被非法复制或滥用。此外,随着开源运动的兴起,代码查重也成为了维护开源社区健康和促进代码共享的重要手段。
2、代码查重工具通常采用多种技术和算法来识别相似或重复的代码片段,包括文本比对,通过直接比较代码文本的相似性;抽象语法树(ast)分析,基于代码的结构和语法进行比较;程序依赖图(pdg),分析代码的控制流和数据流以识别逻辑结构;以及机器学习,利用深度学习等技术识别代码模式和结构,从而发现更深层次的相似性。
3、在代码查重领域,尽管已有多种技术被用来识别源代码中的相似或重复片段,但这些技术仍然存在一些显著的局限性。传统的代码查重系统常常难以捕捉代码的复杂结构差异和执行顺序的微小变化,例如代码片段的简单重新排列,就可能使这些系统无法正确识别抄袭。基于文本相似度的算法,尽管操作简单直接,但它们对代码的格式和注释非常敏感,容易受到表面文本改动的影响,从而降低了查重的效果。这类算法往往忽视了
技术实现思路
1、针对现有技术中的上述不足,本专利技术提供的基于深度学习的双图代码查重方法及其系统解决了现有技术难以准确识别代码结构上的细微差异,致使查重准确度不高的问题。
2、为了达到上述专利技术目的,本专利技术采用的技术方案为:
3、第一方面,提供一种基于深度学习的双图代码查重方法,其包括步骤:
4、s1、将待检测源代码和目标源代码分别输入解析器转化为抽象语法树,根据抽象语法树分别构建检测源代码和目标源代码的网络图;
5、s2、赋予两个网络图中的每个节点一个初始嵌入向量,并将初始嵌入向量输入已训练的gnn,经过k层消息传递后,得到每个节点的k层嵌入向量;
6、s3、根据待检测源代码和目标源代码对应的所有节点的k层嵌入向量,计算待检测源代码和目标源代码的结构嵌入向量;
7、s4、赋予两个网络图中的每个节点一个初始向量,并将初始向量输入已训练的rnn,通过递归的隐层状态更新生成最后一个节点的顺序嵌入表示;
8、s5、根据结构嵌入向量和顺序嵌入表示,通过注意力机制对源代码的结构和顺序进行融合,得到待检测源代码和目标源代码的全局向量;
9、s6、根据待检测源代码和目标源代码的全局向量,计算待检测源代码和目标源代码的相似度;
10、s7、判断待检测源代码和目标源代码的相似度是否小于相似度阈值,若是,则两段源代码重复度高,否则两段源代码重复度低。
11、进一步地,相似度阈值的计算方法包括:
12、s71、选取待检测源代码或目标源代码作为锚点,计算锚点与代码数据库中的所有源代码的相似度,并进行降序排序;
13、s72、选取排名靠前预设数量的相似度对应的源代码作为锚点的正样本,选取排名靠后预设数量的相似度对应的源代码作为锚点的负样本;
14、s73、将锚点、正样本和负样本输入神经网络进行训练,并采用三元组损失函数bpr作为神经网络的损失函数,训练完成后,输出相似度阈值。
15、进一步地,三元组损失函数bpr的表达式为:
16、
17、其中,为损失值;为锚点与正样本之间的相似度;为锚点与负样本之间的相似度;dθ为相似度阈值;σ为激活函数,用于将输入的值映射到0到1之间的数值;λ为超参数;为锚点的全局向量;为l2范数的平方。
18、进一步地,步骤s5进一步包括:
19、s51、根据结构嵌入向量和顺序嵌入表示,通过注意力机制得到待检测源代码和目标源代码权衡结构信息和顺序信息的结构权重和顺序权重:
20、
21、
22、其中,和分别为源代码m的结构权重和顺序权重,m=i和j,当m=i时,表示待检测源代码,m=j时,表示目标源代码;为待学习的权重矩阵;为拼接操作;为偏置项;为softmax激活函数;和分别为源代码m对应的结构嵌入向量和顺序嵌入表示;
23、s52、根据结构嵌入向量和顺序嵌入表示及结构权重和顺序权重,对结构和顺序信息进行加权,融合得到待检测源代码和目标源代码的全局向量:
24、
25、其中,为全局向量。
26、进一步地,计算待检测源代码和目标源代码的相似度的表达式为:
27、
28、其中,为待检测源代码和目标源代码的相似度;为待检测源代码的全局向量;为目标源代码的全局向量;为l2范数。
29、进一步地,节点的k层嵌入向量的表达式为:
30、
31、其中,为源代码m的节点q通过第k层传递得到的k层嵌入向量;m=i和j,当m=i时,表示待检测源代码,m=j时,表示目标源代码;为源代码m的节点q通过第k-1传递得到的k-1层嵌入向量;为与源代码m的节点q直接连接的节点p通过第k-1层传递得到的k-1层嵌入向量;dq,m为源代码m的节点q的度;dp,m为源代码m的节点p的度;vp为与源代码m的节点q直接连接的节点集合;
32、结构嵌入向量的表达式为:
33、
34、其中,t为源代码m包括的节点总数量;为源代码m的结构嵌入向量。
35、进一步地,步骤s4进一步包括:
36、赋予网络图中的每个节点一个初始向量:
37、
38、其中,xm为源代码m的所有节点的初始向量集合;m=i和j,当m=i时,表示待检测源代码,m=j时,表示目标源代码;、和分别为源代码m的第1个、第2个和第t个节点的初始向量;
39、将初始向量集合中的每个初始向量按顺序输入已训练的rnn,通过递归的隐层状态更新生成最后一个节点的顺序嵌入表示ht;
40、每个节点的顺序嵌入表示的表达式为:
41、
42、其中,为源代码m的第t个节点的顺序嵌入表示,1≤t≤t;为源代码m的第t个节点的初始向量;为源代码m的第t-1个节点的顺序嵌入表示;wh和wx分别为rnn对隐层状态和输入的权重矩阵;b为rnn的偏置项;relu为激活函数。
43、进一步地,检测源代码和目标源代码的网络图的构建方法为:提取抽象语法树中的函数、类和控制结构作为节点,节点之间的调用关系作为边,得到检测源代码和目标源代码对应的本文档来自技高网...
【技术保护点】
1.基于深度学习的双图代码查重方法,其特征在于,包括步骤:
2.根据权利要求1所述的基于深度学习的双图代码查重方法,其特征在于,相似度阈值的计算方法包括:
3.根据权利要求2所述的基于深度学习的双图代码查重方法,其特征在于,三元组损失函数BPR的表达式为:
4.根据权利要求1所述的基于深度学习的双图代码查重方法,其特征在于,步骤S5进一步包括:
5.根据权利要求4所述的基于深度学习的双图代码查重方法,其特征在于,计算待检测源代码和目标源代码的相似度的表达式为:
6.根据权利要求1所述的基于深度学习的双图代码查重方法,其特征在于,节点的k层嵌入向量的表达式为:
7.根据权利要求1所述的基于深度学习的双图代码查重方法,其特征在于,步骤S4进一步包括:
8.根据权利要求1所述的基于深度学习的双图代码查重方法,其特征在于,检测源代码和目标源代码的网络图的构建方法为:提取抽象语法树中的函数、类和控制结构作为节点,节点之间的调用关系作为边,得到检测源代码和目标源代码对应的网络图。
9.根据权利要求
10.一种应用于权利要求1-9任一所述的基于深度学习的双图代码查重方法的系统,其特征在于,包括:
...【技术特征摘要】
1.基于深度学习的双图代码查重方法,其特征在于,包括步骤:
2.根据权利要求1所述的基于深度学习的双图代码查重方法,其特征在于,相似度阈值的计算方法包括:
3.根据权利要求2所述的基于深度学习的双图代码查重方法,其特征在于,三元组损失函数bpr的表达式为:
4.根据权利要求1所述的基于深度学习的双图代码查重方法,其特征在于,步骤s5进一步包括:
5.根据权利要求4所述的基于深度学习的双图代码查重方法,其特征在于,计算待检测源代码和目标源代码的相似度的表达式为:
6.根据权利要求1所述的基于深度学习的双图代码查重方法,其特征在于,节点的k层嵌入向量的表达式为:
7.根据权利要求1所述的基于深度学习的双...
【专利技术属性】
技术研发人员:甘海东,杨皓文,俞成儒,刘康杰,须薇晗,杨舒棋,曾芸枫,周建,
申请(专利权)人:西南石油大学,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。