软工第二次作业
| 这个作业属于哪个课程 | 计科23级12班 |
|---|---|
| 这个作业要求在哪里 | 作业要求 |
| 这个作业的目标 | 自己独立完成一个项目,实现一个论文查重软件 |
| Github仓库链接 | 仓库 |
1.PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 20 | 20 |
| ·Estimate | 估计这个任务需要多少时间 | 20 | 20 |
| Development | 开发 | 280 | 430 |
| ·Analysis | 需求分析 (包括学习新技术) | 20 | 30 |
| ·Design Spec | 生成设计文档 | 40 | 40 |
| ·Design Review | 设计复审 | 20 | 15 |
| ·Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 35 |
| ·Design | 具体设计 | 20 | 30 |
| ·Coding | 具体编码 | 90 | 100 |
| ·Code Review | 代码复审 | 30 | 30 |
| ·Test | 测试 (自我测试,修改代码,提交修改) | 30 | 150 |
| Reporting | 报告 | 90 | 90 |
| ·Test Report | 测试报告 | 30 | 30 |
| ·Size Measurement | 计算工作量 | 15 | 15 |
| ·Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 45 | 45 |
| 合计 | 390 | 540 |
2.计算模块接口的设计与实现过程
(1)核心函数模块
| 函数名称 | 函数功能 |
|---|---|
| main(String[] args) | 主函数,作为核心模块调用其他函数 |
| calculateRepetitionRate(int lcsLength, int originalLength) | 计算重复率(LCS长度 / 抄袭文有效长度) |
| readFile(String filePath) | 读取文件内容(UTF-8编码) |
| writeResult(String outputPath, double rate) | 将重复率写入输出文件(格式:重复率: XX.XX%) |
| preprocessText(String text) | 文本预处理:仅保留中文和英文字母,统一转为小写 |
| computeLCS(char[] a, char[] b) | 计算两个字符数组的相似长度 |
(2)模块调用关系

(3)算法的关键及独到之处
先通过preprocessText()对文本进行预处理洗去文件中非文本内容,再通过核心算法模块computeLCS得到长度大于5的公共子序列之和,若总和为0,返回最长公共子序列(LCS)长度,将其返回的数据作为相似长度通过calculateRepetitionRate再除去抄袭文有效长度即可得到重复率,若抄袭文的内容为空则重复率为0
3.计算模块接口部分的性能改进

