软件工程--个人项目

发布时间 2023-09-15 00:59:33作者: tmssss

github地址

学号为名的文件夹地址

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 40 30
· Estimate · 估计这个任务需要多少时间 1500 1500
Development 开发 420 400
· Analysis · 需求分析 (包括学习新技术) 180 150
· Design Spec · 生成设计文档 60 70
· Design Review · 设计复审 30 30
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 30
· Design · 具体设计 100 100
· Coding · 具体编码 240 200
· Code Review · 代码复审 60 40
· Test · 测试(自我测试,修改代码,提交修改) 60 60
Reporting 报告 120 110
· Test Repor · 测试报告 40 30
· Size Measurement · 计算工作量 60 50
· Postmortem & Process Improvement Plan · 测试报告 40 40
· Test Repor · 事后总结, 并提出过程改进计划 60 60
· 合计 1500 1370

模块接口的设计与实现过程

  • 需求

设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。

  • 实现原理

通过SimHash算法并结合实际的代码来实现,通过对不同文本的SimHash值进而比较“海明距离”,从而判断两个文本的相似度。

  • 实现流程

  • 开发环境以及依赖

编程语言:java
编程工具:Intellij IDEA 2021.3
项目构建工具:maven
性能分析工具:JProfiler 9.2
单元测试:JUnit 4.12
HTML解析:Jsoup 1.11.3
分词处理:hanlp 1.8.1

  • 模块设计


main()方法为主函数入口,simHash算法作为最重要的设计,编写了四个函数方法位于service包中,并设置了四个对应的接口给main函数调用,文件的读写操作以及对HTML文件的标签等特殊字符的处理,均作为工具方法位于util工具包中。

1.类

SimHash类的结点设计

/**
   * 论文内容
   */
  private String content;
  /**
   * 分词向量
   */
  private BigInteger bigSimHash;
  /**
   * 初始桶大小
   */
  private Integer hashCount = 64;

2.函数
BigInteger simHashConstruct(SimHash simHash);
//计算单个分词的hash值
BigInteger getWordHash(String word, Integer hashCount);
//获取文件内容的相似度
Double getSimilar(SimHash simHash1, SimHash simHash2);
//获取文件内容的海明距离
int getHammingDistance(SimHash simHash1, SimHash simHash2);
//过滤特殊字符
public static String clearSpecialCharacters(String content); 
//传入文件绝对路径,读出txt文件,将文件内容转化为String字符串输出
public static String readFromText(String textPath);
//将对比后的相似度结果写入txt文件
public static void writeToText(String textElement, String filePath);

3.函数调用关系图

性能分析

  • 性能分析图


    调用次数最多的是com.hankcs.hanlp包提供的接口, 即分词、取关键词与计算词频花费了最多的时间。整体程序逻辑较为简单,各个函数及方法耗时较短。

测试部分

  • 测试方法

借助JUnit依赖作单元测试,便捷高效,用Intellij IDEA自带功能展示测试代码覆盖率,直观明了。

  • 部分测试代码及结果展示

该函数逻辑较为简单,这里只测试五次

测试结果

  • 整个项目测试覆盖率

所有函数方法以及工具类函数均100%覆盖到。

异常处理

  • 读取文件内容失败或打开及关闭流资源失败时,对于抛出的异常捕获并处理,此时程序将中断,控制台打印读取文件内容失败的提示信息。
  • 对于根据所给路径写入某文件时,若该文件不存在时,则创建这个文件,若文件已存在,则将新结果覆盖以前的内容;若流资源出错,则捕获抛出的异常并处理,此时程序中断,控制台打印写入文件错误的提示信息。

程序结果截图


代码提交情况