个人项目
这个作业属于哪个课程 | <软件工程2024> |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136 |
这个作业的目标 | <设计一个论文查重算法> |
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 920 |
Development | 开发 | 660 | 900 |
· Analysis | · 需求分析 (包括学习新技术) | 100 | 150 |
· Design Spec | · 生成设计文档 | 20 | 30 |
· Design Review | · 设计复审 | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
· Design | · 具体设计 | 30 | 30 |
· Coding | · 具体编码 | 420 | 600 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 50 |
Reporting | 报告 | 60 | 60 |
· Test Repor | · 测试报告 | 20 | 25 |
· Size Measurement | · 计算工作量 | 20 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
· 合计 | 720 | 960 |
计算模块接口的设计与实现过程
本项目中使用的核心算法为simhash计算文本相似度
主要的类
- Main: 主流程的类
- ReadTxt:读入文本写入答案的类
- SimHash:计算SimHash 值的类
- Calculation:最终计算相似度的类
计算模块接口部分的性能改进
通过JProfiler分析得到性能图:
计算模块部分单元测试展示。
测试SimHash和Calculation类
import org.junit.jupiter.api.Test;
public class test{
@Test
public void test(){
String str1=" 我比现在年轻十岁的时候,获得了一个游手好闲的职业,去乡间收集民间歌谣。那一年的整个夏天,我如同一只乱飞的麻雀,游荡在知了和阳光充斥的村舍田野。我喜欢喝农民那种带有苦味的茶水,他们的茶桶就放在田埂的树下,我毫无顾忌地拿起漆满茶垢的茶碗舀水喝,还把自己的水壶灌满,与田里干活的男人说上几句废话,在姑娘因我而起的窃窃私笑里扬长而去。";
String str2=" 我比渺现在年轻十岁的时候,件获得了一个游手好闲的职业,去乡间筛收集民间歌洽谣胰。那一服年倍的整个夏天,我畴如同一危只乱焊飞的爷麻雀,游荡奔在知寡了氮和阳光充斥的村舍田野。扭我喜欢喝岗农民眷那睁种矗带有苦味急的茶水,他状们泅的茶桶我就游放在田埂拜的姑树下,我毫无挺顾钨忌地拿起漆飘满茶垢的巢茶碗舀水喝,还捉把猎自己的水壶灌满,与田里犹干活的男人说迹上咋几句废话,在凋姑娘讳因我肘而起的窃窃私笑里扬长而去濒。";
String simhash1=SimHash.getSimHash(str1);
String simhash2=SimHash.getSimHash(str2);
System.out.println(Calculation.getSimilarity(simhash1,simhash2));
str2=str1;
simhash1=SimHash.getSimHash(str1);
simhash2=SimHash.getSimHash(str2);
System.out.println(Calculation.getSimilarity(simhash1,simhash2));
}
}
测试结果
计算模块部分异常处理说明
文本过短提示异常
// 文本长度太短时HanLp无法取得关键字
try{
if(str.length() < 100) throw new shortTextException("文本过短!");
}catch (shortTextException e){
e.printStackTrace();
return null;
}