| 這個作業屬於哪個課程 | 計科國際班軟工 |
|---|---|
| 這個作業要求在哪里 |
|
| 這個作業的目標 | 編寫論文查重程序 |
1.github倉庫:https://github.com/yyya77/3119009472
2.PSP表格:
| PSP2.1 | Personal Software Process Stages | 預估耗時(分鍾) | 實際耗時(分鍾) |
|---|---|---|---|
| Planning | 計划 | 10 | 10 |
| · Estimate | · 估計這個任務需要多少時間 | 10 | 10 |
| Development | 開發 | 540 | 680 |
| · Analysis | · 需求分析 (包括學習新技術) | 60 | 90 |
| · Design Spec | · 生成設計文檔 | 30 | 60 |
| · Design Review | · 設計復審 | 30 | 40 |
| · Coding Standard | · 代碼規范 (為目前的開發制定合適的規范) | 10 | 10 |
| · Design | · 具體設計 | 60 | 80 |
| · Coding | · 具體編碼 | 300 | 360 |
| · Code Review | · 代碼復審 | 30 | 40 |
| · Test | · 測試(自我測試,修改代碼,提交修改) | 20 | 60 |
| Reporting | 報告 | 50 | 75 |
| · Test Repor | · 測試報告 | 20 | 30 |
| · Size Measurement | · 計算工作量 | 10 | 15 |
| · Postmortem & Process Improvement Plan | · 事后總結, 並提出過程改進計划 | 20 | 30 |
| Sum up | 合計 | 600 | 765 |
3.計算模塊接口的設計與實現過程:
算法分析:
基於Python jieba分詞的漢明距離進行文本相似度分析
整體思想如下:

關於simhash可參照:淺談simhash及其python實現
原理:
simhash是一種局部敏感hash。我們都知道什么是hash。那什么叫局部敏感呢,假定A、B具有一定的相似性,在hash之后,仍然能保持這種相似性,就稱之為局部敏感hash。
在上文中,我們得到一個文檔的關鍵詞,取得一篇文章關鍵詞集合,又會降低對比效率,我們可以通過hash的方法,把上述得到的關鍵詞集合hash成一串二進制,這樣我們直接對比二進制數,看其相似性就可以得到兩篇文檔的相似性,在查看相似性的時候我們采用海明距離,即在對比二進制的時候,我們看其有多少位不同,就稱海明距離為多少。在這里,我是將文章simhash得到一串64位的二進制,一般取海明距離為3作為閾值,即在64位二進制中,只有三位不同,我們就認為兩個文檔是相似的。當然了,這里可以根據自己的需求來設置閾值。
就這樣,我們把一篇文檔用一個二進制代表了,也就是把一個文檔hash之后得到一串二進制數的算法,稱這個hash為simhash。

由此取權重最高的多個值求出兩篇文章的simhash值再進行比較得到漢明距離,最后通過漢明距離求得兩文件的相似度。
在程序中我定義了五個函數一個類以確保程序正常運行:

部分函數代碼:
jieba分詞:

求漢明距離:

算相似率:

4.計算模塊接口部分的性能改進:
性能分析圖:






關系圖:

由性能測試可以看到,由於我使用input()來使用戶輸入文件路徑,所以程序運行很大一部分時間取決於用戶輸入路徑的速度,去除手動輸入時間和time.sleep()結果呈現時間,程序運行約762ms,達到作業要求,同時在測試時的結果得出運行總時長也是在0.8s左右。結果如圖下:

反思:可以優化的地方還有很多,比如簡化輸入路徑,如輸入名字即可找到文件,加快程序總運行速度。
5.計算模塊部分單元測試展示:
測試方法:用循環把想得到的情況都遍歷一遍,得出程序覆蓋率

測試的函數有主函數main()以及主函數里面調用的getDistance(),simHash(),string_hash(),similarity()等。
測試數據構造思路以及測試結果:
1.正常運行;

2.輸入的路徑不正確;

3.輸入的路徑正確但是文本文件內無內容;

測試結果:結果將存入文件result.txt內:

程序覆蓋率100%:

6.計算模塊部分異常處理說明:
1.輸入的路徑不正確;

2.輸入的路徑正確但是文本文件內無內容;

