論文查重
這個作業屬於哪個課程 | 首頁 - 軟體工程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類
readTxt
:讀取txt檔案,將內容轉為字串並返回。writeTxt
:傳入相似度,格式化為2位小數,將相似度寫入指定路徑對應的txt。
SimHashUtils類
-
getMD5Hash
:傳入字串,用MD5獲取hash值並返回。 -
getSimHash
:傳入字串,使用hanlp包提取出關鍵詞,然後呼叫getMD5Hash
方法計算出hash值,再算出每個關鍵詞的權重向量,把所有詞的權重向量相累加,得到一個新的權重向量;最後進行降維,對於合併後得到的權重向量,遍歷每一位,如果該位大於0則記為1,小於等於0則記為0,就得到了該文字的SimHash值。(注:由於本人Java剛學,水平有限,綜合考慮關鍵詞在文中出現的次數、關鍵詞在文中的重要性等因素,給每個詞賦予合適的權重,目前暫時把權重統一設為1,導致文字相似度的計算結果的準確度降低)。
HammingAndSimilarity類
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類
pathChecker
:傳入String型別陣列,長度為3,陣列元素為2個要對比的txt檔案路徑以及用於儲存結果的txt。用於檢測陣列的元素個數是否為3個、路徑對應的檔案是否存在、路徑對應的檔案是否是txt格式