个人项目

这个作业属于哪个课程 软工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.计算模块部分单元测试展示

image
对三个核心函数进行测试,测试了 computeCosineSimilarity方法,该方法用于计算两个文本的余弦相似度。测试数据选择了 "今天是星期天,天气晴朗" 和 "今天是周日,天气很好",因为它们的内容相似但表述不同,相似度介于 0.5 到 1.0 之间。测试了 computeSimHash方法,输入"测试文本",确保返回的 SimHash 值不为 0,以验证哈希计算的正确。最后,测试computeHammingDistance 方法,选取 "今天天气很好" 和 "今天的天气不错" 计算 SimHash,并确保它们的汉明距离合理,值在 0 到 64 之间。
image单元测试

image覆盖率

4.计算模块部分异常处理说明

针对可能出现的异常情况进行异常处理以提高程序的稳定性,对于文件读取异常 (IOException),当输入文件不存在或损坏时,通过 try-catch 捕获异常,给出提示信息,防止程序崩溃。在空文本异常 (IllegalArgumentException) 处理中,如果 computeCosineSimilarity 或 computeSimHash 方法接收到 null 或空字符串作为输入,直接抛出异常,以确保输入数据的有效性。为了防止SimHash 计算异常 (ArithmeticException),在 computeSimHash 方法中增加了输入校验,以避免因非法字符或极端输入导致计算失败。在汉明距离计算异常 (IllegalStateException) 处理中,如果 computeSimHash 计算失败并返回 0,则 computeHammingDistance 方法会抛出异常,避免无效的计算。
image

posted @ 2025-03-07 23:06  BoscoXTJ  阅读(33)  评论(0)    收藏  举报