秦國鋒 王睿晗 任成琨 郝泳濤 王力生



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)。