[github](naaak03/202121331076 at main · naaak03/naaak03 (github.com))
个人项目-查重系统
| 这个作业属于哪个课程 |工程概论|
| ----------------- |--------------- |
| 这个作业要求在哪里|作业要求|
| 这个作业的目标 |系统学习编程|
需求
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
PSP
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 20 | 10 |
| · Estimate | · 估计这个任务需要多少时间 | 300 | 400 |
| Development | 开发 | 400 | 360 |
| · Analysis | · 需求分析 (包括学习新技术) | 20 | 60 |
| · Design Spec | · 生成设计文档 | 0 | 0 |
| · Design Review | · 设计复审 | 0 | 0 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 60 | 80 |
| · Design | · 具体设计 | 30 | 30 |
| · Coding | · 具体编码 | 150 | 180 |
| · Code Review | · 代码复审 | 5 | 10 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 100 | 200 |
| Reporting | 报告 | 180 | 180 |
| · Test Repor | · 测试报告 | 60 | 60 |
| · Size Measurement | · 计算工作量 | 60 | 40 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划0 | 10 | 10 |
| · 合计 | 1395 | 1620 |
算法实现
1、实现思路以及算法
算法使用的是 SImHash算法
思路:
分词:对需要比较的文本进行分词,提取特征向量。并对特征向量,进行权重(weight)设置。
hash: 通过hash函数计算各个特征向量的hash值。hash值为二进制数0 1 组成的n-bit签名。
加权:在hash值的基础上,给所有特征向量进行加权,即W = Hash * weight,且遇到1则hash值和权值正相乘,遇到0则hash值和权值负相乘。
合并:将上述各个特征向量的加权结果累加,变成只有一个序列串。拿前两个特征向量举例。
降维:对于n-bit签名的累加结果,如果大于0则置1,否则置0,从而得到该语句的simhash值,最后我们便可以根据不同语句simhash的海 明距离来判断它们的相似度。
计算:通过Simhash签名值,计算汉明距离。
2、计算模块接口的设计与实现过程
创建了一个类,这个类里面重载了类的创建模式
其中getSemblance依赖hammingDistance。hash以及simHash是用来对字符以及字符串hash计算的
getSemblance用来计算相似度,hammingDistance用来计算汉明距离。
由于采用了ansj库(用于分词),所以查重的字符串可能出现超频词,因此需要对字符串进行分词以及对超频词
过滤,所以在一开始的simhash()里面要对stopRecognition进行初始化,然后进行过滤以及分词,然后进行哈希图分配。接着根据哈希图进行权重分配,再进行转换变成01字符串,用于后面计算汉明距离和相似度用。
而hash是为了解决字符串过短无法进行hash算法而设计的。这一部分是通过查阅网上资料解决的。
其他几个类用来解决用命令行参数形式传输数据问题。读取文件写入文件。
3、性能改进
暂时没有想到该如何进行优化
4、测试展示
图中报错为ansj库调用出现问题,目前无法解决,查阅资料后进行尝试后仍不能解决。
由于是在DOS中执行测试的,所以用软件测试覆盖率的时候普遍低。。。。