软工作业2:实现简易论文查重(python)

发布时间 2023-09-17 11:28:01作者: zhaowendao123456
这个作业属于哪个课程 计科21级12班
这个作业要求在哪里 个人项目
这个作业的目标 熟悉个人软件开发流程

Github地址:zhaowendao123456/3121005137 (github.com)

一、PSP表格

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

二、需求分析

​ 设计一个查重算法,用于计算两篇文档的重复率。

三、设计文档

3.1查重算法实现原理

3.1.1TF-IDF权重计算

​ TF即词频,用于描述词汇在文档中的权重,通过该词汇在文档中出现的次数来计算。

​ IDF即逆文档频率,由于在文档中“停用词”出现频率最高,而该类词汇对语义影响较小,而部分词汇在文档集合中占比较小而在待测试文档中词频较高,可以认为该类词汇对语义影响较大。因此引入逆文档频率计算权重。计算公式如下:
$$
idf=log(\frac{N}{df})
$$
使得低频词汇IDF较高,高频词汇IDF较低。

​ 使用Wi表示每个词汇权重,公式如下:
$$
Wi=df\times idf
$$

3.1.2余弦相似性算法计算文本相似度

​ 通过TF-IDF算法将待测文章向量化后,通过余弦定理计算两向量D1,D2的余弦值,当cos(D1,D2)趋近于1,文章相似度高,反之相似度低,高维向量余弦定理公式如下:
$$
cos\Theta=\frac{\sum w_k(D_1)\times w_k(D_2)}{\sqrt(\sum w_k^2(D_1)\times w_k^2(D2))}
$$

3.2实现思路

​ 原理解释清楚后,代码实现思路就非常清晰了。首先从本地读取两篇待测文档,将文本进行分词并统计各个词汇数量,分别通过TF-IDF算法计算每个词汇权重,将两篇文本向量化。将向量带入余弦定理公式计算相似度。各个模块也是沿着这个思路逐一实现。

3.3模块接口及功能说明

模块 说明
Count 将文本分成词汇,通过jieba库实现
MergeWord 合并两篇文档的关键词
Vector 得出文档向量,通过TF算法实现
CosCount 余弦相似度计算

四、测试报告

4.1性能测试

​ 该性能测试使用Pycharm测试工具。test函数调用所有函数,因此不考虑其运行时间,从表中可知,Vector计算文档向量函数占用时间较长。

4.2结果测试

​ 首先测试两个测试文本,其文本内容如下:

​ 通过计算,得到文本相似度为0.535,因此,可以认为该项目精确度尚可。

​ 通过该项目计算课堂提供测试样例的结果如下表:

与原文orig.txt对比的文件 相似度
orig_0.8_del.txt 0.576
orig_0.8_del_add.txt 0.998
orig_0.8_dis_1.txt 0.578
orig_0.8_dis_10.txt 0.578
orig_0.8_dis_15.txt 0.578

其结果截图如下: