个人项目
| 这个作业属于哪个课程 | 软件工程 |
|---|---|
| 这个作业要求在哪里 | 个人项目 |
| 这个作业的目标 | 开发一个基于 N-Gram 与 Jaccard 系数的中文文本查重工具,实现文本清洗、jieba 分词、N-Gram 特征提取与 Jaccard 相似度计算;分析算法的时间、内存性能 |
1、PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) | |
|---|---|---|---|---|
| Planning | 计划 | |||
| · Estimate | ・估计这个任务需要多少时间 | 两天 | 420 | |
| Development | 开发 | |||
| · Analysis | ・需求分析 (包括学习新技术) | 120 | 80 | |
| · Design Spec | ・生成设计文档 | 10 | 10 | |
| · Design Review | ・设计复审 | 10 | 10 | |
| · Coding Standard | ・代码规范 (为目前的开发制定合适的规范) | 10 | 10 | |
| · Design | ・具体设计 | 20 | 10 | |
| · Coding | ・具体编码 | 240 | 90 | |
| · Code Review | ・代码复审 | 60 | 10 | |
| · Test | ・测试(自我测试,修改代码,提交修改) | 120 | 90 | |
| Reporting | 报告 | |||
| · Test Repor | ・测试报告 | 40 | 40 | |
| · Size Measurement | ・计算工作量 | 20 | 20 | |
| · Postmortem & Process Improvement Plan | ・事后总结,并提出过程改进计划 | 20 | 20 | |
| ・合计 | 670 | 390 |
2、项目流程
1、通过命令行读取两文件 --> 10
2、对两文件进行预处理 --> 20
3、生成滑动窗口N-Gram片段 --> 20
4、进行jaccard相似度计算,计算重合度 --> 40
5、命令行输出重复度,可选择打印重复片段 10
3、各模块细节
1、通过命令行读取两文件
2、对两文件进行预处理
先用re除去数据中的非重要信息(空格以及标点符号),再清洗好的数据通过jieba库划分为一个个词语
3、生成滑动窗口
对所有的词语进行N-Gram划分(k = 2),并保存在shingle集合中
4、进行jaccard相似度计算
J(A, B) = |A ∩ B| / |A ∪ B|
5、输出重合度
以计算出的ans的10%作为容错,即判断 (res*0.9 <= answer <= res*1.1)
4、代码规范
该项目基于python3.12版本研发
5、依赖库
jieba==0.42.1
6、性能分析
目前不存在明显的代码性能问题,最耗时的部分是 jieba 加载词典(marshal.load 耗时 0.4577秒)以及构建DAG图分词(__cut_DAG 耗时 0.5023秒),这些是该查重方法不可避免的时间开销,当前的代码的运行时间已符合要求,不需要再降低精度以提高运行效率
7、测试结果

上图为对于作业中所给出的orig.txt和orig_0.8_add.txt进行查重的结果,查重率为32.51%,发现跟老师的文件命名中的0.8不符,打开文件观察发现,抄袭版文件几乎保留了原版文件的所有字符,因此这两文件的查重只用进行字符的交集比并集运算即可。
下图为更改算法后进行“字符出现次数(重复按次数算)交集/并集”的结果

下表为老师标准测试案例下发之前的对“通过n-gram计算jaccard”算法的测试案例,目前看来无参考价值
| 用例 | 原文字数 | 抄袭字数 | 计算相似度 | 标准答案 | 误差比例 | 运行时间 (s) | 峰值内存 (MB) | ±10% 通过 |
|---|---|---|---|---|---|---|---|---|
| 01 | 473 | 473 | 100.00% | 100.00 | 0.00% | 0.4290 | 45.72 | ✅ |
| 02 | 414 | 416 | 98.93% | 98.60 | 0.34% | 0.0032 | 0.14 | ✅ |
| 03 | 396 | 391 | 48.48% | 48.07 | 0.86% | 0.0020 | 0.12 | ✅ |
| 04 | 451 | 473 | 27.10% | 24.80 | 9.29% | 0.0027 | 0.13 | ✅ |
| 05 | 460 | 438 | 25.22% | 22.47 | 12.23% | 0.0030 | 0.13 | ❌ |
| 06 | 427 | 354 | 15.33% | 13.19 | 16.23% | 0.0024 | 0.10 | ❌ |
| 07 | 391 | 370 | 6.61% | 1.75 | 277.67% | 0.0022 | 0.10 | ❌ |
| 08 | 376 | 321 | 3.37% | 0.45 | 648.22% | 0.0023 | 0.08 | ❌ |
| 09 | 360 | 377 | 0.30% | 0.00 | — | 0.0024 | 0.09 | ❌ |
| 10 | 0 | 16 | 0.00% | 0.00 | — | 0.0000 | 0.02 | ✅ |
用例1的运行时间和峰值内存远超于其他案例,是因为jieba库第一次运行时需要构建前缀词典,这是一次性初始化开销,并不是算法本身耗时。
用ai生成了10对测试用例,其中有5对案例的检测结果与ai给出的答案差别超过10%,原因在于n-gram的滑动窗口取值不同(本算法k=2,ai依据k=3),由此发现随着示例的字符数的减小以及相似程度的降低,不同k值之间的误差比例增大
案例八展示
原文件:
篮球运动是一项深受大众喜爱的团队运动,在全球范围内拥有广泛的群众基础。篮球比赛要求运动员具备良好的身体素质、技术水平和团队协作能力。进攻端需要通过传球、运球、投篮等技术配合,创造得分机会;防守端则需要通过卡位、抢断、盖帽等技术,阻止对方得分。
NBA是世界上水平最高的职业篮球联赛,汇聚了全球最优秀的篮球运动员。激烈的比赛、精彩的扣篮、精准的三分球让无数球迷为之疯狂。篮球运动不仅能够锻炼身体,还能够培养团队精神和竞争意识。在球场上,五个队员需要密切配合,各司其职,才能发挥出团队的最大战斗力。
青少年参与篮球运动有诸多益处。篮球运动能够促进骨骼发育,增强心肺功能,提高身体的协调性和灵活性。同时,篮球是一项团队运动,能够培养孩子的沟通能力和协作精神,学会在竞争中合作,在合作中竞争。通过篮球比赛,孩子们还能够学会面对胜负,培养坚韧不拔的意志品质。
抄袭版文件:
足球运动被誉为世界第一运动,在全球拥有数以亿计的球迷。足球比赛场地大、人数多,强调战术配合和整体作战。进攻时需要通过中场组织、边路突破、中路渗透等方式创造射门机会;防守时需要整体阵型保持紧凑,互相补位协防。
世界杯是足球运动的最高殿堂,每四年举办一次,吸引了全球观众的目光。各国国家队为了荣誉而战,比赛充满了激情和悬念。足球运动的魅力在于它的不确定性,弱队战胜强队的冷门时有发生,最后时刻的绝杀进球更是让人热血沸腾。
足球运动对青少年的成长也有积极的促进作用。长期进行足球训练能够增强体质,提高耐力和爆发力。足球是十一个人的运动,能够培养孩子的团队意识和集体荣誉感。在比赛中学会尊重裁判、尊重对手,遵守规则,这些品质对孩子的一生都有益处。
8、算法缺陷
通过jieba库计算jaccard相似度的方法无法适用于用词不同但词意相同的情况,就比如上一部分列举出的案例八,可以看出两篇文章的结构、语义、语言风格都有不小的相似程度,但是该算法计算的复杂度只有3.37%(k=2),0.45%(k=3),需要调用语言模型计算各词的特征向量以实现风格相似度的判断。
浙公网安备 33010602011771号