软件工程作业2:个人项目-论文查重实现

发布时间 2023-09-14 18:56:59作者: Chen泽瀚

软工作业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及海明距离
包含五个静态方法:

  1. 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();
        }
  1. wordsWeight:通过词频给每个词附加权重,并存入hashmap中

  2. getHash:使用MD5获取hash值,并补位128

MessageDigest messageDigest = MessageDigest.getInstance("MD5");
  1. weightAndMerge:对hash加权,合并和降维
  2. getSimHash:集合以上四个静态方法,便于调用

1.3 HammingUtil工具类

包含两个静态方法

  1. getHammingDistance:计算海明距离
  2. similarity:计算相似度
    计算公式:
 0.01 * (100 - distance * 100 / 128);

性能分析

遥测

实时内存-所有对象

CPU调用树

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

单元测试

FilesIOUtilTest

HammingUtilTest

SimHashUtilTest

测试代码覆盖率


查重程序运行结果

答案文件