這個作業屬於哪個課程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024 |
---|---|
這個作業要求在哪裡 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136 |
這個作業的目標 | <設計查重程式、使用PSP記錄、總結心得> |
由於本人先前沒有使用過python開發經驗,因此本次作業可能有些地方不和規範,敬請原諒。
Part 1 PSP表格
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 10 | 15 |
- Estimate | - 估計這個任務需要多少時間 | 10 | 15 |
Development | 開發 | 360 | 900 |
- Analysis | - 需求分析 (包括學習新技術) | 90 | 400 |
- Design Spec | - 生成設計文件 | 30 | 20 |
- Design Review | - 設計複審 | 30 | 10 |
- Coding Standard | - 程式碼規範 (為目前的開發制定合適的規範) | 30 | 30 |
- Design | - 具體設計 | 30 | 30 |
- Coding | - 具體編碼 | 100 | 350 |
- Code Review | - 程式碼複審 | 20 | 10 |
- Test | - 測試(自我測試,修改程式碼,提交修改) | 30 | 50 |
Reporting | 報告 | 80 | |
- Test Repor | - 測試報告 | 40 | |
- Size Measurement | - 計算工作量 | 20 | |
- Postmortem & Process Improvement Plan | - 事後總結, 並提出過程改進計劃 | 20 | |
合計 | 450 |
Part 2 個人的理解
經過查閱網上資料後大致理解了查重的方法,主要分為四步:
1 .去除標點符號、移除停用詞等等。
2 .對輸入的文章進行文字切分,對文字使用不同方法進行切分。
3 .特徵構建,構建出一個可以代表本文的向量或集合。
4 .使用度量方法,不同場景下可用不同的度量方法。
在看過一些資料後發現主要在三四步有較多的方法,並在網上搜尋線上文字相似度嘗試作業所給的樣本後發現不同演算法有不同的相似度,有的差異較大。後來在閱讀一篇文章中作者指出有些演算法適合的使用地方。在本次專案中,本人在分詞上採用的時jieba分詞,但對於後面兩步嘗試了三種辦法。(感覺在自己餘弦使用的特徵向量不對並且認為相似度結果不對 就查了一下如何使用gensim製作出特徵向量並計算相似度 但能力有限因此沒有理解其原理)
Part 3介面設計及實現
主要分為對文字的淨化處理和計算相似度。
淨化處理使用re.sub去除標點換行等
計算函式分為三種:
1.使用集合計算相似度
2.使用向量和餘弦計算相似度
2.呼叫gensim來計算
Part 4 主要計算相似度程式碼及結果展示
Jaccrd
def jaccard(word_a, word_b):
word_a = set(word_a) # 去除重複項
word_b = set(word_b)
full = word_a | word_b
over = word_a & word_b
per = float(len(over)/len(full))
return per
gensim
def cos_gesim(base, cmp): # 借鑑網上的方法
texts = [base, '']
keyword = cmp
texts = [lcut(text) for text in texts] # 劃分詞 (原本嘗試在progress後在輸入函式,但tfidf模型產生不出向量集)
dictionary = Dictionary(texts) # 創立原文字典對應語料庫
corpus = [dictionary.doc2bow(text) for text in texts]
new_vec = dictionary.doc2bow(lcut(keyword)) # 建立對比文字典對應語料庫
num_features = len(dictionary.token2id) # 計算原文字典關鍵詞數
tfidf = TfidfModel(corpus) # 匯入tfidf計算每個詞的重要程度
index = SparseMatrixSimilarity(tfidf[corpus], num_features) # 相似度計算
sim = index[tfidf[new_vec]]
return sim[0]
向量
def cos_distance(word_a, word_b):
word_a = set(word_a)
word_b = set(word_b)
full = word_a | word_b
vec1 = []
vec2 = []
for item in full:
if item in word_a:
vec1.append(1)
else:
vec1.append(0)
for item in full:
if item in word_b:
vec2.append(1)
else:
vec2.append(0)
vec1 = np.array(vec1)
vec2 = np.array(vec2)
cos_sim = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
return cos_sim