第一次个人编程作业
这个作业属于哪个课程 | [计科22级34班 ]——https://edu.cnblogs.com/campus/gdgy/CSGrade22-34 |
---|---|
这个作业要求在哪里 | [第一次个人编程作业 ]——https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229 |
这个作业的目标 | 使用Java完成个人编程作业,在实现论文查重项目的过程中和运用软件工程的知识进行学习开发,学会使用PSP表格,使用github提交项目,进行单元测试与问题处理。 |
[个人项目github仓库]——https://github.com/aBin-L1/3122004531
一、PSP表
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
· Estimate | · 估计这个任务需要多少时间 | 45 | 60 |
Development | 开发 | 120 | 150 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 120 |
· Design Spec | · 生成设计文档 | 60 | 60 |
· Design Review | · 设计复审 | 60 | 45 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 60 | 60 |
· Design | · 具体设计 | 60 | 66 |
· Coding | · 具体编码 | 30 | 45 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 180 | 150 |
Reporting | 报告 | 60 | 60 |
· Test Repor | · 测试报告 | 60 | 60 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmorte· 合计m & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 35 |
· 合计 | 925 | 1011 |
二、需求分析
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
- 原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
- 抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
- 从命令行参数给出:论文原文的文件的绝对路径。
- 从命令行参数给出:抄袭版论文的文件的绝对路径。
- 从命令行参数给出:输出的答案文件的绝对路径。
样例说明:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
三、开发环境
- IntelliJ IDEA甲基橙开发环境
- 基于JAVA
- 使用Maven仓库
- 使用HanLP库
四、计算模块接口的设计与实现
计算模块是整个系统的核心部分,负责计算文本之间的相似度,以实现对抄袭的检测。主要由以下几个类组成:
SimHashUtils
类:用于计算文本的 SimHash 值,是整个计算模块的核心。HammingUtils
类:用于计算两个 SimHash 值的海明距离,并进一步计算相似度。ShortStringException
类:自定义异常类,用于处理文本过短等特殊情况。TxtIOUtils
类:用于读取和写入文本文件,辅助计算模块进行文件操作。
4.1 模块功能概述
计算模块的主要功能是接收两个文本文件的内容,计算出它们的 SimHash 值,然后通过计算海明距离(Hamming Distance)来获得两个文本的相似度。该模块能够处理不同长度的文本,同时对异常情况(如文本过短、文本为空)进行了有效的处理。
主要功能包括:
- 提取文本的关键词并计算 SimHash 值。
- 计算两个 SimHash 值之间的海明距离。
- 根据海明距离计算文本相似度。
- 处理空文本、短文本等异常情况,确保系统的稳定性。
4.2 接口设计
计算模块提供以下主要接口:
- SimHashUtils.getSimHash(String str):传入字符串,计算出字符串的 SimHash 值,并以字符串形式输出。
- HammingUtils.getHammingDistance(String simHash1, String simHash2):传入两个 SimHash 值,计算并返回它们的海明距离。
- HammingUtils.getSimilarity(String simHash1, String simHash2):传入两个 SimHash 值,计算并返回它们的相似度。
4.3 接口实现
4.3.1 SimHash 值计算实现
SimHashUtils.getSimHash
方法主要通过以下步骤实现:
- 关键词提取:使用 HanLP 分词工具对输入文本进行分词,并提取关键词。
- 计算关键词的 Hash 值:将每个关键词通过 MD5 算法计算出其 128 位的 Hash 值。
- 特征向量计算:根据关键词的 Hash 值构造特征向量,向量中的每一位根据关键词的权重进行累加。
- 降维并生成 SimHash 值:将特征向量降维,通过每位的正负值生成 128 位的 SimHash 值。
4.3.2 海明距离计算实现
HammingUtils.getHammingDistance
方法用于计算两个 SimHash 值之间的海明距离,通过逐位比较两个字符串的不同字符数来实现。
4.3.3 相似度计算实现
HammingUtils.getSimilarity
方法基于海明距离计算文本相似度。若海明距离为 -1
,则认为相似度为 0
,否则相似度为 1 - (海明距离 / SimHash 值长度)
。
4.4 异常处理
为了增强模块的鲁棒性,计算模块在实现过程中加入了对以下异常情况的处理:
- 空文本或文本过短:通过抛出
ShortStringException
,提醒调用者文本长度不足。 - SimHash 值长度不一致:在计算海明距离时检查 SimHash 值的长度是否一致,不一致则返回
-1
表示错误。 - 其他异常:使用异常捕获,确保代码在执行过程中即使遇到未预料的情况也能进行合理处理,避免程序崩溃。
五、性能分析
六、单元测试
分别测试主类和工具类
测试主类
- 测试样例文本过短
- 测试文件不存在
- 测试总体结果
- 主类测试代码覆盖率
测试工具类
- 测试HammingUtil的getSimilarity方法
- 测试HammingUtil的getHammingDistance方法
- 测试结果
- 工具类测试代码覆盖率
七、计算模块部分异常处理说明
ShortStringException
- 设计目标:
ShortStringException
是一个自定义异常类,用于处理文本长度不足的情况。在 SimHash 值计算过程中,如果输入的文本长度小于 200 个字符,该异常会被抛出。设计此异常的目的是防止短文本导致关键词提取失败或计算结果不准确的情况。
@Test
public void testGetSimHashWithShortText() {
Exception exception = assertThrows(ShortStringException.class, () -> {
SimHashUtils.getSimHash("短文本");
});
assertEquals("文本过短,难以判断!", exception.getMessage());
}
- 错误场景:此异常适用于检测输入文本过短的情况,例如用户输入了非常短的字符串或误将标题、空行当作输入文件。这种情况下,系统将抛出
ShortStringException
并提示用户文本长度不足。