1.一种基于序列结构的程序代码聚类方法,其特征在于,包括:步骤1,基于序列结构计算不同程序代码间任意两函数的相似度;
步骤2,根据所述两函数的相似度计算任意两程序代码的相似度;
步骤3,根据所述两程序代码的相似度计算任意两程序代码的距离;由全部程序代码两两之间的距离构建距离方阵;
步骤4,根据所述距离方阵使用凝聚型层次聚类算法对整个程序代码样本空间进行聚类分析。
2.根据权利要求1所述的基于序列结构的程序代码聚类方法,其特征在于,所述步骤1,包括:步骤1.1,去除程序代码注释;去除程序代码中控制台输入输出函数名、运算符号和变量类型;
步骤1.2,计算一个函数中每一个变量的相对位置数值序列;其中,变量的相对位置为同一变量在该函数中相邻位置之差,由变量的相对位置有序形成的序列为变量的相对位置序列;
步骤1.3,基于Levenshtein距离,计算两个函数间任意两个字符的相似度;字符相似度公式如下所示:Sim(S1,S2)=1-Dis(S1,S2)/max(|S1|,|S2|) (1)其中,(S1,S2)为两变量相对位置序列,Dis(S1,S2)为两序列的编辑距离,max(|S1|,|S2|)为两序列间长度的最大值;
步骤1.4,在两函数之间,求出使得相似度和最大的一组字符对;包括:字符对对数为两函数经步骤1.2处理后所含有字符数的较小值,且任意一个字符最多只能出现一次;
将所求出的最大相似度和除以字符对对数,获得不同程序代码间两个函数的相似度Simf。
3.根据权利要求1所述的基于序列结构的程序代码聚类方法,其特征在于,所述步骤2,包括:假设程序代码Wa包括F1,F2,...,Fm(1≤m)个函数块,程序代码Wb包括F1,F2,...,Fn(1≤n)个函数块;则由步骤1求得两程序代码间任意两函数的相似度;
步骤2.1,找出使得两程序代码之间函数相似度之和最大的一组函数对;求解过程规则如下:获得函数对对数N;其中,N为两程序代码中函数数目的较小值min(n,m),任意两对函数间不包括重复函数块;
步骤2.2,计算两份程序代码的相似度;由步骤2.1可求得使两程序代码之间函数相似度之和最大的N对函数对,其相似度记为sim1,sim2,...,simN;求得每一对函数对中两函数块经步骤1.1处理后字符数目和为l1,l2,...,lN;求得程序代码Wa与程序代码Wb经步骤1.1处理后字符总数目和为la,b,则由如下公式(2)可求得程序代码Wa与Wb的相似度Sima,b:。
4.根据权利要求3所述的基于序列结构的程序代码聚类方法,其特征在于,所述任意两程序代码的距离的计算方式如下:Da,b=(1-Sima,b)×100 (3)
其中,Da,b表示程序代码Wa与Wb的距离。
5.根据权利要求1所述的基于序列结构的程序代码聚类方法,其特征在于,所述步骤4,包括:步骤4.1,根据输入的距离方阵求出语法格式有误的代码作为无效点,此类代码在距离方阵中,与除自身外的其它代码的距离全为100;
步骤4.2,根据输入的距离方阵计算所有有效数据样本的平均距离avgDis;
步骤4.3,开始采用均链接方法的层次聚类,均链接的方法是在每一次聚类过程中,将簇与簇之间平均距离最小的两个簇归为一簇,求出距离方阵中最小平均距离所在行列;
步骤4.4,设置聚类终止条件:判断任意簇簇内距离是否大于avgDis,若否,直接进行步骤4.5;若是,判断最小平均距离所在行列的两个样本所在的簇是否都满足簇内元素数目小于等于2,若满足则进行步骤4.5,否则计算此时这两个簇的簇内距离方差和var与两个簇所有元素间距离的方差newvar,若newvar的值大于var,则整个聚类算法终止,否则进行步骤
4.5;
步骤4.5,将最小平均距离所在行列对应样本所在的簇归为一簇;
步骤4.6,求此时簇与簇之间平均距离,更新存储着样本间两两距离的距离方阵;
步骤4.7,重复步骤4.3到4.6步直到聚类终止。