这个作业属于哪个课程 |
https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/ |
这个作业要求在哪里 |
https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13477 |
这个作业的目标 |
实现一个论文查重程序 |
我的github |
https://github.com/wjx4300/3223004300 |
一、PSP表格(包括预估与实际耗时)
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
|
|
· Estimate |
· 估计这个任务需要多少时间 |
30 |
30 |
Development |
开发 |
|
|
· Analysis |
· 需求分析 |
30 |
30 |
· Design Spec |
· 生成设计文档 |
40 |
50 |
· Design Review |
· 设计复审 |
30 |
20 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20 |
30 |
· Design |
· 具体设计 |
60 |
60 |
· Coding |
· 具体编码 |
180 |
240 |
· Code Review |
· 代码复审 |
60 |
60 |
· Test |
· 测试 (自我测试,修改代码,提交修改) |
120 |
120 |
Reporting |
报告 |
|
|
· Test Report |
· 测试报告 |
60 |
60 |
· Size Measurement |
· 计算工作量 |
30 |
30 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
30 |
|
· 合计 |
690 |
760 |
二、函数模块接口的设计和实现
2.1函数模块
各模块主函数名称 |
函数功能 |
耗时(分钟) |
readFile |
文件读取 |
15 |
preprocessText |
文本预处理 |
50 |
calculateSimilarity |
相似度计算主方法 |
60 |
getTermFrequency |
词频向量构建 |
45 |
cosineSimilarity |
余弦相似度计算 |
60 |
main |
调用各函数 |
10 |
2.2程序主流程
![数据流程]()
2.3函数模块关系架构
![函数模块关系]()
2.4主要模块函数设计实现
2.4.1文本处理模块
![文本处理]()
2.4.2构建文章词频向量
![构建词频向量]()
2.4.3余弦相似度计算
![余弦相似度计算]()
三、单元测试展示
3.1文本处理测试函数
public void testPreprocessText() {String text = "今天是星期天,天气晴,今天晚上我要去看电影。";List<String> words = checker.preprocessText(text);
// System.out.println("原始文本:" + text);
// System.out.println("处理后词语:" + words);// 预期结果:去除停用词和标点后的词语列表String[] expected = {"今天", "星期天", "天气", "晴","晚上", "要","去","看", "电影"};assertArrayEquals(expected, words.toArray(new String[0]));}
构造思路
- 包含停用词("是"、"我"),验证停用词过滤效果
- 包含标点符号(","、"。"),验证特殊字符去除效果
- 预期结果明确对应处理后的有效词汇,确保分词准确性
3.2相似度计算测试
@Testpublic void testCalculateSimilarity_Identical() {String text1 = "今天是星期天,天气晴,今天晚上我要去看电影。";String text2 = "今天是星期天,天气晴,今天晚上我要去看电影。";double similarity = checker.calculateSimilarity(text1, text2);assertEquals(1.0, similarity, 0.01);}@Testpublic void testCalculateSimilarity_Similar() {String text1 = "今天是星期天,天气晴,今天晚上我要去看电影。";String text2 = "今天是周天,天气晴朗,我晚上要去看电影。";double similarity = checker.calculateSimilarity(text1, text2);// 预期相似度应该较高,在0.7以上assertTrue(similarity > 0.7);}@Testpublic void testCalculateSimilarity_Different() {String text1 = "今天是星期天,天气晴,今天晚上我要去看电影。";String text2 = "明天会下雨,我计划待在家里读书。";double similarity = checker.calculateSimilarity(text1, text2);// 预期相似度应该较低,在0.3以下assertTrue(similarity < 0.3);}@Testpublic void testCalculateSimilarity_EmptyText1() {String text1 = "";String text2 = "今天是周天,天气晴朗,我晚上要去看电影。";double similarity = checker.calculateSimilarity(text1, text2);assertEquals(0.0, similarity, 0.01);}@Testpublic void testCalculateSimilarity_EmptyText2() {String text1 = "今天是星期天,天气晴,今天晚上我要去看电影。";String text2 = "";double similarity = checker.calculateSimilarity(text1, text2);assertEquals(0.0, similarity, 0.01);}@Testpublic void testCalculateSimilarity_BothEmpty() {String text1 = "";String text2 = "";double similarity = checker.calculateSimilarity(text1, text2);assertEquals(0.0, similarity, 0.01);}
构造思路
- 测试两个完全相同文本,相似度应为1,确保核心算法无基础偏差
- 测试两个相似文本,验考察对语义相似性的识别能力
- 测试两个完全不同的文本,验证算法区分差异的能力
- 测试三种空文本情况,确保边界值处理正确
3.3测试覆盖率图
![测试覆盖率图]()
四、计算模块部分异常处理说明
4.1文件不存在异常
- 设计目标:当程序尝试读取的文件不存在时,抛出此异常,用于明确告知用户 “指定路径的文件找不到”
- 错误场景:用户传入的原文文件路径或抄袭版文件路径指向的文件不存在
@Test(expected = IOException.class)public void testReadFile_InvalidPath() throws IOException {checker.readFile("invalid/path/file.txt");}
4.2兜底异常处理
- 设计目标:作为兜底的异常捕获,处理程序运行过程中可能出现的其他未明确分类的异常
- 错误场景:比如在预处理文本时,传入的文本为null,导致后续调用text.length()等方法时抛出NullPointerException
@Test(expected = NullPointerException.class)public void testPreprocessText_NullInput() {checker.preprocessText(null);}