软件工程--个人项目
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%覆盖到。
异常处理
- 读取文件内容失败或打开及关闭流资源失败时,对于抛出的异常捕获并处理,此时程序将中断,控制台打印读取文件内容失败的提示信息。
- 对于根据所给路径写入某文件时,若该文件不存在时,则创建这个文件,若文件已存在,则将新结果覆盖以前的内容;若流资源出错,则捕获抛出的异常并处理,此时程序中断,控制台打印写入文件错误的提示信息。
程序结果截图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现