1. 程式人生 > 其它 >原始Spring Java配置類 實現MVC

原始Spring Java配置類 實現MVC

個人專案

作業課程 軟體工程
作業要求 作業要求
作業任務 設計一個論文查重演算法,給出一個原文檔案和一個在這份原文上經過了增刪改的抄襲版論文的檔案,在答案檔案中輸出其重複率。

MyGitHub

PSP表格

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃
· Estimate · 估計這個任務需要多少時間 600 480
Development 開發
· Analysis · 需求分析 (包括學習新技術) 90 60
· Design Spec · 生成設計文件 20 20
· Design Review · 設計複審 10 10
· Coding Standard · 程式碼規範 (為目前的開發制定合適的規範) 30 20
· Design · 具體設計 60 40
· Coding · 具體編碼 180 120
· Code Review · 程式碼複審 60 30
· Test · 測試(自我測試,修改程式碼,提交修改) 60 90
Reporting 報告
· Test Repor · 測試報告 90 60
· Size Measurement · 計算工作量 10 10
· Postmortem & Process Improvement Plan · 事後總結, 並提出過程改進計劃 20 20
· 合計 630 480

介面的設計與實現過程

流程圖:
專案目錄:
說明:

  • SimHash演算法簡介:SimHash演算法是Google在2007年發表的論文《Detecting Near-Duplicates for Web Crawling》中提到的一種指紋生成演算法,被應用在Google搜尋引擎網頁去重的工作之中。
    簡單的說,SimHash演算法主要的工作就是將文字進行降維,生成一個SimHash值,也就是論文中所提及的“指紋”,通過對不同文字的SimHash值進而比較海明距離,從而判斷兩個文字的相似度。這個演算法主要有以下幾個步驟:
    • 分詞:對給定的一段文字進行分詞,產生n個特徵詞,並賦予每個特徵詞一個權重。比如一段文字為“中國科大計算機系的學生的能力怎麼樣”,產生的特徵詞就應該是“中國科大”、“計算機系”、“的”、“學生”、“能力”、“怎麼樣”,然後對這些詞分別賦予權重,假設有1-5五個分類,分詞之後以上五個詞便會各有一個權重,比如中國科大(4)、計算機系(3)、的(1)、學生(4)、能力(5)、怎麼樣(3)。
      其中,數字越大,代表特徵詞在句子中的重要性就越高。這樣,我們就得到了一個文字的分詞的詞向量和每個詞向量對應的權重
    • 求雜湊值:通過雜湊函式對每一個詞的向量進行對映,產生一個n位二進位制字串。
    • 加權:hash二進位制串中為1的乘以該特徵詞的分詞權重,二進位制串中為0的乘以該特徵詞的分詞權重後取負,繼而得到權重向量
    • 合併:計算出文字分詞的每個向量之後,將所有詞向量的權重向量相累加,得到一個新權重向量
    • 降維:對於前面合併後得到的文字的權重向量,大於0的位置1,小於等於0的位置0,就可以得到該文字的SimHash值。
    • 海明距離:簡單的說,海明距離可以理解為,兩個二進位制串之間相同位置不同的個數。舉個例子,[1,1,1,0,0,0]和[1,1,1,1,1,1]的海明距離就是3。

參考資料:https://blog.csdn.net/Daverain/article/details/80919418

  • 主類:DuplicateCheck.java 用於啟動整個專案

  • 工具類:

    • CalculateUtils:用於將位元組陣列轉換成二進位制字串,求雜湊值和SimHash值等
    • HammingUtils:用於計算漢明距離和相似度
    • IOUtils:用於讀寫檔案
  • 測試類

  • 外部依賴:

計算模組介面部分部分的效能改進

實時記憶體分析圖

呼叫樹

方法的效能情況

可以看到消耗最大的方法是getSimHash,原因是在求simHash時需要通過迴圈進行雜湊值的補位、加權合併和降維,同時也要呼叫jdk API中開銷較大的charAt()方法,同時從實時記憶體分析圖中可以看出佔用記憶體較大的是匯入的HanLP語言處理包,故邏輯方面沒有什麼可以優化的點。

計算模組部分單元測試展示

測試每個工具類中的方法(傳入的都是常規且合法的資料,異常處理會在下面說明)
CalculateUtils

HammingUtils

IOUtils

主類測試

測試亂序對於漢明距離的影響

測試結果

覆蓋率

計算模組部分異常處理說明

無效路徑

用於測試的字串過短

這裡捕捉異常主要是為了檢查jdk版本是否匹配的問題

部署jar包後通過命令列測試