ychunx

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
这个作业属于哪个课程 软件工程
这个作业要求在哪里 作业要求
这个作业的目标 学习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 表格

PSP 2.1
Personal Software Process Stage
预估耗时(分钟)
实际耗时(分钟)
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
posted on 2021-09-18 18:43  ychunx  阅读(70)  评论(1编辑  收藏  举报