第一次個人程式設計作業

aBin_L發表於2024-09-15
這個作業屬於哪個課程 [計科22級34班 ]——https://edu.cnblogs.com/campus/gdgy/CSGrade22-34
這個作業要求在哪裡 [第一次個人程式設計作業 ]——https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229
這個作業的目標 使用Java完成個人程式設計作業,在實現論文查重專案的過程中和運用軟體工程的知識進行學習開發,學會使用PSP表格,使用github提交專案,進行單元測試與問題處理。

[個人專案github倉庫]——https://github.com/aBin-L1/3122004531

一、PSP表

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

二、需求分析

題目:論文查重

描述如下:

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

  • 原文示例:今天是星期天,天氣晴,今天晚上我要去看電影。
  • 抄襲版示例:今天是周天,天氣晴朗,我晚上要去看電影。

要求輸入輸出採用檔案輸入輸出,規範如下:

  • 命令列引數給出:論文原文的檔案的絕對路徑
  • 命令列引數給出:抄襲版論文的檔案的絕對路徑
  • 命令列引數給出:輸出的答案檔案的絕對路徑

樣例說明:orig.txt是原文,其他orig_add.txt等均為抄襲版論文。

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

三、開發環境

  • IntelliJ IDEA甲基橙開發環境
  • 基於JAVA
  • 使用Maven倉庫
  • 使用HanLP庫

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

計算模組是整個系統的核心部分,負責計算文字之間的相似度,以實現對抄襲的檢測。主要由以下幾個類組成:

  1. SimHashUtils:用於計算文字的 SimHash 值,是整個計算模組的核心。
  2. HammingUtils:用於計算兩個 SimHash 值的海明距離,並進一步計算相似度。
  3. ShortStringException:自定義異常類,用於處理文字過短等特殊情況。
  4. TxtIOUtils:用於讀取和寫入文字檔案,輔助計算模組進行檔案操作。

4.1 模組功能概述

計算模組的主要功能是接收兩個文字檔案的內容,計算出它們的 SimHash 值,然後透過計算海明距離(Hamming Distance)來獲得兩個文字的相似度。該模組能夠處理不同長度的文字,同時對異常情況(如文字過短、文字為空)進行了有效的處理。

主要功能包括:

  1. 提取文字的關鍵詞並計算 SimHash 值。
  2. 計算兩個 SimHash 值之間的海明距離。
  3. 根據海明距離計算文字相似度。
  4. 處理空文字、短文字等異常情況,確保系統的穩定性。

4.2 介面設計

計算模組提供以下主要介面:

  1. SimHashUtils.getSimHash(String str):傳入字串,計算出字串的 SimHash 值,並以字串形式輸出。
  2. HammingUtils.getHammingDistance(String simHash1, String simHash2):傳入兩個 SimHash 值,計算並返回它們的海明距離。
  3. HammingUtils.getSimilarity(String simHash1, String simHash2):傳入兩個 SimHash 值,計算並返回它們的相似度。

4.3 介面實現

4.3.1 SimHash 值計算實現

SimHashUtils.getSimHash 方法主要透過以下步驟實現:

  1. 關鍵詞提取:使用 HanLP 分詞工具對輸入文字進行分詞,並提取關鍵詞。
  2. 計算關鍵詞的 Hash 值:將每個關鍵詞透過 MD5 演算法計算出其 128 位的 Hash 值。
  3. 特徵向量計算:根據關鍵詞的 Hash 值構造特徵向量,向量中的每一位根據關鍵詞的權重進行累加。
  4. 降維並生成 SimHash 值:將特徵向量降維,透過每位的正負值生成 128 位的 SimHash 值。
4.3.2 海明距離計算實現

HammingUtils.getHammingDistance 方法用於計算兩個 SimHash 值之間的海明距離,透過逐位比較兩個字串的不同字元數來實現。

4.3.3 相似度計算實現

HammingUtils.getSimilarity 方法基於海明距離計算文字相似度。若海明距離為 -1,則認為相似度為 0,否則相似度為 1 - (海明距離 / SimHash 值長度)

4.4 異常處理

為了增強模組的魯棒性,計算模組在實現過程中加入了對以下異常情況的處理:

  1. 空文字或文字過短:透過丟擲 ShortStringException,提醒呼叫者文字長度不足。
  2. SimHash 值長度不一致:在計算海明距離時檢查 SimHash 值的長度是否一致,不一致則返回 -1 表示錯誤。
  3. 其他異常:使用異常捕獲,確保程式碼在執行過程中即使遇到未預料的情況也能進行合理處理,避免程式崩潰。

五、效能分析

六、單元測試

分別測試主類和工具類

測試主類

  1. 測試樣例文字過短

  1. 測試檔案不存在

  1. 測試總體結果

  1. 主類測試程式碼覆蓋率

測試工具類

  1. 測試HammingUtil的getSimilarity方法

  1. 測試HammingUtil的getHammingDistance方法

  1. 測試結果

  1. 工具類測試程式碼覆蓋率

七、計算模組部分異常處理說明

ShortStringException

  • 設計目標ShortStringException 是一個自定義異常類,用於處理文字長度不足的情況。在 SimHash 值計算過程中,如果輸入的文字長度小於 200 個字元,該異常會被丟擲。設計此異常的目的是防止短文字導致關鍵詞提取失敗或計算結果不準確的情況。
@Test
public void testGetSimHashWithShortText() {
    Exception exception = assertThrows(ShortStringException.class, () -> {
        SimHashUtils.getSimHash("短文字");
    });
    assertEquals("文字過短,難以判斷!", exception.getMessage());
}
  • 錯誤場景:此異常適用於檢測輸入文字過短的情況,例如使用者輸入了非常短的字串或誤將標題、空行當作輸入檔案。這種情況下,系統將丟擲 ShortStringException 並提示使用者文字長度不足。

相關文章