软件工程作业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时间最多,勿需改进。