秦国锋 王睿晗 任成琨 郝泳涛 王力生
10.3969/j.issn.1671-489X.2022.03.032
摘 要 为解决学生递交的计算机课程代码管理和审核问题,构建本地哈希指纹算法和Spring Cloud框架的查重比对模型,开发计算机专业课程教学评价系统,其中包含按照课程和小节分类的文件管理和代码重复率计算。哈希指纹算法是通过哈希函数和滑动窗口计算出文件一系列的哈希值,通过比较哈希值来计算出文件之间的重复率,从而为教师对学生代码的评价提供参考。
关键词 在线课程管理;查重比对算法;网络教学平台;k-gram算法
中图分类号:G434 文献标识码:B
文章编号:1671-489X(2022)03-0032-04
0 引言
在当今信息化建设中,各大高校都开始采用信息化的管理和教学手段,这种方式具有便捷、快速、准确等优点,为教师和学生提供了很大的便利[1]。但是,以往的教学平台往往只提供信息的传输、查看和下载等功能,比如教师在网站发布作业和视频,而后学生查看视频和作业,完成电子版的作业后将作业提交,最后教师评阅作业。这个过程仅仅是方便了信息传输,却不能为教师评阅提供助力。由于代码容易复制,使得在实际的教学工作中抄袭、“借鉴”等行为层出不穷,因此迫切需要快速准确的代码查重方法来帮助教师识别可能抄袭的代码,培养学生正确的学习观念,提升整体教学质量。
本文基于知识管理的理念,采用三层B/S架构,即数据访问层、业务逻辑层和表示层,提出并实现一种基于计算机专业课程计算机体系结构的网络教学平台[2-3],除提供常规的课程添加、课程小节添加、作业发布、学生作业上传、教师下载查看等基本功能外,还提供Verilog代码的在线编译和查重功能,能够为教师评阅代码提供有效的帮助。
1 在线课程管理与本地代码查重的需求
分析
需求分析对于教学平台的设计与实现来说至关重要,通过需求分析要明确系统功能的各项需求,再根据这些需求来对下一步的系统设计和开发进行指导。
1.1 课程管理系统的需求分析
整个系统需要分成三个权限角色:管理员、教师和学生。课程需要是可扩展的,管理员可以在需要时添加新的课程、添加教师。教师可以对课程添加小节和作业信息,上传作业要求,查看选课学生信息,查看特定课程特定小节的查重结果。学生可以自主选课,查看作业信息,上传作业压缩包,服务器需要存储学生文件、教师文件。对于不同的登录用户,系统会根据权限的不同进入对应的页面,这样不仅方便学生、教师和管理员操作,提高工作效率,也会使各自的数据信息更加安全。
1.2 本地代码查重的需求分析
代码查重是本系统最核心的功能。基于知识管理的理念,系统应当存储学生的代码文件,当教师需要某门课程某个小结的代码查重结果时,系统应在后台进行计算,然后将结果返回给教师。代码查重算法需要有以下四种关键性能。
1)代码中的空格,代码的大小写、标点符号、注释是需要忽略的,所以需要对代码进行预处理,将其中不需要检测的内容删除或者替换掉。
2)较小的字段重复是需要被忽略掉的。比如关键字for在不同代码文件中往往都会出现,而这往往不应算作重复的地方。因此,重复的字段应该足够大,以至于这段代码很可能是复制的,而不是简单的特定语言的重复单词。
3)位置信息不应该影响查重结果。例如:将代码文件中两个函数的位置进行替换,不应当影响查重结果;在代码中新添加一段代码,不应当影响原来的重复代码的重复检测。
4)检测时间尽可能短。大文件匹配本身就是一个非常消耗时间的算法,所以需要良好的系统设计和算法设计来加快处理速度。
对于第一点,首先需要将一个学生这次的作业代码文件全部拼接为一个文件,在拼接过程中将空格、标点符号、注释删除,同时将全部字母转换为小写字母,并且将非关键字的变量或函数命名全部替换为“X”关键字[6]。第二点和第三点需要运用提出的Verilog本地哈希算法来解决,第四点则会在之后的架构设计中解决。
2 在线课程管理平台的开发与设计
2.1 总体设计
按照功能需求进行分解,可以在结构上将课程网站分为前台模块和后台模块。前台模块主要是学生和教师使用,学生在登录成功后浏览相关课程,选课,查看课程小节信息和作业,上传作业等;而教师登录成功后则可以查看自己的课程,发布课程的小节,上传作业,下载作业,以及进行作业查重。后台模块为管理员使用,管理具体的课程、教师和学生信息。系统架构见图1。
2.2 系统框架设计
2.2.1 用户登录 登录模块主要实现用户根据不同权限进行系统登录的验证,教师、学生和管理员可以根据不同权限进入相应页面。在登录页面,可以选择学生、教师和管理员三个权限,输入用户名和密码后会在数据库中进行比对,如果密码错误会直接返回登录界面,而连续登录失败三次会提示暂时无法登录,然后在当前页面等待一分钟,防止数据库压力过大。
1)学生用户。学生登录后可以查看课程列表,点击选课即可加入该课程。点击我的课程可以查看已选课程列表,进入具体课程可以查看该课程的小节,下载教师发布的该课程小节的文档信息,上传这个小节的作业。
2)教师用户。教师登录后可以查看自己的课程,查看学生列表,发布课程下的小节,上传作业文件,下载学生作业,进行作业查重,下载查重文件并查看结果。
3)管理员。管理员在登录后可以查看所有课程和教师,并且可以增删课程,为课程指定教师,修改教师信息和学生信息等。
2.2.2 查重模块的设计 在实际的工作学习中,电子内容很容易复制,比如从网页中复制内容,学生借鉴其他人的作业等。因此,迫切需要对于不同文件中重复内容进行检测。对比整个文件是否相同,相比于对比文件中的部分内容更简单[4]。文件指纹算法可以用来准确检测复制,包括文件中的部分复制。算法是在k-gram算法的基础上对Verilog语言的适配和改进,以希望准确检测不同Verilog代码文件中的重复部分[5]。
k-gram算法将一个处理好的文件内容(处理是指删除掉不相关的内容,比如空格、标点符号和注释等)分割为长度为k的子串。如abcdefghi,假设k为4(这个值是由用户指定的,主要根据具体要比较的文本特点来确定),这个字符串在k-gram
算法中将被分为这样的子串:abcd bcde cdef defg
efgh fghi。而后计算每一个子串的哈希值:45 22
20 36 21 52。由于所有的哈希值很多,如果全部存储并且计算会给服务器带来很大负担,而且并不需要所有的哈希值,因此可以选择所有模p为0的哈希值作为整个文件的指纹。在例子中p=4,指纹还包含位置信息,用来描述这个哈希值所代表的字符串在文件中的位置:20 36 52。
在获取每个文件的指纹后,可以通过对比任意两个文件之间指纹的相似度来计算出整个文件的近似相似度。但是这种方法存在问题,如果两个满足0 mod p的哈希值相隔太远,那么即使两个哈希值相同,也不会被检测到。因此,在k-gram算法的基础上针对Verilog语言进行一定的改进和适配,同时改善距离过大导致的无法检测的问题。
查重的目标是将同一课程同一小节内的所有作业都两两比对。要求所有学生上传的作业都使用压缩包的形式,上传成功后进行解压,然后将所有.v文件拼接在一起,在拼接的过程中删除所有空格、注释和Verilog特有的不重要的关键字,比如endmodule等。拼接完成后,需要计算哈希值。设定每八个字符计算一个哈希值,每五个哈希值中选取最末尾的一个写入文件中。这些过程全部是在学生上传作业后在系统后台另开启新的线程实现的,目的是提前进行预处理,节约时间。
预处理算法细节如下:
void cal (int w){
int[] h=new int[n];
for(int i=0;i VALUE; int r=0; int min=0; while(true){ r=(r+1)%w; h[r]=hash(); if(min==r){ for(int i=(r-1)%w;i!=r;i=(i-1+w)%w){ if(h[i] } record(h[min],global_pos(min,r,w)); }else{ if(h[r]<=h[min]){ min=r; record(h[min],global_pos(min, r,w)) } } } } 当教师向用户发送请求获取某小节的查重结果时,后台两两计算两个学生作业的哈希值相似度,这里选用的是Jaccard相似性系数。而后将相似系数写入查重文件中,并写入数据库,返回给教师。 Jaccard可以用来衡量两个集合之间的区分度。现有两个集合A、B。Jaccad系数: J(A,B)=|A∩B|/|A∪B| 可以很容易看出Jaccard系数越大,A、B集合的相似度越高。具体的Jaccard系数计算代码实现: public double jaccard(Set int count = 0; for (int i : A) { for (int j : B) { if (i == j) { count++; } } } return count / (A.size() + B.size() - count); } 2.2.3 数据库设计 数据库在系统中用于存储信息,数据库的逻辑设计确定了各个实体之间的逻辑实现,而实体和属性之间的关系需要用实体—联系图表现,见图2。本系统具有以下四个实体。 1)管理员实体,包含管理员id、管理员姓名、管理员密码。 2)教师实体,包含教师id、教师姓名、教师密码。 3)学生实体,包含学生id、学生姓名、学生密码。 4)文件实体,包含编号、文件在硬盘中的url、文件所属的学生id、文件所属的课程id、文件所属的教师id、文件类型、成绩、课程小节、创建时间、文件名。将教师课程文件、学生作业文件和查重文件统一放在这个表内,通过文件类型标识不同的文件类型,管理更为方便。 3 查重比对算法的测试验证与分析 3.1 实验环境 实验环境(表1)在代码查重中对结果准确率的影响微乎其微,但会极大地影响计算速度。 3.2 实验方法 选取两个代码文本,分别是两个完全不同的Verilog文件A和B,然后从A中随机选取一些语句加入B文件中。设定A的代码字符量为a,B的代码字符量b,而从A中选取的加入B中的代码字符量为c,则定义这两个文件的相似度为: S=(c/(a+b))*100% 而查重准确率为: Diff=(1-|c-c′|/c′)*100%。 然后创建多对文本,涵盖完全重复到部分重复到完全不重复,用来验证查重代码的有效性、敏感性和准确性。 3.3 有效性检验 先选取两个完全不同的文本,然后选取两个完全相同的文本,分别对其进行查重比对,得出结果(表2)。可以发现算法对于不同文本是有效的,可以识别出相同文本和不同文本。 3.4 敏感性检验 选取两个完全不同的文本A和B,然后从A中选取一些代码加入B,生成文本B1;从少到多选取一些代码加入B,生成Bn。对A和Bn逐一进行查重比对,并且用最长公共子序列的字符串匹配的算法来作为对比,得到结果(表3)。可以发现哈希查重在敏感性上是优于最长公共子序列查重的。 4 结束语 本系统使用Java语言和Spring框架提出并实现一种基于知识管理的在线课程管理平台,部署在Windows server上,使同济大学计算机体系结构的教研更趋向信息化。并且在其中提出并实现一种基于k-gram的在线查重算法,可以针对学生代码进行同课程内的查重。该平台现已在同济大学计算机体系结构课程教学中试运行,为教师审阅学生代码提供了极大便利,为提升教学质量奠定坚实的基础。虽然目前缺少在线编译、在线代码查看等功能,甚至存在一些未知的问题,需要在之后的迭代中继续完善,但已经达到初步试运行的标准。未来需要根据用户反馈,完善更多功能,优化体验,助力课程教学。 参考文献 [1] 张黎明,龚琪琳.基于MVC模式的Java Web应用设 计[J].计算机与现代化,2007(2):22-24. [2] 秦国锋,秦家豪,邹剑煌,等.基于Artix-7 FPGA 的三级存储体系设计与实现实验[J].实验室研究与 探索,2020,39(10):45-49. [3] 秦国锋,胡岳,黄林钰.计算机系统结构课程实验 静态流水线CPU的设计、实现与性能分析[J].教育 现代化,2018,5(20):183-187,195. [4] Broder AZ .On the Resemblance and Containment of Documents[M]//Proceedings of the Compression and Complexity of Sequences 1997.IEEE,1997. [5] Baker B S, Manber U.Deducing similarities in Java sources from bytecodes[J].USENIX Associa- tion,1998. [6] Schleimer S,Wilkerson D S, Aiken A. Winnowing: Local Algorithms for Document Fingerprinting [M]//Proceedings of the 2003 ACM SIGMOD inter national conference on Management of data,2003: 76-85. *项目来源:2017与2019教育部—美国DIGILENT公司产学合作协同育人项目(项目编号:201702015017,20190209 7011);2017—2019年同济大学实验实践教学改革项目(项目编号:0800104251、0800104500/008);同济大学—华为 “智能基座”产教融合协同育人基地项目(项目编号:0800166023/001)。 作者:秦国锋,同济大学计算机科学与技术系计算机系统结构教研室主任,博士,研究方向为感知与嵌入式系统;王睿晗、任成琨、郝泳涛、王力生,同济大学计算机科学与技术系(200092)。