個人專案:論文查重

lsr0930發表於2024-09-14
這個作業屬於哪個課程 <計科22級34班>
這個作業要求在哪裡 <作業要求>
這個作業的目標 <1.在Github倉庫中新建一個學號為名的資料夾。2.用PSP表格記錄下估計和實際在程式開發各個步驟上耗費的時間。3.使用C++ 、Java語言或者python3實現論文查重。4.提交的程式碼要求經過Code Quality Analysis工具的分析並消除所有的警告。5.完成專案的首個版本之後,請使用效能分析工具Studio Profiling Tools來找出程式碼中的效能瓶頸並進行改進。6.使用Github來管理原始碼和測試用例,程式碼有進展即簽入Github。7.使用單元測試對專案進行測試,並使用外掛檢視測試分支覆蓋率等指標;寫出至少10個測試用例確保程式能夠正確處理各種情況。>

一、Github倉庫

  • 地址:https://github.com/rourou0930/PlagiarismChecker

二、PSP表

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 90 90
· Estimate · 估計這個任務需要多少時間 45 60
Development 開發 120 150
· Analysis · 需求分析 (包括學習新技術) 60 60
· Design Spec · 生成設計文件 60 60
· Design Review · 設計複審 60 60
· Coding Standard · 程式碼規範 (為目前的開發制定合適的規範) 60 60
· Design · 具體設計 60 60
· Coding · 具體編碼 30 30
· Code Review · 程式碼複審 30 30
· Test · 測試(自我測試,修改程式碼,提交修改) 180 150
Reporting 報告 60 60
· Test Repor · 測試報告 60 60
· Size Measurement · 計算工作量 10 10
· Postmorte· 合計m & Process Improvement Plan · 事後總結, 並提出過程改進計劃 30 30
· 合計 955 970

三、需求分析

題目:論文查重

描述如下:

設計一個論文查重演算法,給出一個原文檔案和一個在這份原文上經過了增刪改的抄襲版論文的檔案,在答案檔案中輸出其重複率。

原文示例:今天是星期天,天氣晴,今天晚上我要去看電影。
抄襲版示例:今天是周天,天氣晴朗,我晚上要去看電影。
要求輸入輸出採用檔案輸入輸出,規範如下:

從命令列引數給出:論文原文的檔案的絕對路徑。
從命令列引數給出:抄襲版論文的檔案的絕對路徑。
從命令列引數給出:輸出的答案檔案的絕對路徑。
我們提供一份樣例,課堂上下發,上傳到班級群,使用方法是:orig.txt是原文,其他orig_add.txt等均為抄襲版論文。

注意:答案檔案中輸出的答案為浮點型,精確到小數點後兩位

四、計算模組介面的設計與實現

1.核心演算法:

(1)SimHash演算法:

  • SimHash演算法主要有五個過程:分詞、Hash、加權、合併、降維。
  • 具體可參考SimHash原理與實現

(2)計算海明距離:

  • 簡單的說,海明距離可以理解為,兩個二進位制串之間相同位置不同值的個數。舉個例子,[1,1,1,0,0,0]和[1,1,1,1,1,1]的海明距離就是3。
  • 在處理大規模資料的時候,我們一般使用64位的SimHash,正好可以被一個long型儲存。這種時候,海明距離在3以內就可以認為兩個文字是相似的。

2.實現思路:

image

3.介面實現:

image

(1)讀寫txt檔案模組:
類:TextIO
方法:

  • readTxt:傳入檔案絕對路徑,將檔案內容轉化為 String字串輸出。
  • writeTxt:傳入內容、檔案全路徑名,將內容寫入檔案並換行。

(2)計算SimHash模組:
類:SimHash
方法:

  • getHash:輸入一個詞,獲取詞的hash值。
  • getSimHash:獲取字串的SimHash值。

主要流程:

  • 分詞:使用了外部依賴漢語言處理hankcs包提供的介面,把需要判斷的文字分詞形成這個文章的特徵單詞。
    image

  • 獲取hash值:透過hash演算法把每個詞變成hash值。
    image

  • 加權、合併:透過 2步驟的hash生成結果,按照單詞的權重形成加權數字串,把上面各個單詞算出來的序列值累加,變成一個序列串。
    image

  • 降維:把4步算出來的序列串變成 0 1 串,形成最終的SimHash。
    image

(3)計算海明距離模組:
類:Hamming
方法:

  • getHammingDistance:輸入兩個simHash值,計算它們的海明距離。
    image

  • getSimilarity:輸入兩個simHash值,輸出它們的相似度。
    image

透過比較差異的位數就可以得到兩串文字的差異,差異的位數,稱之為“海明距離”,通常認為海明距離<3的是高度相似的文字。
(4)Main主模組:
類:Main
主要流程:

  • 呼叫TextIO,從命令列輸入的絕對路徑名讀取對應的檔案,將檔案的內容轉化為對應的字串;
  • 呼叫SimHash,由字串得出對應的 simHash值;
  • 呼叫Hamming,由 simHash值求出相似度;
  • 呼叫TextIO,把相似度寫入最後的結果檔案中。

五、效能改進

1.overview:

image

2.方法呼叫情況:

image

六、單元測試展示

image

1.TextIOTest:

(1)程式碼:
image

image

(2)測試結果:
image

image

image

2.TextExceptionTest:

(1)程式碼:
image

(2)測試結果:
image

image

3.SimHashTest:

(1)程式碼:
image

(2)測試結果:
image

image

4.HammingTest:

(1)程式碼:
image

image

(2)測試結果:
image

5.MainTest:

(1)程式碼:
image
image
image

(2)測試結果:
image

七、異常處理說明:

當文字長度太短時,HanLp無法取得關鍵字,需要丟擲異常。
image

實現了一個處理這個異常的類:ShortStringException
image

相關文章