软件工程导论——个人项目之论文查重
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-12/ |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-12/homework/13220 |
这个作业的目标 | 设计一个论文查重算法并实现;学会 Git 版本控制 |
Github仓库地址 | https://github.com/kebai633932/kebai633932/blob/main/3122004910 |
一、编码要求
1.在Github仓库中新建一个学号为名的文件夹。
2.在开始实现程序之前,在PSP表格[附录2]记录下你估计在程序开发各个步骤上耗费的时间,在你实现程序之后,在PSP表格记录下你在程序的各个模块上实际花费的时间。
3.使用C++ 、Java语言或者python3实现,提交python代码时请附带上requirements.txt,。C++请使用Visual Studio Community 2017进行开发,运行环境为64-bit Windows 10。对于C++/Java,还需将编译好的程序发布到Github仓库中的releases中
4.提交的代码要求经过Code Quality Analysis工具的分析并消除所有的警告。
5.完成项目的首个版本之后,请使用性能分析工具Studio Profiling Tools来找出代码中的性能瓶颈并进行改进。
6.使用Github[附录3]来管理源代码和测试用例,代码有进展即签入Github。签入记录不合理的项目会被助教抽查询问项目细节。
7.使用单元测试[附录4]对项目进行测试,并使用插件查看测试分支覆盖率等指标;写出至少10个测试用例确保你的程序能够正确处理各种情况。
二、需求
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
三.实现
1.在Github仓库中新建一个学号为名的文件夹。
2.在开始实现程序之前,在PSP表格[附录2]记录下你估计在程序开发各个步骤上耗费的时间,在你实现程序之后,在PSP表格记录下你在程序的各个模块上实际花费的时间。
PSP表格
Personal | Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 30 |
Estimate | 估计这个任务需要多少时间 | 40 | 20 |
Development | 开发 | 620 | 730 |
Analysis | 需求分析 (包括学习新技术) | 150 | 70 |
Design Spec | 生成设计文档 | 90 | 80 |
Design Review | 设计复审 | 60 | 50 |
Coding Standard | 代码规范 | 40 | 70 |
Design | 具体设计 | 80 | 50 |
Coding | 具体编码 | 200 | 250 |
Code Review | 代码复审 | 60 | 50 |
Test | 测试(自我测试,修改代码) | 80 | 80 |
Reporting | 报告 | 40 | 50 |
Test Report | 测试报告 | 30 | 60 |
Size Measurement | 计算工作量 | 30 | 55 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 35 |
合计 | 990 | 900 |
3.算法分析
借鉴文章地址:
https://zhuanlan.zhihu.com/p/71488127
https://zhuanlan.zhihu.com/p/31197209
SimHash 的核心思想是将一段文本通过特定的哈希算法转换为一个固定长度的二进制哈希值(通常是 64 位或 128 位),这种哈希值称为 SimHash。不同的文本会得到不同的哈希值,但相似的文本生成的 SimHash 值之间的 汉明距离(Hamming Distance) 很小。汉明距离越小,文本越相似。
SimHash 的具体工作流程如下:
文本分词:将文章或文本分成若干个词或片段(如单词或 n-gram)。
单词哈希:对每个词或片段计算哈希值,通常使用简单的哈希函数(如 MD5、SHA 或 MurmurHash)。
加权向量:将每个词的哈希值转化为向量,并根据词频或词的权重调整向量的权重。
生成 SimHash:通过加权合并每个词的哈希值,得到一个固定长度的二进制向量,即 SimHash 值。
汉明距离:比较两个文本的 SimHash 值,通过计算它们的汉明距离(即两个二进制值不同位数的个数)来确定相似度。
4.使用C++ 、Java语言或者python3实现,提交python代码时请附带上requirements.txt,。C++请使用Visual Studio Community 2017进行开发,运行环境为64-bit Windows 10。对于C++/Java,还需将编译好的程序发布到Github仓库中的releases中
开发环境
编程语言:Java
IDE:IntelliJ IDEA 2023.3.6 (Ultimate Edition)
外部依赖jar包:junit-4.13.1,hamcrest-core-1.3,SLF4J 1.7.32
性能分析工具:JProfiler 14.0.4
5.提交的代码要求经过Code Quality Analysis工具的分析并消除所有的警告。
Code Quality Analysis工具的分析
Code Quality Analysis工具:checkstyle
Sun checks和Google checks,太难,没有实现,加了注释和优化代码
6.完成项目的首个版本之后,请使用性能分析工具Studio Profiling Tools来找出代码中的性能瓶颈并进行改进。
性能分析工具JProfiler(Studio Profiling Tools)来找出代码中的性能瓶颈:
开始的失败:
profile "Main"
成功:
attatch the JVM:
7.使用Github[附录3]来管理源代码和测试用例,代码有进展即签入Github。签入记录不合理的项目会被助教抽查询问项目细节。
管理源代码和测试用例:
测试用例:
8.使用单元测试[附录4]对项目进行测试,并使用插件查看测试分支覆盖率等指标;写出至少10个测试用例确保你的程序能够正确处理各种情况。
单元测试:
测试报告:
分支覆盖率: