软件工程作业2:个人项目-论文查重实现
软工作业2:个人项目-论文查重
| 这个作业属于哪个课程 | 课程首页 - 计科21级1班 - 广东工业大学 - 班级博客 - 博客园 |
|---|---|
| 这个作业要求在哪里 | 个人项目-作业2- 计科21级1班 - 广东工业大学 - 班级博客 - 博客园 |
| 这个作业的目标 | 实现论文查重并测试性能 |
PSP表格
| PSP2.1 | Personal Software Process Stages |
预估耗时 (分钟) |
实际耗时 (分钟) |
|---|---|---|---|
| Planning | 计划 | 720 | 1730 |
| Estimate | 估计这个任务需要多少时间 | 720 | 1730 |
| Development | 开发 | 680 | 300 |
| Analysis | 需求分析(包括学习新技术) | 180 | 300 |
| Design Spec | 生成设计文档 | 60 | 60 |
| Design Review | 设计复审 | 60 | 60 |
| Coding Standard | 代码规范(为目前的开发指定合适的规范) | 30 | 100 |
| Design | 具体设计 | 60 | 300 |
| Coding | 具体编码 | 120 | 300 |
| Code Review | 代码复审 | 60 | 60 |
| Test | 测试(自我测试,修改代码,提交修改) | 60 | 100 |
| Reporting | 报告 | 30 | 100 |
| Test Repor | 测试报告 | 30 | 30 |
| Size Measurement | 计算工作量 | 30 | 30 |
| Postmortem&Process Improvement Plan |
事后总结,并提出过程改进计划 | 30 | 30 |
| 合计 | 720 | 1730 |
开发工具及依赖
- 编程语言:java
- IDE:Intellij IDEA 2023.1
- 项目构建工具:maven
- 单元测试:JUnit 4.12
- 性能分析工具:JProfiler 14
- 依赖jar包: 1.ik分词器 2.commons-io
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>portable-1.5.4</version>
</dependency>
设计流程图及接口设计
一,流程图:

二,接口设计:

程序实现
一,接口设计:
github代码
- Main:主类
- FileIOUtil:读取文件和输出文件工具类
- HammingUtil:计算海明距离及相似度工具类
- SimHashUtil:计算SimHash工具类
1.1 FileIoUtil工具类
包含两个静态方法:1.readFile 2.writeFile
通过调用commons-io方法实现
1.2 SimHashUtil工具类(核心)
算法参考文献:
SimHash及海明距离
包含五个静态方法:
- cutWords:通过ik分词器将字符串分词
//使用ik分词器分词
try (StringReader reader = new StringReader(text)) {
IKSegmenter segmenter = new IKSegmenter(reader, true);
Lexeme lexeme;
while ((lexeme = segmenter.next()) != null) {
//将每个词放入list中
strList.add(lexeme.getLexemeText());
}
} catch (IOException e) {
e.printStackTrace();
}
-
wordsWeight:通过词频给每个词附加权重,并存入hashmap中
-
getHash:使用MD5获取hash值,并补位128
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
- weightAndMerge:对hash加权,合并和降维
- getSimHash:集合以上四个静态方法,便于调用
1.3 HammingUtil工具类
包含两个静态方法
- getHammingDistance:计算海明距离
- similarity:计算相似度
计算公式:
0.01 * (100 - distance * 100 / 128);
性能分析
遥测

实时内存-所有对象

CPU调用树

图中可以分析到调用ik切词占用CPU时间最多,勿需改进。
单元测试
FilesIOUtilTest

HammingUtilTest

SimHashUtilTest

测试代码覆盖率

查重程序运行结果

答案文件


浙公网安备 33010602011771号