技术领域
本发明涉及计算机程序设计代码检测的技术领域,尤其是指一种基于伪孪生网络的多语言代码剽窃检测方法。
背景技术
互联网的发展使得通过网络获取源代码变的越来越容易,也带来了代码剽窃问题。因此,源代码剽窃检测技术被越来越多的学者研究,而代码剽窃检测在当前计算机程序设计类课程的教学中也有重要的应用,近年来,已经出现了许多代码剽窃检测的方法。现有的代码剽窃检测方法主要用于检测同种语言代码之间的相似性,而不同编程语言之间的语法差异使得这些方法并不适用于检测不同语言代码之间的相似度;在多语言代码剽窃检测方面,主要包括基于中间特征和基于机器学习的两类多语言代码剽窃检测方法。其中基于中间特征的多语言代码剽窃检测方法通常将两段不同语言编写的源代码转换为相同的中间表示,进而将多语言剽窃检测问题转换为同种语言剽窃检测;基于机器学习的多语言代码剽窃检测方法通常将源代码转化为标记序列,然后为每个标记序列赋予一个向量表示,进而通过一些机器学习方法将多语言代码剽窃的检测问题转换为二分类问题。两种方法中,基于机器学习的方法在模型训练完成之后具有更好的检测速度和效果,然而,现有的基于机器学习的大多数方法只是将代码作为文本来处理,很少考虑代码的结构特征,且易受更改语句顺序、等价结构替换等混淆手段的影响,其检测效果比考虑代码结构特征的机器学习方法要差,并且极易受到冗余代码的影响导致检测准确率的下降。因此迫切需要一种考虑代码结构特征的多语言代码剽窃检测方法,实现多语言代码剽窃检测,并可以提高代码剽窃检测的效率和精度。
发明内容
本发明的目的在于克服现有技术的缺点与不足,提出了一种基于伪孪生网络的多语言代码剽窃检测方法,可突破现有多语言代码剽窃检测方法未考虑代码的结构特征与极易受到冗余代码影响的问题。
为实现上述目的,本发明所提供的技术方案为:一种基于伪孪生网络的多语言代码剽窃检测方法,包括以下步骤:
1)获取基础数据,采用开源数据集,包含预训练数据集和多语言代码剽窃检测训练数据集;
2)针对预训练数据集,基于抽象语法树的skip-gram算法对词向量进行预训练,获得精确的标记向量;
3)对多语言代码剽窃检测训练数据集进行预处理,删除冗余代码,并转化为抽象语法树,通过一个基于属性度量的过滤器,计算代码相似度并与阈值相比较,以初步判断代码是否剽窃,若计算结果低于既定阈值,则判断代码为非剽窃,若计算结果大于既定阈值,则执行步骤4)以进一步判断代码是否剽窃;
4)对多语言代码剽窃检测训练数据集中需要进一步判断是否剽窃的代码进行处理,以形成不同语言代码对应的嵌入矩阵,并送入伪孪生网络,通过伪孪生网络中最后的激活函数与设定的阈值比较,大于该阈值则判定为剽窃,否则为非剽窃;其中,所述伪孪生网络是孪生网络的变体,它们同样具有两个输入、两个神经网络和一个激活函数,但孪生网络的两个神经网络的权值是共享的,只适用于处理来自统一领域且在结构上有高相似度的数据,而伪孪生网络的两个神经网络的权值是非共享的,能够处理具有差别性的数据,即能够处理不同语言的代码。
在步骤1)中,所述预训练数据集包含不同语言的开源代码;所述多语言代码剽窃检测训练数据集包含不同语言的开源代码。
所述步骤2)包括以下步骤:
2.1)将预训练数据集中所有代码转换为抽象语法树;
2.2)深度优先遍历每个抽象语法树,并统计抽象语法树中节点出现的次数,每个节点的命名规则为:如果抽象语法树中的节点只有节点类型,没有节点标识,则以节点类型作为节点的名字,如果既有节点类型又有节点标识,则将节点命名为“节点类型_节点标识”;
2.3)统计完毕后按照频次从高到低将节点名称进行排序,选取频次最高的若干个节点名字外加“unknow”标记作为词汇表;
2.4)通过词汇表和抽象语法树集合构建Skip-gram算法的输入,对词向量进行预训练,获得较精确的标记向量。
其中,所述Skip-gram算法是word2vec算法的一种,其核心思想是通过上下文来推断中心词;而所述Word2vec是一群用来产生词向量的相关模型。
所述步骤3)包括以下步骤:
3.1)基于程序依赖图对多语言代码剽窃检测训练数据集中的冗余代码进行删除;
3.2)将删除冗余代码的多语言代码剽窃检测训练数据集转化为抽象语法树;
3.3)基于步骤3.2)得到的抽象语法树通过一个基于属性度量的过滤器提取代码的变量声明数量、参数数量、运算对象数量、抛出异常数量、圈复杂度、运算符总数、表达式数量、循环数量和异常引用数量;
3.4)利用余弦相似度初步计算两段代码的相似度,若计算结果低于既定阈值,则判定代码为非剽窃并结束检测过程;若计算结果大于既定阈值,则进一步判断代码是否剽窃。
所述步骤4)包括以下步骤:
4.1)将相似度大于阈值的代码通过深度遍历代码的抽象语法树形成表示代码的标记序列;
4.2)将标记序列的每个标记都用步骤2)中预训练好的标记向量来替换,使得不同语言的代码分别形成对应的嵌入矩阵;
4.3)将步骤4.2)所得的不同的嵌入矩阵分别作为伪孪生网络的两个输入,并分别经过一个神经网络,即一个输入对应一个神经网络,最终通过一个激活函数得到一个计算值,再将该计算值与设定的阈值相比较,若大于该阈值则判定为剽窃,否则为非剽窃;其中,所述激活函数是Softmax函数。
所述神经网络为由卷积神经网络、双向长短期记忆人工神经网络和新型注意力神经网络组成的深度学习神经网络,其对嵌入矩阵的处理具体如下:
首先,通过卷积神经网络的卷积层、池化层对嵌入矩阵进行局部特征提取;然后以提取的局部特征作为双向长短期记忆人工神经网络的输入,对当前输入的局部特征的上下文信息进行特征提取,同时保留重要的信息,遗忘不重要的信息;最后,使用新型注意力神经网络表示序列中标记与输出结果的相关性,对向量分配不同的权重以区分序列中标记特征的重要性大小,提高分类的准确性;
其中,所述双向长短期记忆人工神经网络是由正向长短期记忆人工神经网络和反向长短期记忆人工神经网络组成,能够从正向和反向同时对数据进行特征提取;所述新型注意力神经网络是一种基于自注意力机制的新型神经网络,通过编码组件和解码组件完成文本到文本之间的转换。
本发明与现有技术相比,具有如下优点与有益效果:
1、本发明在代码剽窃检测方法层面,首次结合代码的抽象语法树的结构特征,突破了现有代码剽窃检测方法未考虑代码结构特征的局限性。
2、本发明首次提出基于程序依赖图,对代码中的冗余代码进行删除,突破现有代码剽窃检测方法易受冗余代码影响的问题。
3、本发明首次提出了一个基于属性度量的过滤器,更有利于提高检测代码剽窃的精度,提高训练模型的检测效率,降低非剽窃代码对检测效率的影响。
4、本发明首次基于伪孪生网络,且该伪孪生网络嵌入卷积神经网络、长短期记忆人工神经网络和新型注意力神经网络三种集成在一起的深度学习神经网络,提出了一个新的多语言代码剽窃检测方式,更有利于代码剽窃检测时准确率的提高。
5、本发明方法在多语言代码剽窃检测上具有广泛的使用空间,在代码剽窃检测方法应用上有广阔前景。
附图说明
图1为本发明逻辑流程示意图。
图2为预训练示意图。
图3为基于伪孪生网络进一步判断是否剽窃过程图。
图4为伪孪生网络中嵌入的卷积神经网络、长短期记忆人工神经网络和新型注意力神经网络细节示意图。
图5为实验结果对比图。
具体实施方式
下面结合具体实施例对本发明作进一步说明。
如图1所示,本实施例所提供的基于伪孪生网络的多语言代码剽窃检测方法,对预训练数据进行预训练以获得精确的标记向量,对多语言代码剽窃检测训练数据集的训练集进行冗余处理,转换成抽象语法树并初步判断代码是否剽窃,再将需要进一步判断是否剽窃的数据集,通过深度遍历代码的抽象语法树形成表示代码的标记序列,并将标记序列的每个序列都用预训练好的标记向量来替换,形成嵌入矩阵,再通过伪孪生网络进一步检测判断代码是否剽窃,其包括以下步骤:
1)获取基础数据,采用开源数据集,包含预训练数据集和多语言代码剽窃检测训练数据集;其中所述预训练数据集包含不同语言的开源代码;所述多语言代码剽窃检测训练数据集包含不同语言的开源代码。
在本步骤中,以Java代码和Python代码为例,采用开源数据集,其中预训练数据集中Java代码是Apache的开源代码,Python代码是从GitHub上下载的Python项目;多语言代码剽窃检测训练数据集源于一个公开的编程竞赛网站:https://atcoder.jp。
2)针对预训练数据集,基于抽象语法树的skip-gram算法对词向量进行预训练,获得精确的标记向量,具体操作过程如下:
2.1)将预训练数据集中所有代码转换为抽象语法树;
2.2)深度优先遍历每个抽象语法树,并统计抽象语法树中节点出现的次数,每个节点的命名规则为:如果抽象语法树中的节点只有节点类型,没有节点标识,则以节点类型作为节点的名字,如果既有节点类型又有节点标识,则将节点命名为“节点类型_节点标识”;
2.3)统计完毕后按照频次从高到低将节点名称进行排序,选取频次最高的若干个节点名字外加“unknow”标记作为词汇表;
2.4)通过词汇表和抽象语法树集合构建Skip-gram算法的输入,对词向量进行预训练,获得精确的标记向量。
其中,所述Skip-gram算法是word2vec算法的一种,其核心思想是通过上下文来推断中心词;而所述Word2vec是一群用来产生词向量的相关模型。
对预训练数据集进行预处理,对词向量进行预训练,获得精确的标记向量过程如图2所示;本案例中将多语言代码剽窃检测训练数据集,以特定比例拆分为训练集和测试集,将多语言代码剽窃检测训练数据集中的80%用于训练嵌入伪孪生网络中的深度学习网络模型,是训练集;剩余的20%是测试集,用于测试本方法与其它方法相比的优越性。
3)对多语言代码剽窃检测训练数据集进行预处理,删除冗余代码,并转化为抽象语法树,通过一个基于属性度量的过滤器,计算代码相似度并与阈值相比较,以初步判断代码是否剽窃,若计算结果低于既定阈值,则判断代码为非剽窃,若计算结果大于既定阈值,则执行步骤4)以进一步判断代码是否剽窃,具体步骤如下:
3.1)基于程序依赖图对多语言代码剽窃检测训练数据集中的冗余代码进行删除;
3.2)将删除冗余代码的多语言代码剽窃检测训练数据集转化为抽象语法树;
3.3)基于步骤3.2)得到的抽象语法树通过基于一个属性度量的过滤器提取代码的变量声明数量、参数数量、运算对象数量、抛出异常数量、圈复杂度、运算符总数、表达式数量、循环数量和异常引用数量;
3.4)利用余弦相似度初步计算两段代码的相似度,若计算结果低于既定阈值,则判定代码为非剽窃并结束检测过程;若计算结果大于既定阈值,则进一步判断代码是否剽窃。
4)对多语言代码剽窃检测训练数据集中需要进一步判断是否剽窃的代码进行处理,以形成不同语言代码对应的嵌入矩阵,并送入伪孪生网络,通过伪孪生网络中最后的激活函数与设定的阈值比较,大于该阈值则判定为剽窃,否则为非剽窃;其中,所述伪孪生网络是孪生网络的变体,它们同样具有两个输入、两个神经网络和一个激活函数,但孪生网络的两个神经网络的权值是共享的,只适用于处理来自统一领域且在结构上有高相似度的数据,而伪孪生网络的两个神经网络的权值是非共享的,能够处理具有差别性的数据,即能够处理不同语言的代码,具体步骤如下:
4.1)将相似度大于阈值的代码通过深度遍历代码的抽象语法树形成表示代码的标记序列;
4.2)将标记序列的每个标记都用步骤2)中预训练好的标记向量来替换,使得不同语言的代码分别形成对应的嵌入矩阵;
4.3)将步骤4.2)所得的不同的嵌入矩阵分别作为伪孪生网络的两个输入,并分别经过一个神经网络,即一个输入对应一个神经网络,最终通过一个激活函数得到一个计算值,再将该计算值与设定的阈值相比较,若大于该阈值则判定为剽窃,否则为非剽窃;其中,所述激活函数是Softmax函数。
本步骤中基于伪孪生网络进一步判断代码是否剽窃的过程如图3所示。
所述神经网络为由卷积神经网络、双向长短期记忆人工神经网络和新型注意力神经网络组成的深度学习神经网络,其对嵌入矩阵的处理具体如下:
首先,通过卷积神经网络的卷积层、池化层对嵌入矩阵进行局部特征提取;然后以提取的局部特征作为双向长短期记忆人工神经网络的输入,对当前输入的局部特征的上下文信息进行特征提取,同时保留重要的信息,遗忘不重要的信息;最后,使用新型注意力神经网络表示序列中标记与输出结果的相关性,对向量分配不同的权重以区分序列中标记特征的重要性大小,提高分类的准确性;
其中,所述双向长短期记忆人工神经网络是由正向长短期记忆人工神经网络和反向长短期记忆人工神经网络组成,能够从正向和反向同时对数据进行特征提取;所述新型注意力神经网络是一种基于自注意力机制的新型神经网络,通过编码组件和解码组件完成文本到文本之间的转换。
本步骤中所述深度学习神经网络的细节如图4所示。
在此实施例中,使用测试集对所述方法与其他方法进行测试,如图5所示,与其它已有方法相比,包括LICCA、CLCDSA、DeSoCoRe、ASTLearner,本文所提方法,简称CLPDetecter,如图5中最右边的一组实验结果所示,在三种评估方法中的评估值都有明显优势,三种评估方法包括Precision、Recall、F1-Measure。
综上所述,在采用以上方案后,本发明基于伪孪生网络为多语言的代码剽窃检测提供了新的方法,将基于伪孪生网络的多语言代码剽窃检测方法作为多语言代码剽窃检测的一种有效手段,能够有效突破现有多语言代码检测方法不能结合代码结构特征,与易受冗余代码影响的问题,有效推动了多语言代码剽窃检测技术的发展,具有实际应用价值,值得推广。
以上所述实施例只为本发明之较佳实施例,并非以此限制本发明的实施范围,故凡依本发明之形状、原理所作的变化,均应涵盖在本发明的保护范围内。
机译: 基于网络的系统和基于网络的恶意代码检测方法
机译: 可用设备,例如打印机,一种计算机的访问提供方法,包括基于设备代码通过网络在计算机和可用设备之间建立连接,以及基于设备代码在计算机上安装设备驱动程序
机译: 基于义务积分项目分类代码的产品需求/供应连接网络服务方法以及一种能够基于用户需求的物品供应系统来提供需求/供应连接网络的系统