個人第一次程式設計作業
這個作業屬于哪個課程 | 班級連結 |
---|---|
這個作業要求在哪裡 | 作業連結 |
這個作業的目标1 | 論文查重算法設計 |
這個作業的目标2 | 學習PSP表格 |
這個作業的目标3 | 單元測試 |
這個作業的目标4 | Profile性能分析 |
這個作業的目标5 | Git管理 |
代碼連結(Python)
- 寫在前面的話:本次作業使用Python完成。
- Github連結
- 可運作的exe檔案已釋出至倉庫的release包内
PSP表格
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 30 | 45 |
· Estimate | · 估計這個任務需要多少時間 | ||
Development | 開發 | 180 | 345 |
· Analysis | · 需求分析 (包括學習新技術) | 20 | |
· Design Spec | · 生成設計文檔 | 15 | |
· Design Review | · 設計複審 | ||
· Coding Standard | · 代碼規範 (為目前的開發制定合适的規範) | 5 | 10 |
· Design | · 具體設計 | 50 | |
· Coding | · 具體編碼 | 60 | 150 |
· Code Review | · 代碼複審 | ||
· Test | · 測試(自我測試,修改代碼,送出修改) | ||
Reporting | 報告 | 75 | 85 |
· Test Repor | · 測試報告 | ||
· Size Measurement | · 計算工作量 | ||
· Postmortem & Process Improvement Plan | · 事後總結, 并提出過程改進計劃 | ||
· 合計 | 570 | 945 |
計算子產品接口的設計與實作過程
整體流程
- 建立了一個Text類和兩個函數(get_word_vector和cos_dist)
- 建立Text執行個體,調用Text類中的get_word_list函數分割字元串(這裡程式可以選擇兩種分割字元串的方法,一種是調用re包逐字分割,另一種是使用jieba包逐詞分割),并傳回清單
- 使用get_word_vector函數将字元清單轉換為向量
- 使用餘弦相似度函數(cos_dist)計算兩個字元清單的餘弦相似度
工程截圖
一共有三個檔案,main.py檔案,test.py檔案和text.py檔案
1、整體流程
2、函數方法
- main函數:主函數
- get_word_list函數:将字元串轉換為字元清單
- get_word_vector 函數:将字元清單轉換為向量
- cos_dist函數:計算餘弦相似度(核心算法)
3、核心算法
餘弦相似度:
性能分析
這裡使用專業版pycharm内置的profile進行性能分析
容易看出,擷取字元清單向量的操作占了程式大部分的時間(輸入輸出的時間除外)
原因是get_word_vector中擷取向量需要使用雙重for循環:
def get_word_vector(word_list1, word_list2):
key_word = list(set(word_list1 + word_list2))
# 給定形狀和類型的用0填充的矩陣存儲向量
word_vector1 = np.zeros(len(key_word))
word_vector2 = np.zeros(len(key_word))
# 計算詞頻
# 依次确定向量的每個位置的值
for i in range(len(key_word)):
# 周遊key_word中每個詞在句子中的出現次數
for j in range(len(word_list1)):
if key_word[i] == word_list1[j]:
word_vector1[i] += 1
for k in range(len(word_list2)):
if key_word[i] == word_list2[k]:
word_vector2[i] += 1
return word_vector1, word_vector2
異常處理與單元測試
1.異常處理說明
對每種異常的情況進行提示并且傳回特定的值,友善測試子產品中的assertEqual方法進行驗證
路徑錯誤
檔案為空
2. test子產品測試
- 測試正常讀取
- 測試錯誤讀取
調用unittest包編寫了10個測試用例,主要對出現不存在路徑和空檔案的情況進行測試。