个人项目:论文查重
这个作业属于哪个课程 | <网工1934-软件工程> |
---|---|
这个作业要求在哪 | 作业要求 |
这个作业的目标 | 实现论文查重系统,并学会使用git,JProfiler等工具和规划时间。 |
Github项目地址
1、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 30 |
Estimate | 估计这个任务需要多少时间 | 1050 | 1570 |
Development | 开发 | 300 | 400 |
Analysis | 需求分析(包括学习新技术) | 100 | 250 |
Design Spec | 生成设计文档 | 30 | 35 |
Design Review | 设计复审 | 10 | 35 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 20 | 30 |
Design | 具体设计 | 100 | 125 |
Coding | 具体编码 | 200 | 300 |
Code Review | 代码复审 | 20 | 35 |
Test | 测试(自我测试,修改代码,提交代码) | 100 | 150 |
Reporting | 报告 | 50 | 60 |
Test Repor | 测试报告 | 50 | 60 |
SizeMeasurement | 计算工作量 | 30 | 35 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 20 | 25 |
合计 | 1050 | 1570 | |
2、接口的设计与实现
2.1整体流程图
2.2读写文件
在main方法中提取数组参数args,来获得在命令行输入的文件地址。再调用Java.io包提供的接口实现就可以了。此处需要注意与cmd的编码是否一致,若不一致,需要在输入的时候转换编码。
2.3过滤文本
为了让文本更好地进行分词操作,需要对文本进行过滤。主要是用Jsoup来过滤html标签,再利用String的replaceAll方法与正则表达式过滤无关内容。
2.4 Simhash算法
- SimHash介绍:simhash可以计算文本间的相似度,我们可以通过simhash算法计算出文档的simhash值,通过比较各个文本的simhash值之间的汉明距离的大小来判断其相似度,汉明距离越小,则相似度越大。一般大文本去重,大小<=3的即可判断为重复。
- 算法流程:simhash算法分为5个步骤:1、分词、2、hash、3、加权、4、合并、5、降维
-
1、分词。把文本分解出多个关键词,并为每个关键词加上权重。在本项目中,我用Jsoup类等对文本进行过滤后,再用StandardTokenizer类对文本进行分词,同时该类会根据每个词的词性来进行赋权。
-
2、计算hash值。通过hash算法,为每个分词赋予一个hash值。
-
3、加权。在得到分词的hash值后,需要按照分词的权重形成加权数字串。比如“计算机”的hash值是“100101”,权重为5,通过加权得到“5 -5 -5 5 -5 5”。
-
4、合并。在每个分词都进行加权运算后,把得到的值相累加,得到一个数字串。比如“计算机”加权后的值是“5 -5 -5 5 -5 5”,“键盘”加权后的值是“4 -4 -4 4 -4 4”,两次通过合并运算后得到“9 -9 1 -1 1 9”。
-
5、降维。在所有分词都进行合并运算后,把得到的值变成01串。每一位如果大于0,则该位变为1,否则为0。
2.5计算相似度
得到各自的SimHash值后,若两者内容相似,则SimHash值也相近,两者相除即可得到相似度。
3、性能分析
内存消耗比较少。
4、单元测试
4.1测试过滤
4.2测试SimHash计算
4.3测试文本相似度
代码覆盖率
5、异常处理
主要是输入和输出文件时进行IO操作时容易出现IOException,比如输入了不存在文件地址或者文件正在被访问。在该部分用try-catch即可解决。
结果:
6、项目程序测试
结果:
7、心得
把代码签入github是花费最多时间的,在最后一步git push origin master时老是报错error:src refspec master does not match any,网上查到其可能的原因是:
- 本地文件与 github 上的文件有冲突
- 本地需要提交的文件中存在空文件
- 本地的 origin 和 remote origin/master 没有建立关联
第三种问题可以重新建立本地和远端连接,对于前两种解决办法是:
$ git remote remove origin
$ git remote add origin git@github.com:XXX/XXX.github.io.git
$ git push origin master
倒霉如我,这两种方法都没成功,查了很久发现一个方法,输入
$ git push origin HEAD:master
就可以了,如图
(这个代码的HEAD指向当前分支的顶部),这说明我的当前分支不是master,master不一定指向当前工作的branch,用HEAD感觉比master好些。