第一个项目作业
写在前面
| 这个作业属于哪个课程 | 软件工程 |
|---|---|
| 这个作业要求在哪里 | 作业要求 |
| 这个作业的目标 | 实现论文查重功能 + 学习并掌握项目进度的规划与管理 + 学习掌握使用Github进行代码的版本管理 + 学习掌握编写单元测试 |
一、需求
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
- 原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
- 抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
- 从命令行参数给出:论文原文的文件的绝对路径。
- 从命令行参数给出:抄袭版论文的文件的绝对路径。
- 从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
二、流程设计

2.1 开发环境
- 编程语言: Java 8
- 集成开发环境:IDEA 2021.1.1
- 单元测试工具:JUnit 4.13.1
- 性能分析工具: JProfiler 9.2.1
2.3 类的设计
convertUtils :工具转换类,实现txt转String,与将结果写入txt的功能
cuttingWordsUtil :长字符串分割类,调用HanLp分词工具进行关键词提取
calcSimilarityUtil :计算文本的相似度的工具类,包含全部相似度的相关计算
Application :运行类,调用写好的工具类进行计算并得到直接得到相似度结果

2.4 Package 结构


2.5 计算文本相似度的算法
SimHash + HammingDistance
2.5.1 简介
simHash的主要思想是降维,将高维的特征向量映射成一个低维的特征向量,又因为它的局部敏感性(局部敏感性指的是非常相似的文本,即便只差一个字符,md5后的序列也可能非常不同,但是simHash之后的序列可能只是某几位不同),通过比较两个向量的Hamming Distance来确定文章是否重复或者高度相似。
其中,Hamming Distance ,又称汉明距离。在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。也就是说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如:1011101 与 1001001 之间的汉明距离是 2。至于我们常说的字符串编辑距离,则是一般形式的汉明距离。
2.5.2 实现原理
- 分词——将文档分词,取一个文章的TF-IDF模型中TF权重最高的前20个词(feature)和权重(weight)。即一篇文档得到一个长度为20的(feature:weight)的集合。
- 计算Hash值——对其中的词(feature),进行普通的哈希之后得到一个64为的二进制,得到长度为20的(hash : weight)的集合
- 加权——根据(2)中得到一串二进制数(hash)中相应位置是1是0,对相应位置取正值weight和负值weight。例如一个词进过(2)得到(010111:5)进过步骤(3)之后可以得到列表[-5,5,-5,5,5,5],即对一个文档,我们可以得到20个长度为64的列表[weight,-weight...weight]。
- 合并——对(3)中20个列表进行列向累加得到一个列表。如[-5,5,-5,5,5,5]、[-3,-3,-3,3,-3,3]、[1,-1,-1,1,1,1]进行列向累加得到[-7,1,-9,9,3,9],这样,我们对一个文档得到,一个长度为64的列表。
- 降维——对(4)中得到的列表中每个值进行判断,当其为负值的时候去0,正值取1。例如,[-7,1,-9,9,3,9]得到010111,这样,我们就得到一个文档的simhash值了。
2.5.3 参考
simhash和海明距离
simhash算法----原理及实现
Java实现海明距离简单计算
Java 计算文件的MD5值和Hash值
三、类的实现
3.1 文件读写类
convertUtils
方法:convertResult2Txt 将结果写入指定文件
converTxt2String 读入需要进行比较的文本

3.2 关键词提取类
cuttingWordsUtil
方法: cuttingWords 调用hanlp分割并提取关键词

3.3 相似度计算类
calcSimilarityUtil
方法:calcHashByMd5 使用MD5算法计算Hash值
calcSimHash 调用cuttingWordsUtil中的cuttingWords方法并根据此计算关键词的SimHash值
calcHammingDistance 计算海明距离
calcSimilarity 在上面的基础上,计算文本相似度

3.4 测试类


四、性能分析
4.1 内存占用情况

4.2 类的使用情况


4.3 耗时情况

4.4 CPU负载

五、单元测试展示
测试覆盖率





六、运行结果展示



按以上顺序,测试得到的结果

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

浙公网安备 33010602011771号