这个作业属于哪个课程 | 软件工程 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 学习Git管理项目+学习PSP表格记录+论文查重程序设计+代码性能分析+单元测试 |
目录
1.作业 GitHub 链接
2.开发环境
3.PSP 表格
4.计算模块接口的设计与实现过程
5.计算模块接口部分的性能改进
6.计算模块部分单元测试展示
7.计算模块部分异常处理说明
8.总结
作业 GitHub 链接
链接:https://github.com/ychunx/ThesisCheck
可运行的 jar 包已经发布至仓库的 release 包内
开发环境
- 编程语言:Java 16
- 编程工具:IDEA 2021.2
- 项目构建工具:maven
- 性能分析工具:JProfiler 12
- 单元测试框架:JUnit 4.12
- 依赖包:汉语言处理包
计算模块接口的设计与实现过程
1.实现思路
一、分词:先利用外部汉语言处理包对文件文本进行分词处理,把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重,我们假设权重分为5个级别(1~5)。比如:“ 美国“51区”雇员称内部有9架飞碟,曾看见灰色外星人 ” -> 分词后为 “ 美国(4) 51区(5) 雇员(3) 称(1) 内部(2) 有(1) 9架(3) 飞碟(5) 曾(1) 看见(3) 灰色(4) 外星人(5)”,括号里是代表单词在整个句子里重要程度,数字越大越重要
二、获取 hash 值,通过 hash 算法把每个词变成 hash 值,比如“美国”通过 hash 算法计算为 100101,“51区”为 101011。这样我们的字符串就变成了一串串数字
三、加权:根据 2) 步骤的 hash 值,需要按照单词的权重形成加权数字串,比如“美国”的 hash 值为“100101”,通过加权计算为“4 -4 -4 4 -4 4”;“51区”的 hash 值为“101011”,通过加权计算为 “ 5 -5 5 -5 5 5”
四、合并:把上面各个单词算出来的序列值累加,变成只有一个序列串。比如 “美国”的 “4 -4 -4 4 -4 4”,“51 区”的 “ 5 -5 5 -5 5 5”, 把每一位进行累加, “4+5 -4+-5 -4+5 4+-5 -4+5 4+5” = “9 -9 1 -1 1 9”。这里作为示例只算了两个单词的,真实计算需要把所有单词的序列串累加
五、降维:将 4)算出的 “9 -9 1 -1 1 9” 变成 0 1 串,形成我们最终的 simhash 签名。 如果每一位大于 0 记为 1,小于 0 记为 0。最后算出结果为:“1 0 1 0 1 1”
六、根据前五步生成的两个字符串的 simhash 签名计算海明距离,每出现一位 0 1 不同,则距离加 1
七、根据海明距离计算出相似度
2.类
- mainCheck 类:主程序
- similarity 类:利用外部汉语言处理包对字符串进行分词,获取 hash 值、加权、合并、降维操作,并计算其海明距离以计算相似度
- txtIO 类:文件输入输出操作类
- ruleOutShort 类:避免文本过短,外部包 HanLp 无法取得关键字
3.关键函数
1)getHash 方法:使用 MD5 获取传入字符串的 hash 值
2)getSimHash 方法:根据 getHash 方法取得的两对 hash 值,计算出它们的 simhash 值。执行的操作有分词、获取 hash 值、加权、合并、降维
3)getHammingDistance 方法:根据 getSimHash 方法取得的两个 simhash 值计算出它们的海明距离
4)getSimilarity 方法:调用 getSimHash 方法取得 simhash 值,再调用 getHammingDistance 方法取得海明距离,计算出文本相似度
5)readTxt 方法:读取文件字符串,设立缓冲区,提高字符流读写的效率
6)writeTxt 方法:写入文件,控制相似度位数
4.流程
读取文件转化成 String 字符串 -> (分词、获取 hash 值、加权、合并、降维) -> 计算海明距离 -> 计算相似度 -> 写入 txt 文件
计算模块接口部分的性能改进
1.函数消耗情况
消耗较大的并没有出现自定义计算模块
2.内存占用情况
占用的内存不超过2048MB
3.CPU 负载
计算模块部分单元测试展示
1.主类测试
结果文件:
2.求相似度模块测试
代码覆盖率:
3.读写模块测试
代码覆盖率:
共 17 例测试
计算模块部分异常处理说明
1.ruleOutShort 类:
避免文本过短,外部包 HanLp 无法取得关键字
2.主类异常用例:
原文对原文
3.求相似度模块异常用例:
两 SimHash 值位数不同时
4.读写模块异常用例:
1)路径错误,读取失败
2)路径错误,写入失败
总结
- 更加熟悉了 Git 管理代码的操作
- 学会使用性能分析、单元检测等工具及引入外部包
- 注意良好文件结构,保持整洁
- 慢工出细活
PSP 表格
Planning | 计划 | 60 | 50 |
Estimate | 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 700 | 860 |
Analysis | 需求分析 (包括学习新技术) | 300 | 360 |
Design Spec | 生成设计文档 | 30 | 40 |
Design Review | 设计复审 | 30 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
Design | 具体设计 | 60 | 70 |
Coding | 具体编码 | 240 | 280 |
Code Review | 代码复审 | 30 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 180 | 160 |
Reporting | 报告 | 120 | 140 |
Test Repor | 测试报告 | 30 | 60 |
Size Measurement | 计算工作量 | 30 | 40 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 20 |
合计 | 1880 | 2160 |