論文查重

1Chen發表於2024-09-13

論文查重

這個作業屬於哪個課程 首頁 - 軟體工程2024 - 廣東工業大學 - 班級部落格 - 部落格園 (cnblogs.com)
這個作業要求在哪裡 個人專案 - 作業 - 軟體工程2024 - 班級部落格 - 部落格園 (cnblogs.com)
這個作業的目標 編寫能實現文章查重的程式,用git管理程式碼,體驗程式開發的整個流程

一、Github連結

Leunglx/PlagiarismChecker (github.com)

二、PSP表格

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

三、介面的設計與實現

設計流程

SimHash演算法原理:https://www.likecs.com/show-204424165.html

核心函式

TxtUtils類

  1. readTxt:讀取txt檔案,將內容轉為字串並返回。
  2. writeTxt:傳入相似度,格式化為2位小數,將相似度寫入指定路徑對應的txt。

SimHashUtils類

  1. getMD5Hash:傳入字串,用MD5獲取hash值並返回。

  2. getSimHash:傳入字串,使用hanlp包提取出關鍵詞,然後呼叫getMD5Hash方法計算出hash值,再算出每個關鍵詞的權重向量,把所有詞的權重向量相累加,得到一個新的權重向量;最後進行降維,對於合併後得到的權重向量,遍歷每一位,如果該位大於0則記為1,小於等於0則記為0,就得到了該文字的SimHash值。

    (注:由於本人Java剛學,水平有限,綜合考慮關鍵詞在文中出現的次數、關鍵詞在文中的重要性等因素,給每個詞賦予合適的權重,目前暫時把權重統一設為1,導致文字相似度的計算結果的準確度降低)。

HammingAndSimilarity類

  1. SimilarityResult:傳入2個SimHash,計算海明距離(海明距離越小,文字越相似),最後算出文字相似度。

main主模組

  • 流程:讀取輸入的路徑名對應的txt檔案,將內容轉為字串,再分別計算出2個字串對應的SimHash值,然後計算相似度,最後將結果寫入檔案中。

四、效能分析


五、單元測試

部分單元測試程式碼

package utils;

import org.junit.Test;

public class SimHashUtilsTest {
    @Test
    public void getMD5HashTest() {
        String[] words = {"世界", "時時刻刻", "人文精神", "夏天", "的"};
        for(String word: words) {
            System.out.println(SimHashUtils.getMD5Hash(word));
        }
    }

    @Test
    public void getSimHashTest(){
        String str1 = TxtUtils.readTxt("D:/testTxt/orig.txt");
        String str2 = TxtUtils.readTxt("D:/testTxt/orig_0.8_del.txt");
        System.out.println(SimHashUtils.getSimHash(str1));
        System.out.println(SimHashUtils.getSimHash(str2));
    }
}

getMD5HashTest模擬了傳入分出來的關鍵詞給getMD5Hash方法,計算出關鍵詞對應的hash值的情況

getSimHashTest模擬了傳入檔案路徑給getSimHash方法,計算出txt內容轉為字串後對應的SimHash值的情況。

測試覆蓋率

六、異常處理

CheckFilePath類

  1. pathChecker:傳入String型別陣列,長度為3,陣列元素為2個要對比的txt檔案路徑以及用於儲存結果的txt。用於檢測陣列的元素個數是否為3個、路徑對應的檔案是否存在、路徑對應的檔案是否是txt格式

單元測試樣例

相關文章