码迷,mamicode.com
首页 > 其他好文 > 详细

计算机科学工作坊检测抄袭意见书

时间:2015-05-02 20:46:41      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

计算机科学工作坊检测抄袭意见书

Dick Grune

Matty Huntjens

Vakgroep Informatica

Faculteit Wiskunde & Informatica

Vrije Universiteit

De Boelelaan 1081

1081 HV AMSTERDAM

November 1989

 

摘要

    在大多数计算机科学研讨会中,学生提交作业由多个主管评分。这将可能产生一个学生提交的工作已经被另一个学生在此之前以最小的被发现的可能性提交到另一个主管的情况。这将导致不公平的现象,因为没有学习和什么都没学到的学生都有一样加分。本文描述了阿姆斯特丹大学计算机科学专业如何试图防止这种情况。

 

介绍

       计算机科学研讨会的多个监管提出非常棘手的问题:“我们如何能看到提交的工作不是一个副本?”复制检测不是微不足道的,或许从机房介绍编程的事实来看,我们每181名学生,每人提交10个程序,就需要1名教师协调员和8个监管者参与。本文描述了一个基于所有提交程序相互自动比较的解决方案。

 

相似度检测仪(The Similarity Tester)

    我们期望一个程序可以检测到两个文本程序中共同的部分,这种程序没有首先起源于剽窃检测。相反,它是基于经验判别的,大型()完成软件项目通常包含类似代码的延伸。在编写大型软件对象——操作系统、编译器时,编辑程序员通常需要编写当前已经写好项目的代码。一种常见的技术是使用一个文本编辑器复制原始代码并调整它用于新的用途。良好的软件工程实践可以将规定的代码转变成一个通用模块并实例化它为不同的对象,但很少有语言能提供这种可能性。同时, 通用模块的适合接口建设工程是一个智力密集的事情,因此,剪切-粘贴-调整技术仍然是主流的。

       一旦项目确定下来,如果这些复制对可追溯,那么问题就产生了,我们想知道它们是否可以更好的结合。对大多数的副本而言,将不再是相同的,它们或多或少都经历了的深刻的修改;然而,我们对面目全非的副本是不感兴趣的。种种因素促使下,我(Dick Grune)设计并实现了一个程序——软件相似度检测仪。这个程序读取代码并检查,把文本缩减成了8位不可或缺的标记字符串,然后反复检测最长公共非重叠子串。最后打印其调查结果的报告。

       相似度检测仪中减少基本必要标记符的标准在一个替换模块中实现的,它们通常涉及所有标识符和数字归于一个标记:<idf>,所有字符串归于<string>,所有字符归于<char>,删除所有注释和空格,并替换编程语言中的每个关键字为单独的标记符。其他程序文本符号(逗号、分号等)作为标记保持不变。一个2000字符的典型文件转换后将变为大概约100标记符的文本。

       这种检测并不是完全正确的,它有一定成功的可能。这是很容易想象的,即使是将一个复制的代码段的结构轻微的修改到这样的程度,上述的检验程序也都不再识别它。同样不难想象的是,这个检验充满了误报。然而,实践表明,对于目前我们想要解决的问题,一般情况下SIM都可以解决。上面所描述的危险确实存在的,但可以保证检测可以通过一个特定长度的最小长度公共子串。24个标记符就是其中一个很好的阀值。当阀值低于18时就会产生相似度的虚假报道,例如声明列表; 当阀值超过30时,就可能导致错过了一些有益的匹配,例如短的语句。当选定了合适的必要标记符定义和一个适宜的最短公共子串阀值时,软件相似度检测仪对于定位相似代码将是一个有用的工具; 一般而言,大多数关于相似度的报道是有意义的。

 

抄袭检测

       如果我们将相似性检测方面取得的一些好的经验,结合我们的想法着手来检测学生提交程序的抄袭程度,将是大有裨益的。然而,接下来列举的疑问确实非常棘手的。毕竟所有提交的程序都是为了解决同样的问题。如此之大的相似度,相似性检测仪到底可以检测所有提交代码的抄袭性吗?或者聪明的学生非常了解相似性检测仪是如何自动检测的运作原理的,并且这个学生能够运用简单的系统修改其他同学的代码,那么,这样的抄袭是否可以被检测出来呢?

 

它看起来像什么?

       为了找到第一个问题的答案,我们需要更加严谨地定义相似度的概念,下面我们定义两个最小串长为N的文本AB相似度为SN (A, B )。假设我们只利用B来构造抄袭副本A使得A至少有N个标记符,在这种情况下,我们所构建的公共串越长,AB越相似。这样,SNAB)就是它与A中标记符的比值。

       通常情况下,A中所有的标记符在B中都出现,那么AB的相似度S1AB)就达到了100%;同样,如果A一定是B的抄袭副本,对于足够大的NSNA,B)就是0%。当N0逐渐增长到A的长度时,相似度S也由100%逐渐变为0。而AB不相关时,N逐渐增大则比相关AB更容易影响相似度S的增大。实验表明,对于N =24AB无关的检测,相似度S大致在20~50%,而AB相关的检测,相似度S却在75~80%之间。这使我们能够清楚的看出两者之间的区别。

       下面我们描述的是包括39个提交程序的任务j2的检测情况,每一个程序都和另外38个程序对比,结果生成1274个匹配百分比; 然后这些匹配百分比被分成1~1011~20....,91~100十组,并以柱状图形式示于图1中。由图可得,在这个任务中的大部分相似度都在1%~10%,然后是分布在41%~50%之间的,最后是一些异常值,对于每个异常可能都预示着一个抄袭。

       2显示的是每一个程序与其他所有程序对比的百分比,每一个高比例(61%~70)都可能预示着一个抄袭被监测到,接着需要人为检查确定是否有抄袭发生,如果确实存在,要确定哪个是抄袭方,或者两者均抄袭第三方。

 

