首页 / 专利库 / 人工智能 / n元语法 / 一种基于序列结构的程序代码聚类方法

一种基于序列结构的程序代码聚类方法

阅读:1017发布:2020-07-13

专利汇可以提供一种基于序列结构的程序代码聚类方法专利检索,专利查询,专利分析的服务。并且本 发明 公开了一种基于序列结构的程序代码聚类方法,首以函数为单位,基于程序代码的序列结构计算一对样本,即两份程序代码之间的函数相似度;在此 基础 上,再计算出两份程序代码的相似度与距离;对任意一个样本空间,按上述步骤计算出任意两份程序代码的距离方阵后,采用凝聚型层次聚类的思想对数据进行 聚类分析 ,在聚类过程中无需凭借人工经验输入 阈值 ,而是通过样本数据的特征自动判断是否满足聚类终止条件,最终得到程序代码的聚类结果。本发明可用于程序代码的自动聚类,如高校编程类作业的聚类等提供依据。,下面是一种基于序列结构的程序代码聚类方法专利的具体信息内容。

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步直到聚类终止。

说明书全文

一种基于序列结构的程序代码聚类方法

技术领域

[0001] 本发明涉及数据分析及处理领域,特别涉及一种基于序列结构的程序代码聚类方法。

背景技术

[0002] 近年来,教育信息化的进程随着互联网+的快速推广而不断加快,在线教育与测试系统的出现为高校师生提供了一个方便快捷的作业布置与提交的平台。另一方面,各大高校对基础程序语言教学的重视逐渐提高,使之成为本科阶段必修课程之一。而在基础编程教学中,对于代码编程题的考察最能体现学生掌握编程技巧与思想的程度。
[0003] 程序语言与自然语言在适用领域上有明显差异,其语言虽然都有词法、语法规则等,但程序语言不会出现一词多义,一义多词的情况。程序语言只有固定的关键字,标识符编写规则,功能实现结构等,所以它的识别较于自然语言更容易一些。因此,国内外出现了一些比较成熟的对程序代码进行查重检测的系统,如使用比较广泛的Online Judge(OJ)系统。
[0004] 现有的对程序代码查重主要可以分为属性计数法和程序结构度量法两种方法。单方面只考虑属性计数而忽略程序的结构组成,得出的代码相似度比值准确率往往较低。并且,现有的代码查重系统都只关注于一对代码样本间的相似情况,而没有分析整个代码样本空间的分组情况,这样高校教师难以知道某次编程作业在整体分布上的学生完成的情况,无法知道该次编程作业有几种不同写法。

发明内容

