基於tf-idf的論文查重
github地址:https://github.com/gomevie/gomevie/tree/main
這個作業屬於哪個課程 | 廣工計院計科34班軟工 |
---|---|
這個作業要求在哪裡 | 作業要求 |
這個作業的目標 | 設計並實現一個論文查重演算法,透過比較原文和抄襲版論文檔案,計算並輸出重複率。 |
PSP表格
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 60 | 60 |
Estimate | 估計這個任務需要多少時間 | 700 | 730 |
Development | 開發 | 200 | 150 |
Analysis | 需求分析 (包括學習新技術) | 60 | 90 |
Design Spec | 生成設計文件 | 30 | 30 |
Design Review | 設計複審 | 30 | 30 |
Coding Standard | 程式碼規範 (為目前的開發制定合適的規範) | 20 | 30 |
Design | 具體設計 | 60 | 60 |
Coding | 具體編碼 | 60 | 60 |
Code Review | 程式碼複審 | 30 | 30 |
Test | 測試(自我測試,修改程式碼,提交修改) | 60 | 90 |
Reporting | 報告 | 40 | 30 |
Test Repor | 測試報告 | 40 | 30 |
Size Measurement | 計算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事後總結, 並提出過程改進計劃 | 30 | 30 |
合計 | 730 | 730 |
模組介面設計
資料處理模組
該模組負責處理輸入和輸出的檔案。
read_file(file_path)函式
功能:讀取檔案內容。
輸入:檔案路徑(字串)。
輸出:檔案內容(字串)。
異常處理:需要處理檔案不存在或無法讀取的異常。
write_output(file_path, similarity)函式
功能:將計算得到的相似度寫入檔案。
輸入:檔案路徑(字串),相似度(浮點數)。
輸出:無(操作是寫檔案)。
異常處理:需要處理檔案寫入錯誤。
分析模組
該模組負責文字的分詞和相似度計算。
tokenize(text)函式
功能:使用jieba進行中文分詞。
輸入:原始文字(字串)。
輸出:分詞後的列表。
異常處理:處理文字為空或分詞失敗的情況。
calculate_similarity(original_tokens, plagiarized_tokens)函式
功能:計算兩組分詞的TF-IDF向量的餘弦相似度。
輸入:原文分詞列表,抄襲版分詞列表。
輸出:相似度百分比(浮點數)。
異常處理:處理分詞列表為空或TF-IDF計算失敗的情況。
程式碼的獨到之處
使用TF-IDF進行文字相似度計算:
利用TF-IDF(詞頻-逆文件頻率)演算法來轉換文字資料為可以進行數學運算的向量形式,這是一種在文字挖掘中常用的技術,能夠較好地反映文字的語義資訊。
餘弦相似度的應用:
透過計算兩個向量之間的餘弦相似度來評估文字間的相似性,這是一種有效衡量文字相似度的方法,特別是在處理高維資料時。
jieba分詞的利用:
對中文文字進行有效分詞,jieba是中文自然語言處理中廣泛使用的庫,其準確性和效率都經過了實踐的檢驗。
異常處理和環境檢查:
在寫入輸出檔案之前檢查目錄是否存在,如果不存在則建立,這種對執行環境的檢查可以避免常見的檔案操作錯誤。
命令列引數的使用:
透過命令列引數接收檔案路徑,使得程式更加靈活,易於整合到其他系統或工作流中。
程式碼實現了一個結構清晰、模組化良好的論文查重系統。它使用了先進的文字處理技術(如TF-IDF和餘弦相似度),並結合了有效的中文分詞工具(jieba),這些都是文字相似度分析中的關鍵技術。程式碼的模組化和麵向物件的設計提高了其可維護性和可擴充套件性,而異常處理和環境檢查則增強了程式的健壯性。
流程圖:
效能分析
在執行了analye_pstats.py後可以獲取累計時間前十的函式並列印詳細資訊。
終端執行 snakeviz profiling_results.stats
後可以獲取視覺化結果:
概覽
總執行時間:程式的總執行時間為 1.57 秒。
呼叫棧深度:當前顯示的呼叫棧深度為 10 層。
截止值:設定的截止值為 1/1000,這意味著只有超過總時間 0.1% 的函式才會顯示。
效能資料
呼叫次數:1 次
總時間:0.3666 秒
每次呼叫時間:0.3666 秒
累計時間:0.3666 秒
這個內建方法的呼叫次數和每次呼叫時間表明它可能是一個效能熱點。exec 方法通常用於執行動態的 Python 程式碼,這可能是在執行時編譯和執行程式碼,這可能是一個耗時的操作。
main.py:1(
總時間:1.57 秒
這表示 main.py 的入口點(if name == "main":)的總執行時間。這個時間包括了所有從這個點開始的函式呼叫。
單元測試
測試用例名稱:
test_calculate_similarity_invalid_value:這個測試用例的名稱表明它旨在測試計算文字相似度時,對於非法或異常值的處理。
測試目標:
測試查重系統在遇到無效或非預期輸入時的行為。這可能包括測試演算法的魯棒性,確保它能夠處理異常情況,如非法的輸入資料或計算過程中可能出現的錯誤。
測試方法:
使用了 unittest.mock.patch 來模擬 cosine_similarity 函式的行為。這是一種常見的測試技巧,用於在測試過程中控制和測試依賴項的行為,而不需要實際執行依賴項的程式碼。
測試執行:
測試透過模擬 cosine_similarity 函式返回一個固定的值(在這裡是 np.array([[1.0]])),來測試當函式返回最大相似度(100%)時,查重系統是否能夠正確處理並返回預期的結果。
測試結果:
測試執行成功,沒有發現錯誤或異常,表明在模擬的條件下,查重系統能夠正確處理輸入並返回預期的輸出。
異常處理
檔案不存在(FileNotFoundError)
場景:當嘗試讀取一個不存在的檔案時,會引發 FileNotFoundError。
原因:可能是因為檔案路徑錯誤、檔案未建立或被刪除。
處理:捕獲此異常並提醒使用者檢查檔案路徑,可能需要提供正確的檔案路徑或建立檔案。
檔案讀取許可權問題(PermissionError)
場景:當程式嘗試讀取一個沒有讀取許可權的檔案時,會引發 PermissionError。
原因:可能是因為檔案許可權設定限制了當前使用者的訪問,或者檔案正被另一個程式使用。
處理:捕獲此異常並提醒使用者檢查檔案許可權或關閉佔用檔案的程式。
分詞過程中的異常(如 jieba 內部錯誤)
場景:在使用 jieba 進行分詞時,如果遇到無法處理的字元或內部錯誤,可能會引發異常。
原因:可能是因為輸入文字包含特殊字元或編碼問題。
處理:捕獲異常並提醒使用者檢查輸入文字,可能需要清洗資料或轉換編碼。
相似度計算中的異常
場景:在計算文字相似度時,如果輸入資料格式不正確或存在其他問題,可能會引發異常。
原因:可能是因為向量資料不相容或演算法實現中的錯誤。
處理:捕獲異常並檢查輸入資料的格式和有效性,確保資料適合進行計算。
寫入檔案時的許可權問題(PermissionError)
場景:嘗試寫入一個沒有寫入許可權的檔案或目錄時,會引發 PermissionError。
原因:可能是因為目錄許可權設定限制了當前使用者的寫入操作。
處理:捕獲異常並提醒使用者檢查目錄許可權,可能需要更改許可權或選擇其他目錄。
目錄建立失敗(OSError)
場景:當嘗試建立一個目錄,但因為路徑錯誤、磁碟空間不足或其他系統錯誤而失敗時,會引發 OSError。
原因:可能是因為路徑無效、磁碟空間不足或檔案系統錯誤。
處理:捕獲異常並提醒使用者檢查路徑和磁碟狀態,可能需要清理磁碟空間或修復檔案系統。
命令列引數不足(SystemExit)
場景:當程式期望的命令列引數數量不滿足時,會引發 SystemExit。
原因:可能是因為使用者忘記提供必要的引數。
處理:捕獲異常並提醒使用者檢查命令列引數,提供正確的使用方法。