軟件工程 | 網工1934 |
---|---|
作業要求:
1、在Github倉庫中新建一個學號為名的文件夾。 2、在開始實現程序之前,在PSP表格記錄下你估計在程序開發各個步驟上耗費的時間,在你實現程序之后,在PSP表格記錄下你在程序的各個模塊上實際花費的時間。 3、編程語言不限,將編譯好的程序發布到Github倉庫中的releases中 4、提交的代碼要求經過Code Quality Analysis工具的分析並消除所有的警告。 5、完成項目的首個版本之后,請使用性能分析工具Studio Profiling Tools來找出代碼中的性能瓶頸並進行改進。 6、使用Github[附錄3]來管理源代碼和測試用例,代碼有進展即簽入Github。簽入記錄不合理的項目會被助教抽查詢問項目細節。 7、使用單元測試[附錄4]對項目進行測試,並使用插件查看測試分支覆蓋率等指標;寫出至少10個測試用例確保你的程序能夠正確處理各種情況。 |
作業要求 |
作業目標: 設計一個論文查重算法,給出一個原文文件和一個在這份原文上經過了增刪改的抄襲版論文的文件,在答案文件中輸出其重復率。 |
一、PSP表格
PSP2.1 | Personal Software Process Stages | 預估耗時(分鍾) | 實際耗時(分鍾) |
---|---|---|---|
Planning | 計划 | ||
· Estimate | · 估計這個任務需要多少時間 | 1390 | 1650 |
Development | 開發 | ||
· Analysis | · 需求分析 (包括學習新技術) | 250 | 300 |
· Design Spec | · 生成設計文檔 | 60 | 120 |
· Design Review | · 設計復審 | 30 | 20 |
· Coding Standard | · 代碼規范 (為目前的開發制定合適的規范) | 60 | 30 |
· Design | · 具體設計 | 120 | 180 |
· Coding | · 具體編碼 | 450 | 600 |
· Code Review | · 代碼復審 | 120 | 80 |
· Test | · 測試(自我測試,修改代碼,提交修改) | 120 | 210 |
Reporting | 報告 | ||
· Test Repor | · 測試報告 | 40 | |
· Size Measurement | ·計算工作量 | 20 | 30 |
· Postmortem & Process Improvement Plan | · 事后總結, 並提出過程改進計划 | 60 | 80 |
· | · 合計 | 1390 | 1650 |
二、計算模塊接口與實現
1、主要實現類
主類:
PaperCheck:main方法接受命令行傳入的數據,調用其他工具類進行文件的輸入輸出、計算simhash值以及海明距離,最后結束程序的運行。
工具類:
IOText:文件讀取工具類,控制文件的讀入和輸出。
Simhash:計算simhash值工具類,傳入IOText類讀取的字符型數據,計算文件的simhash值。
Hamming:計算海明距離工具類,傳入兩個文件的simhash值,計算兩文件的海明距離。
外部依賴:com.hankcs.hanlp(漢語言處理包)
項目結構:
2、關鍵函數的分析與實現
分析:實現論文查重的關鍵在於相似度算法,在查詢網上資料后,我決定使用simhash+海明距離算法。
實現:
看不懂?沒有關系,我幫你簡化一下:
simhash算法分為5個步驟:分詞、hash、加權、合並、降維,具體過程如下所述:
(1)分詞
給定一段語句,進行分詞,得到有效的特征向量,然后為每一個特征向量設置1-5等5個級別的權重(如果是給定一個文本,那么特征向量可以是文本中的詞,其權重可以是這個詞出現的次數)。例如給定一段語句:“CSDN博客結構之法算法之道的作者July”,分詞后為:“CSDN 博客 結構 之 法 算法 之 道 的 作者 July”,然后為每個特征向量賦予權值:CSDN(4) 博客(5) 結構(3) 之(1) 法(2) 算法(3) 之(1) 道(2) 的(1) 作者(5) July(5),其中括號里的數字代表這個單詞在整條語句中的重要程度,數字越大代表越重要。
(2)hash
通過hash函數計算各個特征向量的hash值,hash值為二進制數01組成的n-bit簽名。比如“CSDN”的hash值Hash(CSDN)為100101,“博客”的hash值Hash(博客)為“101011”。就這樣,字符串就變成了一系列數字。
(3)加權
在hash值的基礎上,給所有特征向量進行加權,即W = Hash * weight,且遇到1則hash值和權值正相乘,遇到0則hash值和權值負相乘。例如給“CSDN”的hash值“100101”加權得到:W(CSDN) = 100101 4 = 4 -4 -4 4 -4 4,給“博客”的hash值“101011”加權得到:W(博客)=101011 5 = 5 -5 5 -5 5 5,其余特征向量類似此般操作。
(4)合並
將上述各個特征向量的加權結果累加,變成只有一個序列串。拿前兩個特征向量舉例,例如“CSDN”的“4 -4 -4 4 -4 4”和“博客”的“5 -5 5 -5 5 5”進行累加,得到“4+5 -4+-5 -4+5 4+-5 -4+5 4+5”,得到“9 -9 1 -1 1”。
(5)降維
對於n-bit簽名的累加結果,如果大於0則置1,否則置0,從而得到該語句的simhash值,最后我們便可以根據不同語句simhash的海明距離來判斷它們的相似度。例如把上面計算出來的“9 -9 1 -1 1 9”降維(某位大於0記為1,小於0記為0),得到的01串為:“1 0 1 0 1 1”,從而形成它們的simhash簽名。
具體內容可參考:
三、計算模塊接口部分的性能改進
從上圖可以看出調用次數最多的是com.hankcs.hanlp包提供的接口, 即分詞、取關鍵詞與計算詞頻花費了最多的時間。
四、模塊部分單元測試展示
1、Simhash類測試
測試結果截圖:
2、Hamming類測試
測試結果截圖:
3、Papercheck類測試
測試結果截圖:
4、代碼覆蓋率
(有些異常沒有發生,catch代碼沒有運行)
五、模塊部分異常處理說明
通過測試不難發現:當文件為空的時候,程序會報錯
因此我們可以在讀完文件后加一個判斷條件
六. 項目程序功能測試
運行結果截圖: