這個作業屬於哪個課程 | 19網工3軟工 |
---|---|
這個作業要求在哪里 | 個人項目 |
這個作業的目標 | 設計一個論文查重算法,完成軟件設計的個人開發流程 |
1.PSP表格
PSP是卡耐基梅隆大學(CMU)的專家們針對軟件工程師所提出的一套模型:Personal Software Process (PSP, 個人開發流程,或稱個體軟件過程)。
PSP2.1 | Personal Software Process Stages | 預估耗時(分鍾) | 實際耗時(分鍾) |
---|---|---|---|
Planning | 計划 | 20 | 15 |
· Estimate | · 估計這個任務需要多少時間 | 450 | 454 |
Development | 開發 | ||
· Analysis | · 需求分析 (包括學習新技術) | 130 | 140 |
· Design Spec | · 生成設計文檔 | 20 | 20 |
· Design Review | · 設計復審 | 10 | 10 |
· Coding Standard | · 代碼規范 (為目前的開發制定合適的規范) | 10 | 12 |
· Design | · 具體設計 | 30 | 30 |
· Coding | · 具體編碼 | 60 | 40 |
· Code Review | · 代碼復審 | 20 | 24 |
· Test | · 測試(自我測試,修改代碼,提交修改) | 120 | 130 |
Reporting | 報告 | 10 | 10 |
· Test Repor | · 測試報告 | 10 | 10 |
· Size Measurement | · 計算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后總結, 並提出過程改進計划 | 20 | 18 |
Total | · 合計 | 470 | 469 |
2.計算模塊接口的設計與實現過程
中文分詞--friso.dll
整合項目的頭文件--PaperC.h
主程序,負責調用分詞和調用checking.c中的比較函數--papercheck.c
比較函數整合--checking.c
分詞部分
涉及到了數據庫(詞庫)和mmseg算法,數據庫這大類個人不容易實現,調用了github項目中的中文分詞工具Friso,Friso帶有自身的詞庫,vendors。使用時需要將詞庫的所在地址寫入設置文件(friso.ini),並采用UTF-8編碼(txt的中文是UTF-8編碼),配置完成后才可進行下一步。
查重算法
考慮到自身實現不了類似TF-IDF中的逆文檔頻率(大數據,即按詞的逆詞頻和重要度划分合適的權重)。難以實現類似余弦定理的查重的方案。SimHash(局部敏感哈希)考慮的是對相似文檔的比對,只存在相似或者不相似,且需要用到詞權重,暫不考慮。
初步選定N-Gram算法,稍作修改(本質是暴力近似匹配)。
N-Gram算法的變種,以詞為單位(忽略特殊符號和單個標准字符),對查重文檔取連續的xlen長度的詞串,在標准文檔上查找近似最大匹配(每個詞僅一次錯誤區間,同時全部失配不超過長度的5/9,超過則認為不算重復部分)。為了提高效率,查重文檔取xpos的間隔程度進行匹配。最后取重復率的平均值。
具體實現參考checking.c部分
主程序為papercheck.c,完成分詞的調用checking。
3.計算模塊接口部分的性能改進。
按照比較算法,時間復雜度近似為 \(O(xlen*N^2/xpos)\) ,N為文本的詞數。鑒於給定的測試文本不超過6k,能在一個比較優的時間內得到較好的結果(xlen=7,xpos=3)
4.計算模塊部分單元測試展示
五組對比數據,標准為orig.txt
orig_0.8_add.txt,orig_0.8_del.txt,orig_0.8_dis_1.txt,orig_0.8_dis_10.txt,orig_0.8_dis_15.txt
測試使用.bat的批處理文件
批處理cmd運行中...
得出的查重結果:
鑒於空串的比較是無意義的,程序沒有設置針對性判斷。
5.計算模塊部分異常處理說明
暫無
程序運行
papercheck -init friso.ini orig.txt sim.txt report.txt
或者
papercheck orig.txt sim.txt report.txt
friso.ini是Friso的配置文件
orig.txt是標准文檔
sim.txt是查重文檔
report.txt是額外的查重結果輸出文件
log.txt是程序日志,即分詞的結果
結語
- 1.學會了個人項目的完整流程
- 2.對組件編程有了更深入的理解,了解動態庫和鏈接器的使用
- 3.學習了git工具上傳代碼至github以及commit和update。