第二次作业———个人项目
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024 |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136 |
| 这个作业的目标 | <设计查重程序、使用PSP记录、总结心得> |
Github链接:https://github.com/idnhtdt/idnhtdt/commit/1c6c6095a1c27bf03009728b60256dbf292ebb1c
由于本人先前没有使用过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

浙公网安备 33010602011771号