个人项目:论文查重

这个作业属于哪个课程 <网工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好些。

posted @ 2021-09-19 16:17  ghy2021  阅读(56)  评论(0编辑  收藏  举报