1.一种基于树和序列相似度的编程语言代码查重方法,其特征在于,包括:步骤1,去除代码中干扰相似度准确性的信息,将原程序中的代码转换成变量序列;
步骤2,按照程序结构,构建程序结构树,建立结构树的叶节点;
步骤3,建立叶节点中变量的绝对位置序列集合;
步骤4,比较叶节点,获得两叶节点间的相似度;
步骤5,比较两份程序代码所有的叶节点,获得两程序代码间的相似度。
2.根据权利要求1所述的基于树和序列相似度的编程语言代码查重方法,其特征在于,所述步骤1,包括:去除程序代码注释;
去除程序代码中输出语句中的字符串;
去除程序代码中控制台输入输出函数名和运算符号。
3.根据权利要求1所述的基于树和序列相似度的编程语言代码查重方法,其特征在于,所述步骤3,包括:统计叶节点内不同变量出现的个数;
根据每个变量出现的位置创建位置序列,获得变量位置序列集合;对叶节点中的变量做比较时,只比较变量的位置关系,不比较变量名称,对变量的位置序列进行序列分析,按照变量出现的顺序,获取变量的绝对位置序列。
4.根据权利要求1所述的基于树和序列相似度的编程语言代码查重方法,其特征在于,所述步骤4,包括:步骤4.1,获得变量的相对位置序列;
步骤4.2,基于Levenshtein距离,计算出不同序列间的相似度,求得相似度矩阵;
步骤4.3,依据变量间的相似度矩阵,求出叶节点的相似度。
5.根据权利要求4所述的基于树和序列相似度的编程语言代码查重方法,其特征在于,不同序列间的相似度计算方法如下公式(1):Sim(L1,L2)=1-Leve(L1,L2)/max(|L1|,|L2|) (1)其中,(L1,L2)表示两变量相对位置序列,Leve(L1,L2)表示两序列的Levenshtein距离,max(|L1|,|L2|)表示两序列间的最大长度;
求得n*m相似度矩阵,其中n和m分别为两个叶节点变量的个数,矩阵元素记录了一组匹配对象和匹配对象之间的相似度。
6.根据权利要求5所述的基于树和序列相似度的编程语言代码查重方法,其特征在于,所述依据变量间的相似度矩阵,求出叶节点的相似度,包括:将矩阵中的元素按照相似度由大到小排序,多次有序的取其中的一个元素e,记录其匹配对象x、y和相似度s,遍历其他元素并记录各个元素的匹配对象x’、y’和s’;若元素中的x’或y’已经记录,那么跳过该元素,否则s与s’求和赋值于s,并记录x’和y’,计算出最大的s值smax即为所求最大的相似度之和;并根据公式(2)计算出叶节点之间的相似度,如下:S=smax/max(m,n) (2)
其中,max(m,n)表示m和n最大的一个。
7.根据权利要求2所述的基于树和序列相似度的编程语言代码查重方法,其特征在于,所述控制台输入输出函数名,包括:printf、scanf、cin和cout。
8.根据权利要求2所述的基于树和序列相似度的编程语言代码查重方法,其特征在于,所述运算符号包括算术运算符、关系运算符和逻辑运算符。