这个作业属于哪个课程 | 计科12班 |
---|---|
这个作业要求在哪里 | 个人项目 |
这个作业的目标 | 熟悉个人项目开发及测试 |
github地址 | https://github.com/shiqi323/3122004657 |
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | · 计划 | 10 | 10 |
·Estimate | · 估计这个任务需要多少时间 | 200 | 200 |
Development | · 开发 | 500 | 600 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 120 |
· Design Spec | · 生成设计文档 | 30 | 60 |
· Design Review | · 设计复审 | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
· Design | · 具体设计 | 10 | 10 |
· Coding | · 具体编码 | 100 | 140 |
· Code Review | · 代码复审 | 10 | 8 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 20 |
Reporting | ·报告 | 40 | 34 |
· Test Repor | · 测试报告 | 20 | 12 |
· Size Measurement | · 计算工作量 | 10 | 12 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 10 |
· 合计 | 855 | 1376 |
一、开发环境
开发环境:IntelliJ IDEA 2023
开发语言:Java open jdk-21
环境依赖:
cn.hutool 5.8.6
hankcs hanlp portable-1.8.3
junit-jupiter RELEASE
二、需求分析
题目:论文查重
描述:设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
三、设计实现
系统流程
模块设计
- 命名为FileUtil类,包括两个方法:readFile()和writeFile()方法。为了增加开发效率,引入了糊涂工具包里面的FileReader,然后对异常进行了封装,设计了读、写文件两个方法。
- 命名为FileException类,用于FileUtil类读写文件时报错时引用。
- 命名为TokenizerUtil类,包括CountWord()和CosCount()方法,分别用于分词和文本相似度计算。
向量余弦计算模型
- 该方法优势在于代码实现难度较低,向量计算模型拟合情况良好,但对于处理长文本的话,该方法速度较慢,但也能基本覆盖需求。
四、测试
1. 性能分析和内存分析
2. 代码覆盖率
五、代码分析
1. 普通单元测试点击查看代码
@Test
public void testAdd(){
String path = "C:\\Users\\UserX\\Desktop\\软工第二次作业\\TestData\\orig.txt";
String path2 = "C:\\Users\\UserX\\Desktop\\软工第二次作业\\TestData\\orig_0.8_add.txt";
Map<String, List<Integer>> stringListMap1 = TokenizerUtil.CountWord ( path );
Map<String, List<Integer>> stringListMap2 = TokenizerUtil.CountWord ( path2 );
Double similarity = TokenizerUtil.CosCount ( stringListMap1,stringListMap2 );
FileUtil.writeFile ( "C:\\Users\\UserX\\Desktop\\软工第二次作业\\TestData\\res.txt",String.valueOf ( similarity ) );
System.out.println (similarity );
}
点击查看代码
@Test
public void testSame(){
String path = "C:\\Users\\UserX\\Desktop\\软工第二次作业\\TestData\\orig.txt";
String path2 = "C:\\Users\\UserX\\Desktop\\软工第二次作业\\TestData\\orig.txt";
Map<String, List<Integer>> stringListMap1 = TokenizerUtil.CountWord ( path );
Map<String, List<Integer>> stringListMap2 = TokenizerUtil.CountWord ( path2 );
Double similarity = TokenizerUtil.CosCount ( stringListMap1,stringListMap2 );
FileUtil.writeFile ( "C:\\Users\\UserX\\Desktop\\软工第二次作业\\TestData\\res.txt",String.valueOf ( similarity ) );
System.out.println (similarity );
}
点击查看代码
@Test
public void testNullFilePath(){
String path = "";
String path2 = "";
Map<String, List<Integer>> stringListMap1 = TokenizerUtil.CountWord ( path );
Map<String, List<Integer>> stringListMap2 = TokenizerUtil.CountWord ( path2 );
Double similarity = TokenizerUtil.CosCount ( stringListMap1,stringListMap2 );
FileUtil.writeFile ( "C:\\Users\\UserX\\Desktop\\软工第二次作业\\TestData\\res.txt",String.valueOf ( similarity ) );
System.out.println (similarity );
- 运行截图