軟體工程 | 計科22級12班 |
---|---|
作業要求 | 第二次作業要求 |
作業目標 | 透過全流程專案實踐,瞭解軟體開發過程中 需要具備的方式與良好的軟體功能必須的測試過程 |
專案地址 github-xuicst
一、專案要求
設計一個論文查重演算法,給出一個原文檔案和一個在這份原文上經過了增刪改的抄襲版論文的檔案,在答案檔案中輸出其重複率。
原文示例:今天是星期天,天氣晴,今天晚上我要去看電影。
抄襲版示例:今天是周天,天氣晴朗,我晚上要去看電影。
要求輸入輸出採用檔案輸入輸出,規範如下:
- 從命令列引數給出:論文原文的檔案的絕對路徑。
- 從命令列引數給出:抄襲版論文的檔案的絕對路徑。
- 從命令列引數給出:輸出的答案檔案的絕對路徑。
注意:答案檔案中輸出的答案為浮點型,精確到小數點後兩位。
二、專案開發記錄
PSP表格
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 40 | 50 |
Estimate | 估計這個任務需要多少時間 | 1460 | 1290 |
Development | 開發 | 600 | 540 |
Analysis | 需求分析 (包括學習新技術) | 40 | 35 |
Design Spec | 生成設計文件 | 60 | 60 |
Design Review | 設計複審 (和同事稽核設計文件) | 50 | 45 |
Coding Standard | 程式碼規範 (為目前的開發制定合適的規範 | 30 | 20 |
Design | 具體設計 | 80 | 70 |
Coding | 具體編碼 | 200 | 160 |
Code Review | 程式碼複審 | 80 | 60 |
Test | 測試(自我測試,修改程式碼,提交修改) | 100 | 80 |
Reporting | 報告 | 60 | 60 |
Test Report | 測試報告 | 60 | 40 |
Size Measurement | 計算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan |
事後總結, 並提出過程改進計劃 | 40 | 50 |
合計 | 1460 | 1290 | |
三、演算法程式碼模組
在開始設計的思路,本查重專案為論文查重,故檔案資訊量不算很大。查重過程中為找出於原始樣本檔案相似,即內容上,語句表述上具有極強的相似程度。因此,採用以詞為單位,.txt
的檔案型別。
本專案採用 Term Frequency-Inverse Document Frequency(TF-IDF)的文字處理方式,統計單個詞在文章出現頻率 \(\text{TF}(t) = \frac{\text{詞} t \text{在文件中出現的次數}}{\text{文件中總詞數}}\)。將提取出的值進行向量化後,計算兩個文字間的相似度,透過 sklearn.metrics.pairwise
庫呼叫cosine_similarity((X: Any, Y: Any)
模組,也就是使用 Cosine Similarity 餘弦相似度進行處理,也就是 \(\text{Cosine Similarity} = \frac{A \cdot B}{||A|| \cdot ||B||}\)。
整體流程圖如下:
四、執行結果與程式碼檢測
-
環境:
Windows 11
PyCharm 2024.2.1 (Community Edition)
Memory: 2008M
Cores: 16
scikit-learn~=1.4.1.post1
jieba~=0.42.1 -
程式碼檢測:
Qodana
介面如下:
五、計算效能
由於在pycharm編譯器中實現專案,故利用cProfile
進行效能分析。
import cProfile
import test_module
cProfile.run('calculate_similarity(orig_file, plag_file)')
六、總結
在專案過程中,查重程式的功能和推廣適用性上還略顯稚嫩。在後續中,更加完整的考慮專案實現的系統性和多樣測試的需要。