第一次个人编程作业
| 这个作业属于哪个课程 | 软 件 工 程 |
|---|---|
| 这个作业要求在哪里 | 作 业 要 求 |
| 这个作业的目标 | 实现查重功能,性能分析与性能优化,单元测试与异常处理,记录PSP表格 |
写在前面的后记
在做完这个项目之前我都没想过不到100行就能搞定。。。只能说不愧是python?
使用了很多现成的库,可能这就是站在巨人肩膀上的感觉?
当然这也不代表编码时间有所缩短,第一是simhash、余弦以及其他的查重算法都尝试过才最终选择了其中一种,第二是现成库里的算法用自己的代码复现
My github

PSP预计
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 40 | |
| Estimate | 估计这个任务需要多少时间 | 10 | |
| Development | 开发 | 300 | |
| Analysis | 需求分析 (包括学习新技术) | 120 | |
| Design Spec | 生成设计文档 | 20 | |
| Design Review | 设计复审 | 20 | |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | |
| Design | 具体设计 | 40 | |
| Coding | 具体编码 | 240 | |
| Code Review | 代码复审 | 60 | |
| Test | 测试(自我测试,修改代码,提交修改) | 60 | |
| Reporting | 报告 | 90 | |
| Test Repor | 测试报告 | 20 | |
| Size Measurement | 计算工作量 | 20 | |
| Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | |
| 合计 | 1110 |
实现原理
导入文本→文档清洗→jieba分词→gensim计算相似度→输出结果
获取食材 → 清洗食材 → 食材切削 → 调理开灶烹饪食材 → 装盘上菜
导入文本
代码如下:
def Leading_in(path):
str=""
file = open(path, 'r', encoding='UTF-8')
for line in file.readlines():
str+=line
file.close()
return str
文档清洗
使用正则表达式清除掉标点符号
代码:
def clean_txt(str):
clean = "[^0-9A-Za-z\u4e00-\u9fa5]"
#清洗所有标点符号以及html标签
return sub(clean, '', str)
jieba分词
用jieba库分词,将字符串分解成词组便于后续处理
代码:
def spilt_txt(str):
str = lcut(str, cut_all=False)
#以精确模式分词
return str
gensim计算相似度
之后的优化会将只出现一次的词组删去,这些词组并不会贡献任何有效数据。
- 基于原文的词典,将词典转化为稀疏向量并建立词料库
通过TF模型算法,用词料库训练TF-IDF模型(此步骤ver1.1暂时有问题,而且很可能是不需要的环节)- 通过token2id得到特征数(字典里面的键的个数)
- 将抄袭文的词典也转化为稀疏向量
- 原文与抄袭文的稀疏向量进行余弦定理计算得出重复度
代码(ver1.1):
def Similarity(str1,str2):
dictionary = gensim.corpora.Dictionary([str1]) # 建立词典
num_features = len(dictionary.token2id) #得到特征数
corpus = [dictionary.doc2bow(str1)] #基于词典建立语料库
new_vec = dictionary.doc2bow(str2) #建立检验文档的稀疏向量
tf = gensim.models.TfidfModel(corpus) #创建TF模型训练语料库
corpus_tf = tf[corpus]
new_vec_tf = tf[new_vec]
index = gensim.similarities.SparseMatrixSimilarity(corpus_tf, num_features)
sim = index[new_vec_tf]
#暂有问题,仍需改进

↑成功建立tf模型但无法训练语料库
ver1.0代码(可正确工作)
def Similarity(str1,str2):
dictionary = gensim.corpora.Dictionary([str1,str2])
corpus = [dictionary.doc2bow(text) for text in (str1,str2)]
#tf = gensim.models.TfidfModel(corpus)
#corpus_tf = tf[corpus]
similarity = gensim.similarities.Similarity('-Similarity-index', corpus, num_features=len(dictionary))
org_corpus = dictionary.doc2bow(str1)
#new_vec_tf = tf[new_vec]
sim = similarity[org_corpus][1]
#该代码直接计算两个文本的稀疏向量,也许不需要建立语料库而是直接对比就可以满足需求
return sim
异常处理

当cmd参数输入不正确时出现提示
单元测试结果

自己加入了一个orig_copy,即原文的复制文件加入查重
性能分析


覆盖率

PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 40 | 30 |
| Estimate | 估计这个任务需要多少时间 | 10 | 10 |
| Development | 开发 | 300 | 300 |
| Analysis | 需求分析 (包括学习新技术) | 120 | 180 |
| Design Spec | 生成设计文档 | 20 | 20 |
| Design Review | 设计复审 | 20 | 30 |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
| Design | 具体设计 | 40 | 30 |
| Coding | 具体编码 | 240 | 240 |
| Code Review | 代码复审 | 60 | 30 |
| Test | 测试(自我测试,修改代码,提交修改) | 60 | 50 |
| Reporting | 报告 | 90 | 120 |
| Test Repor | 测试报告 | 20 | 20 |
| Size Measurement | 计算工作量 | 20 | 10 |
| Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 70 |
| 合计 | 1110 | 1150 |

浙公网安备 33010602011771号