改善方案:
流式读取与增量预处理:
使用 BufferedReader 逐行读取文件,结合 StringBuilder 增量预处理(过滤非字母、转小写),避免一次性加载全文件。
4.测试样例
测试样例1:全中文完全重复
原文文件内容:"这是一篇原创中文论文。"
抄袭版文件内容:"这是一篇原创中文论文。"
预处理后内容(保留中文,过滤标点符号):
原文:"这是一篇原创中文论文"(长度:8)
抄袭文:"这是一篇原创中文论文"(长度:8)
计算:
连续公共子串长度=8(≥5),总和=8。
重复率:
8(LCS长度)/ 8(抄袭文长度)= 1.0 → 预期输出:重复率: 100.00%
测试样例2:全中文部分重复
原文文件内容:"我爱Java编程,也爱Python编程。"
抄袭版文件内容:"我不爱Java编程,只爱C++编程。"
预处理后内容(保留中文和英文,过滤标点、空格):
原文:"我爱Java编程也爱Python编程"(长度:14)
抄袭文:"我不爱Java编程只爱C编程"(长度:14)
计算:
连续公共子串:"爱Java编程"(长度:7,中文“爱”+英文“Java”+中文“编程”),满足≥5。
重复率:
7 / 14 ≈ 0.5 → 预期输出:重复率: 50%
测试样例3:中文+英文混合(完全重复)
原文文件内容:"中文与English混合测试,Hello World!"
抄袭版文件内容:"中文与English混合测试,Hello World!"
预处理后内容(保留中文、英文,过滤标点、空格):
原文:"中文与English混合测试HelloWorld"(长度:18)
抄袭文:"中文与English混合测试HelloWorld"(长度:18)
计算:
连续公共子串长度=18(≥5),LCS=18。
重复率:
18 / 18 = 1.0 → 预期输出:重复率: 100.00%
测试样例4:中文连续子串重叠
原文文件内容:"机器学习是人工智能的一个分支,机器学习应用广泛。"
抄袭版文件内容:"人工智能的一个分支是机器学习,机器学习应用于多个领域。"
预处理后内容(过滤标点、空格):
原文:"机器学习是人工智能的一个分支机器学习应用广泛"(长度:22)
抄袭文:"人工智能的一个分支是机器学习机器学习应用于多个领域"(长度:24)
LCS计算:
连续公共子串:
“人工智能的一个分支”(长度:9)
“机器学习应用”(长度:6)
两段子串不重叠,总和=9+6=15。
重复率:
15 / 25 ≈ 0.6 → 预期输出:重复率: 60%
测试样例5:中文非连续重复(触发LCS兜底)
原文文件内容:"中国 美国 英国 法国 德国"(空格分隔)
抄袭版文件内容:"美国 中国 德国 日本 法国"(空格分隔)
预处理后内容(过滤空格,保留中文):
原文:"中国美国英国法国德国"(长度:10)
抄袭文:"美国中国德国日本法国"(长度:10)
LCS计算:
连续公共子串:无长度≥5的连续子串(最长连续子串为“美国”“中国”等,长度2)。
触发非连续LCS:最长公共子序列为"美国国法国"(长度5)。
重复率:
5 / 10 = 0.5 → 预期输出:重复率: 50.00%
测试样例6:抄袭文为空(中文+英文均无)
原文文件内容:"这是一篇有内容的论文,包含中文和English。"
抄袭版文件内容:"!!!$$$ 12345 (无有效内容)"
预处理后内容(抄袭文过滤后为空):
原文:"这是一篇有内容的论文包含中文和English"(长度:22)
抄袭文:""(长度:0)
重复率:
0 / 0 → 按代码逻辑返回0.0 → 预期输出:重复率: 0.00%
测试样例7:原文为空(抄袭文有中文)
原文文件内容:"###@@@ (无有效内容)"
抄袭版文件内容:"抄袭文包含中文内容,用于测试边界情况。"
预处理后内容(原文为空):
原文:""(长度:0)
抄袭文:"抄袭文包含中文内容用于测试边界情况"(长度:18)
LCS计算:
LCS长度=0(原文无内容)。
重复率:
0 / 18 = 0 → 预期输出:重复率: 0.00%
测试样例8:中文短句重复(连续子串<5)
原文文件内容:"你好,世界!"
抄袭版文件内容:"世界,你好!"
预处理后内容(过滤标点,保留中文):
原文:"你好世界"(长度:4)
抄袭文:"世界你好"(长度:4)
计算:
连续公共子串:无长度≥5的连续子串(最长连续子串长度2)。
触发非连续LCS:最长公共子序列为"你好/世界"(长度2)。
重复率:
2 / 4 = 1.0 → 预期输出:重复率: 50.00%
测试样例9:中文+特殊符号(预处理保留中文)
原文文件内容:"中文测试:【第一章】绪论,1.1 研究背景"
抄袭版文件内容:"中文测试:【第一章】绪论,1.2 研究背景"
预处理后内容(过滤数字、符号、标点,保留中文):
原文:"中文测试第一章绪论研究背景"(长度:12)
抄袭文:"中文测试第一章绪论研究背景"(长度:12)
计算:
连续公共子串长度=12(≥5)
重复率:
12 / 12 = 1.0 → 预期输出:重复率: 100.00%
测试样例10:长文本中文重复(模拟实际论文)
原文文件内容:
"随着人工智能技术的发展,机器学习在医疗、金融、教育等领域得到广泛应用。机器学习的核心是通过数据训练模型,实现预测和决策。"
抄袭版文件内容:
"随着人工智能技术的进步,机器学习在医疗、金融、教育等领域得到广泛应用。机器学习的核心是通过数据训练模型,实现预测和决策支持。"
预处理后内容(过滤标点、空格,保留中文):
原文:"随着人工智能技术的发展机器学习在医疗金融教育等领域得到广泛应用机器学习的核心是通过数据训练模型实现预测和决策"(长度:48)
抄袭文:"随着人工智能技术的进步机器学习在医疗金融教育等领域得到广泛应用机器学习的核心是通过数据训练模型实现预测和决策支持"(长度:50)
计算:
连续公共子串:"随着人工智能技术的机器学习在医疗金融教育等领域得到广泛应用机器学习的核心是通过数据训练模型实现预测和决策"(长度:52,仅差异“发展”vs“进步”、“和”vs“和支持”)。
重复率:
52 / 56 = 0.9286 → 预期输出:重复率: 92.86%
部分结果展示




5.模块部分异常处理说明
(1)文本内容为空时返回0重复率防止出现运行错误

(2)文件路径输入有误时捕捉,提示用户文件路径存在问题

(3)文件读取异常时抛出错误,提醒用户进行排查修改


浙公网安备 33010602011771号