第一次个人编程作业

这个作业属于哪个课程 软 件 工 程
这个作业要求在哪里 作 业 要 求
这个作业的目标 实现查重功能,性能分析与性能优化,单元测试与异常处理,记录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
posted @ 2020-09-24 17:51  kishi_kano  阅读(209)  评论(0)    收藏  举报