个人项目

这个作业属于哪个课程 软件工程
这个作业要求在哪里 个人项目
这个作业的目标 开发一个基于 N-Gram 与 Jaccard 系数的中文文本查重工具,实现文本清洗、jieba 分词、N-Gram 特征提取与 Jaccard 相似度计算;分析算法的时间、内存性能

作业所在的github仓库

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、测试结果

image

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

下图为更改算法后进行“字符出现次数(重复按次数算)交集/并集”的结果

image

下表为老师标准测试案例下发之前的对“通过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),需要调用语言模型计算各词的特征向量以实现风格相似度的判断。

posted @ 2026-09-14 21:17  李忠林  阅读(13)  评论(0)    收藏  举报