这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-34 |
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-34/homework/13023 |
这个作业的目标 | 设计一个论文查重算法并撰写博客 |
github链接
一.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 60 | 60 |
Estimate | 估计这个任务需要多少时间 | 30 | 35 |
Development | 开发 | 120 | 130 |
Analysis | 需求分析 (包括学习新技术) | 120 | 130 |
Design Spec | 生成设计文档 | 60 | 60 |
Design Review | 设计复审 | 60 | 60 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 40 |
Design | 具体设计 | 40 | 50 |
Coding | 具体编码 | 120 | 150 |
Code Review | 代码复审 | 30 | 35 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 25 |
Reporting | 报告 | 60 | 40 |
Test Repor | 测试报告 | 60 | 40 |
Size Measurement | 计算工作量 | 60 | 60 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 90 | 90 |
合计 | 960 | 1005 |
二.需求
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
- 原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
- 抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
- 从命令行参数给出:论文原文的文件的绝对路径。
- 从命令行参数给出:抄袭版论文的文件的绝对路径。
- 从命令行参数给出:输出的答案文件的绝对路径。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位。
三.计算模块接口的设计与实现过程
1.流程图
2.类
-
MainPaperCheck:main 方法所在的类
- 读取命令行输入的路径名对应的文件,将文件的内容转化为字符串。
- 由字符串得出对应的 SimHash值。
- 由 SimHash值求出相似度。
- 把相似度写入最后的结果文件中。
- HammingUtils:计算海明距离的类
- 包含以下两个静态方法:
- 1、getHammingDistance:输入两个 simHash 值,计算出它们的海明距离 distance。
- 2、getSimilarity:输入两个 simHash 值,调用 getHammingDistance 方法得出海明距离 distance,在由 distance 计算出相似度。
- SimHashUtils:计算 SimHash 值的类
- 包含以下两个静态方法:
- 1、getHash:传入String,计算出它的hash值,并以字符串形式输出。(使用了MD5获得hash值)
- 2、getSimHash:传入String,计算出它的simHash值,并以字符串形式输出。(需要调用 getHash 方法)
- getSimHash是核心算法,流程图如下:
- TxtIOUtils:读写 txt 文件的工具类
- 包含以下两个静态方法:
- 1、readTxt:读取txt文件。
- 2、writeTxt:写入txt文件。
- ShortStringException:处理文本内容过短的异常类
四.计算模块接口部分的性能改进
从分析图可以看到:
调用次数最多的是com.hankcs.hanlp包提供的接口, 即分词、取关键词与计算词频花费了最多的时间,如果能找到更高效的分词方法便可以提升性能。
五.计算模块部分单元测试展示
1.读写txt文件模块的测试
2.海明距离模块的测试
3.SimHash模块的测试
4.MainTest的测试
5.各模块测试代码覆盖率
六.计算模块部分异常处理说明
当文本长度太短时,HanLp无法取得关键字,出现异常,所以用ShortStringException来处理。