论文部分内容阅读
代码编程是高校计算机等相关专业的必备技能,但互联网技术的发展使得代码抄袭问题日益凸显,小到学生的编程作业大到软件产品都或多或少存在。抄袭对于学生来说既不利于他们的发展和成长,也不利于他们能力的提升,而对于软件企业来说抄袭可能涉及到侵权问题。现有的研究中,大多数的源代码抄袭检测方法是针对小数量的代码库文档进行的,而且常用一对一匹配的方法进行抄袭代码对检测,随着源码数量的日积月累,常用的一对一匹配的源码抄袭检测方法在时间效率上会比较低下且准确度没有太高。针对这些问题,本文提出了基于信息检索(Information retrieval,IR)和集成学习分类的代码抄袭检测方法,旨在提高代码抄袭检测的效率和准确率。本文将IR和集成学习结合用于代码抄袭检测,主要工作如下:(1)提出了基于代码的抽象语法树(Abstract syntax tree,AST)和代码的域划分来检索潜在抄袭代码对的方法,并且提出了一种针对低匹配得分的代码对进行过滤的机制。首先将代码进行预处理,删除代码噪声;然后对代码进行解析,解析成AST;接着基于IR的域的思想,遍历AST并提取相应的域信息;根据提出的得分函数,计算每个域中的词的得分,并在检索潜在抄袭代码时根据域匹配来计算代码对的匹配得分;最后根据阈值过滤掉匹配得分低的代码对,获得最终的潜在抄袭代码对集合。(2)提出了一种计算代码对的相似度特征值的混合相似度计算方法和基于Stacking对潜在抄袭代码对进行分类的方法。对于代码对的特征,从词汇特征、结构特征和代码风格特征三方面来进行提取,其中,在结构特征提取中利用提出的混合相似度计算方法计算结构特征相似度,其余特征的相似度利用对应的相似度计算公式实现,从而获得代码对的特征集。将已知分类的训练集的特征集合放入基于Stacking的集成分类器进行训练,然后将潜在抄袭代码对的特征集合放入训练好的分类器中进行预测,得到最终的分类结果。最终,经过实验对比分析,分别对两个阶段的实验结果进行总结。在检索阶段,与JPlag基准实验及基于文本的IR实验和基于AST的IR实验对比可知,本文使用的基于域信息划分的IR技术是有效的,基于域划分的检索结果precision为0.9203,recall为0.9391,MAP为0.5360,这三个指标均高于其他对比实验的结果。在分类阶段,通过引入JPlag、IR+RF及IR+GDBC的对比实验,发现本文使用的IR+Stacking的方法precision为0.9266,recall为0.9012,F-score为0.9137,指标结果均优于其他对比实验的结果。最后对综合实验结果进行分析,首先在时间上,本文在潜在抄袭代码对检索和分类中使用的总时间为11小时左右,JPlag所用时间最短为3.5小时左右,而深度学习的方法用时最长为为72小时左右;其次在准确度上,本文使用F-score评价指标进行评价,本文方法的F-Score的值为0.9137,要高于JPlag的0.4469和基于深度学习的0.8933,因此本文的方法对于源代码抄袭检测是有效的。