• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

个人项目

开发技术 开发技术 2小时前 3次浏览

个人项目

软件工程 网工1934
作业要求 作业要求
作业目标 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。

Github项目代码链接
jar包所在链接

PSP表格

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

接口设计和实现过程

接口设计

接口 功能 实现
文件读写工具类AccessUtils 从路径中读取或写入文件 read方法读取文件并返回文本字符串,write方法向路径中写入结果字符串
查重算法工具类HashUtils 根据读到的文本返回simHash 接收字符串并通过汉语言分词依赖分词,计算simhash后返回字符串类型的simhash
查重结果处理类ResultUtils 根据simHash返回查重结果 传入simhash计算海明距离和文本相似度
主启动类TextCheck 项目主启动类 调用其他工具类实现文本查重
四个类对应的测试类 分别测试各个类的方法是否正常运行

项目设计

项目流程设计图
个人项目

项目结构
个人项目

项目实现

  1. 解决中文分词问题

参考网站:7个优秀的开源中文分词库推荐,实用性强
经过对比测试,最终选择中文分词依赖:HanLP

maven外部依赖

个人项目

  1. 相似度算法的实现

对比了余弦相似度算法和simHash算法,最终选择simHash算法

simHash算法简单介绍

  • 文本分词:将文本通过算法分为语义不同的字或词,语义与顺序无关
  • 等长哈希:将分词获得的字或词分别求出二进制hash值,并将该hash值填充至等长
  • 赋权求和:对每个hash值都赋一个权值(如出现的频率大小等分成不同等级),将hash值乘以权值后得到一个向量,若比特位为1,则加上向量在该位的分量,否则减去该位的分量
  • 降维:将文本的所有分词都赋权求和后,得到一个总的向量,将该向量大于0的位用1取代,小于等于0的用0取代,得到一个01向量,该向量就是文本的simhash
  1. 数据处理

海明距离两个码字的对应比特取值不同的比特数称为这两个码字的海明距离。在一个有效编码集中,任意两个码字的海明距离的最小值称为该编码集的海明距离。
得到两个文本字符串的simHash值后,通过计算两者海明距离来计算重复率

计算模块接口部分的性能

运行耗时分析图

个人项目

运行耗时对比图

个人项目

运行占用内存分析图

个人项目

上述图示可得:相对较为耗时,占用内存较大的是用于分词的外部依赖和计算分词的hash值

模块部分单元测试展示

测试代码覆盖率

个人项目

文本路径正确与错误对比

个人项目

获取原始文本和对比文本的simHash

个人项目

分词工具分词测试

个人项目

标点符号对重复率的影响

个人项目

分词顺序对重复率的影响

个人项目

模块部分异常处理说明

读取路径为空异常

个人项目

读取路径错误异常

个人项目

写入路径错误异常

个人项目

读取文本为空

读取文本为空时,返回空的simHash,即文本重复率必定为0,因此无需抛出异常
个人项目

项目运行示例

运行项目测试

个人项目

运行结果

个人项目


程序员灯塔
转载请注明原文链接:个人项目
喜欢 (0)