[0005] 本发明的目的在于克服现有技术的不足,提出一种基于序列结构的程序代码聚类方法,通过对序列结构的分析计算任意一组代码之间的相似度,进而通过凝聚型层次聚类对整个代码样本空间进行聚类分析;在聚类过程中无需输入经验阈值,通过样本数据的特征自动判断是否满足终止条件,最终得到聚类结果,帮助高校教师发现编程作业的分组情况,了解学生在完成该次作业中所采用的不同写法情况。
[0006] 本发明的核心思想是首先基于序列结构计算任意两份代码的相似度,然后利用自动层次聚类的方法对代码进行分簇,并寻找出每一簇的聚类中心。
[0007] 本发明解决其技术问题所采用的技术方案是:
[0008] 步骤1,基于序列结构计算不同程序代码间任意两函数的相似度;
[0009] 步骤1.1,去除注释内容;去除代码中常见的函数名(如printf,scanf,cin,cout等),去除运算符号(算术运算符、关系运算符和逻辑运算符等)与变量类型等;
[0010] 步骤1.2,计算一个函数中每一个变量的相对位置数值序列。其中,变量的相对位置为同一变量在该函数中相邻位置之差,由变量的相对位置有序形成的序列为变量的相对位置序列;
[0011] 步骤1.3,基于编辑距离(Levenshtein距离),计算两个函数间任意两个字符的相似度,字符相似度公式(1)如下:
[0012] Sim(S1,S2)=1-Dis(S1,S2)/max(|S1|,|S2|)       (1)
[0013] 其中,(S1,S2)为两变量相对位置序列,Dis(S1,S2)为两序列的编辑距离,max(|S1|,|S2|)为两序列间长度的最大值;
[0014] 步骤1.4,在两函数之间,求出使得相似度和最大的一组字符对,求解规则如下:字符对对数为两函数经步骤1.2处理后所含有字符数的较小值,且任意一个字符最多只能出现一次。将所求出的最大相似度和除以字符对对数,即求得不同程序代码间两个函数的相似度Simf。
[0015] 步骤2,根据所述两函数的相似度计算任意两程序代码的相似度。
[0016] 假设程序代码Wa包括F1,F2,...,Fm(1≤m)个函数,程序代码Wb包括F1,F2,...,Fn(1≤n)个函数块;则由步骤1可以求得两程序代码间任意两函数的相似度。
[0017] 步骤2.1,找出使得两程序代码之间函数相似度之和最大的一组函数对。求解过程规则如下:函数对对数等于N,N为两程序代码中函数数目的较小值min(n,m);任意两对函数间不包括重复函数块。
[0018] 步骤2.2,计算两份程序代码的相似度。由步骤2.1可求得使两程序代码之间函数相似度之和最大的N对函数对,其相似度记为sim1,sim2,...,simN;求得每一对函数对中两函数块经步骤1.1处理后字符数目和为l1,l2,...,lN;求得程序代码Wa与程序代码Wb经步骤1.1处理后字符总数目和为la,b。则由如下公式(2)可求得程序代码Wa与Wb的相似度Sima,b:
[0019]
[0020] 步骤3,根据所述两程序代码的相似度计算任意两程序代码的距离;由全部程序代码两两之间的距离构建距离方阵。
[0021] 对于聚类算法,将采用存储任意两个样本间距离度量值的距离方阵作为输入参数。由公式(3)可以求得程序代码Wa与Wb的距离度量值Da,b:
[0022] Da,b=(1-Sima,b)×100        (3)
[0023] 进一步的,根据步骤2的方法计算出全部程序代码两两之间的相似度,根据步骤3的方法计算出全部程序代码两两之间的距离,构建出距离方阵。
[0024] 步骤4,根据所述距离方阵使用凝聚型层次聚类算法对整个程序代码样本空间进行聚类分析。
[0025] 对于两份程序代码而言,两样本间的距离越小,表明两份程序代码之间的关系越密切,两份程序代码属于同一种求解方法的可能性越高,反之则越低。因此,需要对整个程序代码样本空间进行聚类分析。
[0026] 本发明将求解该步骤使用算法为凝聚型层次聚类算法,如表1所示,该算法的输入输出参数分别如下:
[0027] 输入:数据集X
[0028] 输出:聚类结果C
[0029] 算法包括以下步骤:
[0030] 步骤4.1,通过输入的距离方阵求出无效点(语法格式有误的代码),此类代码在距离方阵中,与除自身外与其它代码的距离全为100;
[0031] 步骤4.2,通过输入距离方阵计算所有有效数据样本的平均距离avgDis;
[0032] 步骤4.3,开始基于均链接的层次聚类(即每一次聚类过程中将簇与簇之间平均距离最小的两个簇归为一簇),求出距离方阵中最小平均距离所在行列;
[0033] 步骤4.4,设置聚类终止条件:判断任意簇簇内距离是否大于avgDis,若否,直接进行步骤4.5;若是,判断最小平均距离所在行列的两个样本所在的簇是否都满足簇内元素数目小于等于2,若满足则进行步骤4.5,否则计算此时这两个簇的簇内距离方差和var与两个簇所有元素间距离的方差newvar,若newvar的值大于var,则整个聚类算法终止,否则进行步骤4.5;
[0034] 步骤4.5,将最小平均距离所在行列对应样本所在的簇归为一簇;
[0035] 步骤4.6,求此时簇与簇之间平均距离,更新距离方阵。
[0036] 步骤4.7、循环执行4.3到4.6步直到聚类终止。
[0037] 表1
[0038]
[0039]
[0040] 本发明具有如下有益效果:
[0041] 本发明方法考虑了程序代码整体间的关联关系,进而帮助高校教师发现编程代码作业的分簇情况,了解学生在完成该次作业中采用的不同写法情况。
[0042] 以下结合附图实施例对本发明作进一步详细说明,但本发明的一种基于序列结构的程序代码聚类方法不局限于实施例。

附图说明

[0043] 图1为本发明实施例的基于序列结构的程序代码聚类方法的流程图
[0044] 图2为本发明实施例一次c语言编程练习代码实例聚类树状图。

具体实施方式

