這個作業屬於哪個課程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/ |
---|---|
這個作業要求在哪裡 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136 |
這個作業的目標 | 熟悉個人軟體開發流程、熟悉各類工具的使用,學會用工具評估程式質量並最佳化程式 |
github連結:https://github.com/w0coder/3122004625
設計與實現:
程式總共分為兩個部分,讀取資料和計算相似度。本次採用的是基於詞頻統計的餘弦相似度的演算法,所用語言為C++。
這兩個部分可以分出來3個函式:
讀取檔案的函式、統計詞頻的函式、計算餘弦相似度的函式。
讀取檔案的函式直接用cpp的檔案讀寫流讀取。
統計詞頻則需要維護一個雜湊表,其中以詞為鍵,出現的次數為值,中文的詞並不容易區分,所有直接計算每個字的個數,而英文的詞則可以簡單的用相連的字母粗略的表示一個詞。
計算餘弦相似度則利詞字頻統計函式得出的兩張雜湊表進行計算,遍歷兩張雜湊表,更具所組成的詞頻向量,計算它們的點積。
效能改進:
從下圖可以看出,效能主要消耗在詞頻統計時雜湊表的維護,其中主要是雜湊表的插入和查詢消耗大。
而基於詞頻的演算法本身就需要遍歷所有的字詞,統計時必然開銷較大,暫時沒想到最佳化方法。
開銷最大的函式:
單元測試展示:
計算部分的測試:
透過兩個字串,模擬文字輸入的資訊,選擇不同的字串進行統計詞頻和計算相似度的操作。
用例構造:測試邊緣的計算-最左邊最右邊為特殊符號或中文或英文或數字的字串;同樣的詞順序調換,測試結果是否和理論符合;部分刪減的測試;部分字詞(不包括英文符號)替換的測試;(測試用例在該函式前的註釋中)
樣例測試結果:
綜合測試直接在cmd中輸入引數,依據 exe檔案絕對路徑 原文檔案絕對路徑 其他檔案絕對路徑 輸出檔案絕對路徑 的格式輸入相關引數。
部分引數取自儲存到TestTxt\MyTxt檔案中的文字檔案,該資料夾中的檔案是從B站同一up主的不同圖文中複製貼上的,其中測試了同一片文章自己比較,不同文章一一比較的結果,並寫入了同資料夾中的ans.txt檔案中,相似度如下:
部分引數取自儲存到TestTxt\MyTxt_01檔案中的文字檔案,該資料夾中的文字隨機取自B站上的圖文,輸出結果在同目錄的ans.txt檔案中,相似度如下:
異常處理說明:
當輸入的檔案絕對路徑不正確時,報錯並結束程式。
計算餘弦相似度時,向量的模的平方過大時可能會溢位,計算時採用double,溢位後並未處理。
檔案過大,字數過多時,未處理。
檔案編碼格式不相容時,未處理。
附錄:
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 40 | 60 |
· Estimate | · 估計這個任務需要多少時間 | 40 | 60 |
Development | 開發 | 990 | 705 |
· Analysis | · 需求分析 (包括學習新技術) | 240 | 180 |
· Design Spec | · 生成設計文件 | 60 | 40 |
· Design Review | · 設計複審 | 30 | 20 |
· Coding Standard | · 程式碼規範 (為目前的開發制定合適的規範) | 30 | 15 |
· Design | · 具體設計 | 90 | 60 |
· Coding | · 具體編碼 | 240 | 270 |
· Code Review | · 程式碼複審 | 60 | 30 |
· Test | · 測試(自我測試,修改程式碼,提交修改) | 120 | 90 |
Reporting | 報告 | 150 | 130 |
· Test Repor | · 測試報告 | 60 | 70 |
· Size Measurement | · 計算工作量 | 45 | 30 |
· Postmortem & Process Improvement Plan | · 事後總結, 並提出過程改進計劃 | 45 | 30 |
· 合計 | 1060 | 895 |