第一次个人编程作业

这个作业属于哪个课程 网工1934-软件工程
这个作业要求在哪里 点击查看要求
这个作业的目标 按个人开发流程完成论文查重项目

我的GitHub

1.PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 60
Estimate 估计这个任务需要多少时间 5 5
Development 开发 480 900
Analysis 需求分析 (包括学习新技术) 480 600
Design Spec 生成设计文档 20 30
Design Review 设计复审 10 15
Coding Standard 代码规范 (为目前的开发制定合适的规范) 20 30
Design 具体设计 120 60
Coding 具体编码 240 360
Code Review 代码复审 30 20
Test 测试(自我测试,修改代码,提交修改) 120 180
Reporting 报告 90 120
Test Repor 测试报告 60 80
Size Measurement 计算工作量 60 25
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30 40
合计 1795 2525

2.模块接口的设计与实现过程

设计原理


SimHash算法

simhash作为locality sensitive hash(局部敏感哈希)的一种,其主要思想是降维,将高维的特征向量映射成低维的特征向量,通过两个向量的Hamming Distance来确定文章是否重复或者高度近似。其中,Hamming Distance,又称汉明距离,在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。也就是说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如:1011101 与 1001001 之间的汉明距离是 2。至于我们常说的字符串编辑距离则是一般形式的汉明距离。如此,通过比较多个文档的simHash值的海明距离,可以获取它们的相似度。


SimHash算法的五个步骤

1、分词,把需要判断文本分词形成这个文章的特征单词。
2、hash,通过hash算法把每个词变成hash值, 比如“美国”通过hash算法计算为 100101, “51区”通过hash算法计算为 101011。
3、加权,通过 2步骤的hash生成结果,需要按照单词的权重形成加权数字串
4、合并,把上面各个单词算出来的序列值累加,变成只有一个序列串。
5、降维,把4步算出来的 “9 -9 1 -1 1 9” 变成 0 1 串,形成我们最终的simhash签名。


SimHash算法流程图

模块设计

依赖的外部库

关键包介绍---HanLP

HanLP是由一系列模型与算法组成的Java工具包,目标是促进自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。
HanLP能提供以下功能:关键词提取、短语提取、繁体转简体、简体转繁体、分词、词性标注、拼音转换、自动摘要、命名实体识别(地名、机构名等)、文本推荐等功能。


关键函数步骤与算法流程图

性能分析

对字符串进行hash计算时,可以采用hashmap,一种理论上具有O(1)复杂度的查找数据结构。要查找一个key值时,通过传入一个key就可以很快的返回一个value。

概述图

类图

包图

运行时间


单元测试

getSemblance()测试



readfile()测试


hammingDistance()测试


hash()测试


strSimHash()测试


cleanResume()测试


main()测试





测试覆盖率

异常处理

当查重的字符串无内容时,会抛出java.lang.Error: 字符串为空


运行结果

当查重的字符串为Null时,会抛出java.lang.NullPointerException

运行结果

命令行输入的文本路径不符合要求,即不是 [原文文件] [抄袭版论文的文件] [答案文件]时,也会抛出Error


运行结果


当输入的路径异常时

运行结果



posted @ 2021-09-17 14:12  路过点赞  阅读(37)  评论(1编辑  收藏  举报