這個作業屬於哪個課程 | 廣工計院計科34班軟工 |
---|---|
這個作業要求在哪裡 | 作業要求 |
這個作業的目標 | 個人獨立完成一次論文查重專案,完成專案後能夠了解專案開發工程流程,學會使用PSP表格,完成效能分析以及測試等 |
GitHub地址:https://github.com/Zhang1chen/3122004589.git
一.需求
題目:論文查重
描述如下:
設計一個論文查重演算法,給出一個原文檔案和一個在這份原文上經過了增刪改的抄襲版論文的檔案,在答案檔案中輸出其重複率。
原文示例:今天是星期天,天氣晴,今天晚上我要去看電影。
抄襲版示例:今天是周天,天氣晴朗,我晚上要去看電影。
要求輸入輸出採用檔案輸入輸出,規範如下:
從命令列引數給出:論文原文的檔案的絕對路徑。
從命令列引數給出:抄襲版論文的檔案的絕對路徑。
從命令列引數給出:輸出的答案檔案的絕對路徑。
我們提供一份樣例,課堂上下發,上傳到班級群,使用方法是:orig.txt是原文,其他orig_add.txt等均為抄襲版論文。
注意:答案檔案中輸出的答案為浮點型,精確到小數點後兩位
二.PSP
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 60 | 80 |
Estimate | 估計這個任務需要多少時間 | 900 | 850 |
Development | 開發 | 350 | 400 |
Analysis | 需求分析 (包括學習新技術) | 40 | 25 |
Design Spec | 生成設計文件 | 30 | 20 |
Design Review | 設計複審 | 30 | 30 |
Coding Standard | 程式碼規範 (為目前的開發制定合適的規範) | 30 | 35 |
Design | 具體設計 | 60 | 40 |
Coding | 具體編碼 | 60 | 70 |
Code Review | 程式碼複審 | 30 | 20 |
Test | 測試(自我測試,修改程式碼,提交修改) | 60 | 40 |
Reporting | 報告 | 40 | 20 |
Test Repor | 測試報告 | 50 | 50 |
Size Measurement | 計算工作量 | 20 | 10 |
Postmortem & Process Improvement Plan | 事後總結, 並提出過程改進計劃 | 30 | 20 |
合計 | 900 | 900 | 850 |
三、演算法與介面設計
1.java.nio.file.Files
模組:java.nio.file
介面/類:Files
功能:提供了對檔案和檔案系統的訪問,支援檔案的讀取、寫入、刪除等操作。
2.java.nio.file.Path
模組:java.nio.file
介面/類:Path
功能:表示檔案系統中的路徑,可以用於指定檔案和目錄的路徑。
3.java.io.BufferedWriter
模組:java.io
介面/類:BufferedWriter
功能:用於高效地寫入字元資料到檔案中。
4. java.util.Set 和 java.util.HashSet
模組:java.util
介面/類:Set 和 HashSet
功能:Set 是一個不允許重複元素的集合介面,HashSet 是 Set 的一個實現類,基於雜湊表。
5. java.lang.String
模組:java.lang
介面/類:String
功能:表示不可變的字元序列,支援字串操作。
函式模組
di
執行結果
第一種輸出的結果的查重率為78.95%。
第二種輸出的結果的查重率為14.81%。
系統的計算模組主要包括以下幾個核心類:
TextProcessor: 負責文字的處理和分詞。
SimilarityChecker: 計算兩個文字之間的相似度。
Main: 處理輸入和輸出,協調其他模組的工作。
1.2 類和函式設計
TextProcessor 類
職責: 處理文字資料,包括清理文字和分詞。
主要函式:
tokenize(String text): 將輸入的文字分詞,並返回詞彙集合。可能會用到正規表示式或分詞庫(如 jieba)來處理文字。
關鍵函式:
tokenize: 該函式負責將原始文字分解為詞彙。它是文字處理的核心,需要保證分詞的準確性,以便後續相似度計算的有效性。
流程圖
SimilarityChecker 類
職責: 計算兩個文字的相似度。
主要函式:
calculateSimilarity(Set
關鍵函式:
calculateSimilarity: 該函式計算兩個集合的交集和並集,用於衡量文字相似度。它的核心在於準確計算交集和並集的大小,以便計算正確的相似度百分比。
流程圖
Main 類
職責: 處理程式的入口點,包括檔案讀取、呼叫處理模組和結果輸出。
主要函式:
main(String[] args): 處理命令列引數,讀取檔案,呼叫 TextProcessor 和 SimilarityChecker,並將結果寫入輸出檔案。
關鍵函式:
main: 作為程式的入口點,負責整體流程控制。它負責將檔案路徑傳遞給 TextProcessor 和 SimilarityChecker,並處理檔案輸入輸出。
流程圖
改進思路
最佳化分詞演算法:
使用更高效的分詞工具: 原始的分詞方法可能效率低下,使用如 jieba 這樣的高效分詞工具可以顯著提高分詞速度和準確性。
避免重複分詞: 確保每段文字只分詞一次,將分詞結果快取起來。
最佳化集合操作:
使用高效的資料結構: HashSet 提供了常數時間複雜度的插入、刪除和查詢操作,相較於其他集合型別可以提高效能。
減少不必要的集合操作: 避免在計算交集和並集時進行多次集合操作。
減少冗餘計算:
快取中間結果: 在計算相似度時,快取文字的分詞結果,避免重複計算。
最佳化相似度計算邏輯: 確保相似度計算中交集和並集的計算是高效的。
單元測試
測試函式程式碼
功能: 測試 SimilarityChecker 類的 calculateSimilarity 方法是否能正確計算文字相似度。
測試資料:
wordsOriginal: Set.of("今天是週日", "天氣晴")
wordsPlagiarized: Set.of("今天是星期天", "天氣晴朗")
預期結果: 50.00%。這是計算出的相似度值。
思路: 透過計算交集和並集的比例來驗證相似度計算的準確性。
TextProcessorTest.java:
測試函式: testTokenize()
功能: 測試 TextProcessor 類的 tokenize 方法是否能正確分詞。
測試資料: 輸入文字 "今天是週日,天氣晴。"。
預期結果: Set.of("今天是週日", "天氣晴")。這是分詞後的預期結果。
思路: 透過手動分詞和 TextProcessor 的輸出進行比對,確保分詞邏輯的正確性。
SimilarityCheckerTest.java:
測試函式: testCalculateSimilarity()