基于TF-IDF的程序代码抄袭检测系统

2020-11-16 06:56李晗
数字技术与应用 2020年9期

李晗

摘要:本文设计了一种用于程序设计实验源代码结果抄袭检测系统。采用自然语言处理技术中的TF-IDF算法和测量向量相似度的余弦相似性算法,分析检测源程序抄袭情况,通过实际应用算例验证了系统的有效性。源程序抄袭检测对各种需要提交代码的实验教学系统有重要的实用价值。

关键词:TF-IDF;余弦相似性;抄袭检测;C源程序

中图分类号:TP183 文献标识码:A 文章编号:1007-9416(2020)09-0136-03

0 引言

高校程序类课程教学越来越多地要求学生在线提交编程作业或实验源代码。一些课程或实验也开始使用成绩自动评分系统[1]。这些代码提交系统的广泛应用使得防范代码抄袭成为此类课程的一个重要需求。抄袭检测也是慕课系统或在线教学系统的重要组成部分[2]。

1 算法设计

从自然语言处理的观点来看,抄袭检测的本质是测量两个文本的相似度。在进行相似性计算时,可采用余弦相似性算法。从文本到文本特征向量的转化则采用TF-IDF算法[3-5]。整个算法的流程如图1所示。

整个算法流程说明如下:

(1)将C语言的各种操作符、分隔符及三种括号聚合为停用词(stopwords)集合;

(2)使用停用词集合进行滤除操作,保留各种名称标识符,形成关键词向量;

(3)综合所有文本的处理结果(关键词向量),形成语料库(corpus);

(4)分别计算各关键词的TF和IDF,最后形成TF-IDF向量;

(5)计算余弦相似性;

(6)最后,提取相似度的行最大值进行阈值处理,判断是否抄袭。

2 实验与算法测试

2.1 实验环境

实验数据来源于C语言程序设计课程的网络作业平台。该网络平台包括了一些C语言习题及自动判题机制,供学生在课余练习编程之用。数据集包括如下字段:用户提交号、用户ID、题目ID、课程序号、编程语言编号、判题结果、使用时间、使用内存、提交时间及提交源代码。除最后一项提交源代码外,其他字段每次提交所产生的数据均在一行中。提交源代码字段根据源代码篇幅占据数量不等的行。

2.2 算法测试

首先进行數据清洗。数据清洗主要有以下作用:

(1)将读入的每行数据进行切分,此处的复杂性在于提交源代码字段和其他字段出现混行现象,解决此问题采用了正则表达式;

(2)字符编码格式不匹配问题,通过改变读取方式和转码来解决;

(3)将切分好的数据导入数据库,并分离出目标课程对应的相关数据。

为了确保数据清洗的可靠性,进行数据探索。在数据探索中发现以下问题:

(1)通过各种SQL语句检视数据及程序调试中发现少数行数据格式不规范问题,影响本行数据的分段及后续数据行的处理。处理方法为修改数据清洗程序重新进行清洗;

(2)发现提交数过少或ID号格式异常的用户,将其筛除。

接下来是数据处理环节。通过上节所述的算法流程对数据进行处理,其基本核心思想就是将源程序看成是一种文本,然后利用相应算法进行转换和测量。将处理数据可视化可以看到文本对的余弦相似度分布情况。以下以题目ID为1958的编程题为例说明,该题的提交结果的文本对余弦相似度分布如图2所示。

图中横坐标为相似度区间,相似度从0至1平均分成100个区间;纵坐标为相似度值落到此区间内的文本对数量,为更明显地展示的高相似值区间的统计情况,纵坐标的显示范围被限制在0~2000之间。直方图的右侧的自然趋势应该随着相似度值变大平缓下降为0,然而从图中可以明显地看到“翘尾”现象。这表明存在抄袭的可能性很大。

通过细致的结果分析可以进一步说明问题。该编程问题提交源代码文本数量为542,筛出嫌疑较大的高异常余弦相似值的文本对总数为128。高异常相似值的文本对是按照以下规则选取的:每个用户相对于其他用户的相似度取最大值者,然后对比阈值0.999进行筛选,大于阈值者被筛选为高异常相似值。这些文本对的余弦相似度统计如表1第二列所示。为检验算法组合对抄袭问题的检测效果,使用人工方式查看源代码文本,判断是否抄袭,然后与算法结果进行对比。人工判断的结果见表1第三、四和五列。

在计算最后两列精度和召回率时,将人工无法判定的文档近似归类为非抄袭文本。精度反映了检测算法认为的抄袭文本中真实抄袭文本所占的比率。召回率反映了真实抄袭文本中被检测算法筛选出的比率。每栏的精度值和召回率表明在此栏的相似度阈值条件下计算出的精度值和召回率。具体见图3。

上图的横坐标为表1中相似度阈值,纵坐标为精度和召回率的百分比。从图中可知,在总共128个计算结果中,如果取0.9999作为相似度阈值,可取得最佳的分类效果。从表中的数据可以看出,采用TF-IDF特征向量,可以相当准确地聚合文本特征,从而使余弦相似度测量呈现出非常好的效果。

3 结语

本文提出了利用TF-IDF和余弦相似度的组合进行C语言代码的抄袭检测,实验表明,算法组合取得较好的检测效果。从本文的算法应用可以看出,代码抄袭检测算法使用自然语言处理技术取得了很好的效果。由于近年来自然语言处理与神经网络技术相结合,发展迅速,因此可以从自然语言处理方面汲取更多新的思路。本文是将整个C语言源程序作为整体进行处理的,未考虑C语言的语法特点所导致的一些宏观结构特征。在抄袭检测中使用这些特征,可能使源代码的结构相似性判断成为可能。今后可以在这方面进行进一步的研究。

参考文献

[1] 张景辉,王培进.课程设计自动评分系统设计与实现[J].电气电子教学学报,2019,41(4):149-152.

[2] 薛景,陈仁祥,张敏,等.程序设计类课程在线评测教辅系统的设计与实现[J].计算机教育,2018(11):104-108.

[3] 田振洲,刘烃,郑庆华,等.软件抄袭检测研究综述[J].信息安全学报,2016,1(3):52-76.

[4] Burrows,Steven;Tahaghoghi,S.M.M.;Zobel,Justin.Efficient plagiarism detection for large code repositories[J].Software-Practice and Experience,2007,37(2):151-175.

[5] Prechelt L,Malpohl G.Finding Plagiarisms among a Set of Programs with JPlag[J].J Universal Computer ence,2000,8(11):1016-1038.