第一次個人程式設計作業

李子聪發表於2024-03-18
這個作業屬於哪個課程 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

相關文章