相应的对策

       本次检测的漏洞可能是“聪明”的学生,这就需要我们深入研究该学生提交的过程并对该学生的程序进行二次评估。下面我们再看一下在线编程入门的例子,主要包括以此增加难度的11个编程,成为k级难度。其中af6个等级难度是微不足道的,只可以用来联系热身,gf之间4个等级难度的题目是最主要的,难度等级为k的题目是可选的。完成编程题目的同学将通过电子邮件发送给服务器,服务器负责检测程序功能的正确性。如果程序正确,则存储在服务器端数据库中;如果程序有错,则返回其错误类型,待学生修改后继续提交直至正确。

       存储到数据库中的程序被一个叫做以SIM为核心算法的相似性检测仪自动地相互比较,如果数据库中有n个程序,则检测返回n-1个相似度,图3显示了样例的结果。管理员有权限访问上图,找出并亲自检测相似度大于60%的程序,以检测他抄袭的对象。如果有发现一个极有可能涉嫌抄袭的,便向管理员员报告。相似度为80%或更高的总是在比较过程中自动返回给管理员。

       如果一切正常,就将程序代码显示出来,并由判题员根据正确程序的风格、结构、符合指数等打分。

       考试开始之前,告诉学生他们的代码会被自动检查抄袭,抄袭的代码如果不想被检测出来,则需要面临一下挑战:

抄袭的代码必须严格不同与被抄袭的代码,否则相似性检测仪会在检测到抄袭的时候发出警报。也就是说,凡是替换变量名,增加或修改注释或者改变布局的代码都是无效的。值得一提的是,相似度检测仪发现的最长公共子串跟顺序是无关的,UNIX下的diff,寻找最长子串是与顺序相关的。

提交到服务器的代码交由管理员检测运行通过,这意味着抄袭的程序不能由其他程序组合而成。让这样大一个工程顺利运行也就意味着需要在开始之前事先做很所工作。检测也拒绝学生提交一个完全无关的文本,例如UNIX手册页面,这样的文本相似比接近0%,但不会通过编译,更不用说正确运行了。极偶尔情况下,学生会提交错代码,或者管理员将其代码放错数据库。设想一下,j2题目的程序提交到j3题目下,会有什么情况发生?这样相似度几乎为0%,管理员便可以检查其代码。相似度极低的代码与相似度极高的代码同样值得怀疑。

如果你的代码通过前两个障碍,那么它仍将由主管个人检查打分。这就是说,你的代码必须看起来不错,而且不能添加虚假语句或者更改代码顺序以躲过相似性检测人员。当然,如果你的代码添加了太多无用的信息也必将吸引判题人员的注意。

 

经验之谈

       当然,我们不能保证没有人可以想到抄袭却能避开上述障碍的战略,但我们并不关心是否存在这样的策略。似乎存在这样一种策略是合乎情理的,假设它真的存在的话,我们需要类似的程序去对它进行判别。改变声明语句,将大程序分割成小的程序组合,选择不同的数据结构都是需要一定基础的。但是,这种操作看起来更像是一场游戏,它打破了我们设计此套系统的初衷。

       事实证明,抄袭总是个例,相似度检测仪对程序的判断并不是绝对的,它依赖于代码的组织和规模。企图误导检测仪的程序目前是没有的。由于显而易见的原因,我们对于这种成功的尝试还没有足够的证据证明他的不存在。

       上述数据检测发现,竟然80%的情况是真正意义上的真正的抄袭。在这些情况下,打印出来的程序之间的对应关系是非常强的,甚至高于80%。例如,标识符匹配的文本或注释相同的代码段并不包括在必要标记符中,因此他们对于相似度是没有帮助的。

       最初我们设置阈值为60%,但实践证明这太低了。首先,短小的代码(半页)包含太多的标准定义,相似度值太高了;第二, 如果与原程序的40%不同,即使相似度值是正确的,也很难判断一个简短的程序是不是抄袭。而对于80%的阀值是无庸考虑的。

有时经过质疑,所有学生面对抄袭检查证实了这种怀疑确实是不必要的。通常他们的反对是因为他们已经竭尽全力来改变程序,使它看起来不像是抄袭。然而,这些变化通常局限于替换标识符和变化声明语句的顺序,所以基本上相同的程序。上面我们看到的相似度检测仪对这种变化是不敏感的。因为10%~15%的代码通常由不同输出语句重写,而算法本身从未改变。

我们的计算机科学教学的目的是教学生而不是检测和评估他们的代码,所以学生之间的互相参考是没有问题的,也是无关紧要的。如果他们在课堂听课学习,在课堂上查阅书籍,向老师、同学甚至管理员求助都可以,无论什么情况下,只要他们学到东西,这就是唯一重要的事情。选拔和评估需要借助于考试。然而,这种思想并不意味着现场做题是可选的。听到别人讨论学会解决问题,然后自己消化吸收,跟从别人那儿获得完整的程序,并将它作为自己的程序的区别在于学习到东西的价值。

 

小结

       虽然未经证实,但就我们目前情况来看 ,想要躲避相似度检测仪的唯一途径就是自己亲手编写原代码。这意味着,任何人通过抄袭,在注释、标识符、布局和程序的顺序上做修改而形成的代码,我们都视为剽窃。

计算机科学工作坊检测抄袭意见书

标签:

原文地址:http://blog.csdn.net/caizi1991/article/details/45441719

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!