[0045] 以下结合附图描述本发明的一个c语言编程练习程序代码。在本实施例中,共有45份由学生提交的程序代码,分别为W1、W2、…、W45。本实施例通过程序代码查重与聚类过程,验证本发明的基于序列结构的程序代码聚类方法,本实施例一种基于序列结构的程序代码聚类方法执行流程图参见图1所示,包括:
[0046] 步骤1,计算两份程序代码之间两个函数的相似度。
[0047] 程序代码W1包括(F11,F12,F13)三个函数块;W3包括(F21,F22,F23,F24)四个函数块。其中函数块F11与F21如表2所示。
[0048] 表2
[0049]
[0050]
[0051] 去除程序中的注释内容,控制台信息、运算符等信息,给出处理后的结果,如表3所示。计算出两函数块中各个字符的绝对位置序列和相对位置序列,如表4所示。在得到两函数块各个字符相对位置序列后,通过公式(1)计算得到两函数块间各字符两两相似度,其值如表5与表6所示,并以此求得函数块F11与F21的相似度0.7321。
[0052] 依此,可求得程序代码W1与W3中函数块间的两两相似度如表7所示。
[0053] 表3
[0054]
[0055] 表4
[0056]
[0057]
[0058] 表5
[0059]  max get A char int a return 0 32
char 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0
A 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0
int 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.125 0.0
A 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0
return 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0
countOfLetter 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.375 0.0
countOfWord 0.2 0.0 0.0 0.0 0.0 0.0 0.0 0.375 0.0
getchar 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0
0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.125 0.0
length 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0
countOfDigit 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.125 0.0
} 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0
9 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0
ch 0.3 0.0 0.0 0.0 0.0 0.0 0.0 0.4 0.0
{ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0
z 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0
Z 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0
[0060] 表6
[0061]  9 word } { z sz zm Z jz
char 1.0 0.0 0.0 0.0 0.0 1.0 0.25 0.1 1.0
A 1.0 0.0 0.0 0.0 0.0 1.0 0.25 0.1 1.0
int 0.0 0.286 0.0 0.2 0.25 0.0 0.25 0.0 0.0
A 1.0 0.0 0.0 0.0 0.0 1.0 0.25 0.1 1.0
return 1.0 0.0 0.0 0.0 0.0 1.0 0.25 0.1 1.0
countOfLetter 0.0 0.143 0.2 0.4 0.5 0.0 0.25 0.1 0.0
countOfWord 0.0 0.429 0.4 0.2 0.4 0.0 0.2 0.2 0.0
getchar 1.0 0.0 0.0 0.0 0.0 1.0 0.25 0.1 1.0
0 0.0 0.125 0.375 0.125 0.125 0.0 0.25 0.0 0.0
length 0.0 0.143 0.2 0.6 0.25 0.0 0.25 0.1 0.0
countOfDigit 0.0 0.143 0.4 0.2 0.25 0.0 0.25 0.1 0.0
} 1.0 0.0 0.0 0.0 0.0 1.0 0.25 0.1 1.0
9 1.0 0.0 0.0 0.0 0.0 1.0 0.25 0.1 1.0
ch 0.0 0.4 0.0 0.1 0.3 0.0 0.1 0.5 0.0
{ 1.0 0.0 0.0 0.0 0.0 1.0 0.25 0.1 1.0
z 1.0 0.0 0.0 0.0 0.0 1.0 0.25 0.1 1.0
Z 1.0 0.0 0.0 0.0 0.0 1.0 0.25 0.1 1.0
[0062] 表7
[0063]  F21 F22 F23 F24
F11 0.7321 0.3734 0.5327 0.4573
F12 0.3245 0.4873 0.6833 0.7146
F13 0.4365 0.5725 0.6392 0.8214
[0064] 步骤2,计算两份程序代码的相似度。
[0065] 以程序代码W1和W3为例,在求得如表7所示的函数块两两相似度后,求出最大相似度之和,本例中函数对{F11,F22}、{F12,F23}、{F13,F24}的相似度分别为0.7321、0.6833、0.8214,其和2.2368为满足要求的最大相似度之和。统计这三对函数对经过步骤1.1处理后的字符个数分别为100、39、24;统计程序代码W1和W3经过步骤1.1处理后的总字符个数和为
169。代入公式(2)求得程序代码W1和W3的相似度为0.7075。
[0066] 步骤3,计算两份程序代码的距离。
[0067] 以程序代码W1和W3为例,将其相似度代入公式(3)可得其距离为29.25。
[0068] 依此,可求得全部程序代码两两之间的初始距离,如表8、表9、表10与表11所示。
[0069] 表8
[0070]
[0071]
[0072] 表9
[0073]
[0074]
[0075] 表10
[0076]
[0077]
[0078] 表11
[0079]
[0080]
[0081] 步骤4,进行凝聚型层次聚类。
[0082] 首先通过初始距离方阵判断是否存在括号不匹配的无效程序代码,此类代码在距离方阵中,与除自身外其它代码的距离全为100,本例中不存在无效程序代码。计算得到有效程序代码初始距离的平均值avgDis=50.85。
[0083] 开始均链接层次聚类,此时,程序代码W8和W14的距离值为0为最小平均距离,且该值小于50.85不满足迭代终止条件,因此将W8和W14归为一簇。更新平均距离方阵,W14所对应的行列设为max,W8所对应的行列值设为初始距离方阵中W8与W14所在行求平均值。
[0084] 至此,完成了本例的第一次迭代。
[0085] 在本实例中,迭代进行了33次后最小平均距离为52.90,大于50.85,因此进行下一步终止条件判断。此时,最小平均距离所对应的程序代码为W9与W15,这两份代码已经归入的簇对应为簇C2:{W9,W25,W40};簇C3:{W15,W16,W23,W29,W34,W35,W37,W30,W45}。计算得到此时簇C3内程序代码初始距离的方差var(C2)=116.76,簇C23内程序代码初始距离的方差var(C3)=140.33;簇C2与簇C3所有程序代码初始距离方差var(C2+C3)=165.65。因为var(C2)+var(C3)>var(C2+C3),所以不满足迭代终止条件,层次聚类继续进行。本实施例中,当迭代进行37次后满足终止条件,其聚类迭代过程参见图2所示,得到最终聚类结果如表12所示。
[0086] 表12
[0087]
[0088] 以上仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