个人项目
| 这个作业属于哪个课程 | 软工23级 |
|---|---|
| 这个作业要求在哪里 | 个人项目 |
| Github仓库链接 | Github仓库 |
| 这个作业的目标 | 锻炼个人完成项目的能力,熟悉流程 |
1.PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 40 | 45 |
| - Estimate | - 估计这个任务需要多少时间 | 20 | 25 |
| Development | 开发 | 400 | 420 |
| - Analysis | - 需求分析(包括学习新技术) | 80 | 90 |
| - Design Spec | - 生成设计文档 | 60 | 70 |
| - Design Review | - 设计复审 | 30 | 35 |
| - Coding Standard | - 代码规范(为目前的开发制定合适的规范) | 30 | 35 |
| - Design | - 具体设计 | 70 | 80 |
| - Coding | - 具体编码 | 100 | 110 |
| - Code Review | - 代码复审 | 30 | 35 |
| - Test | - 测试(自我测试,修改代码,提交修改) | 70 | 80 |
| Reporting | 报告 | 50 | 60 |
| - Test Repor | - 测试报告 | 30 | 35 |
| - Size Measurement | - 计算工作量 | 30 | 35 |
| - Postmortem & Process Improvement Plan | - 事后总结,并提出过程改进计划 | 50 | 60 |
| - 合计 | - | 890 | 910 |
2.计算模块接口的设计与实现过程
该论文查重系统的计算模块采用了模块化设计,主要包含 Main 入口类、TextSimilarity 相似度计算类和 FileHandler 文件处理类。Main 负责文件读取、调用计算方法并输出结果,TextSimilarity 提供余弦相似度和 SimHash 汉明距离计算,FileHandler 负责文件的读写。
核心算法包括:1.余弦相似度计算,通过词频向量的点积和模长计算文本相似性;2. SimHash 指纹计算,对文本哈希后构造 64 位 SimHash 值;3. 计算 SimHash 之间的汉明距离,以检测大规模文本改动。最终相似度得分结合余弦相似度和汉明距离归一化处理,以确保计算合理性。
独到之处在于结合两种检测方式,提高对不同类型文本修改的适应性,并使用CRC32确保哈希稳定,同时采用异常处理机制,增强系统的稳定性。
3.计算模块接口部分的性能改进
在优化计算模块的过程中,使用JProfiler进行性能分析,发现主要的耗时集中在 String.format()(占 32.4%)、computeCosineSimilarity()(占 27.7%)和 computeSimHash()(占 20.5%)。针对这些问题,进行了优化:首先,用 DecimalFormat 替代 String.format() 来减少字符串格式化的开销;其次,在计算余弦相似度时,优化了词频向量的构建方式,减少了不必要的遍历;最后,为SimHash计算引入并行处理方式,加速哈希计算。优化后,整体执行效率得到了明显提升,计算速度更快,系统运行更流畅。
4.计算模块部分单元测试展示

对三个核心函数进行测试,测试了 computeCosineSimilarity方法,该方法用于计算两个文本的余弦相似度。测试数据选择了 "今天是星期天,天气晴朗" 和 "今天是周日,天气很好",因为它们的内容相似但表述不同,相似度介于 0.5 到 1.0 之间。测试了 computeSimHash方法,输入"测试文本",确保返回的 SimHash 值不为 0,以验证哈希计算的正确。最后,测试computeHammingDistance 方法,选取 "今天天气很好" 和 "今天的天气不错" 计算 SimHash,并确保它们的汉明距离合理,值在 0 到 64 之间。
单元测试
覆盖率
4.计算模块部分异常处理说明
针对可能出现的异常情况进行异常处理以提高程序的稳定性,对于文件读取异常 (IOException),当输入文件不存在或损坏时,通过 try-catch 捕获异常,给出提示信息,防止程序崩溃。在空文本异常 (IllegalArgumentException) 处理中,如果 computeCosineSimilarity 或 computeSimHash 方法接收到 null 或空字符串作为输入,直接抛出异常,以确保输入数据的有效性。为了防止SimHash 计算异常 (ArithmeticException),在 computeSimHash 方法中增加了输入校验,以避免因非法字符或极端输入导致计算失败。在汉明距离计算异常 (IllegalStateException) 处理中,如果 computeSimHash 计算失败并返回 0,则 computeHammingDistance 方法会抛出异常,避免无效的计算。


浙公网安备 33010602011771号