个人项目
作者:互联网
个人项目
软件工程 | 网工1934 |
---|---|
作业要求 | 作业要求 |
作业目标 | 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。 |
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 | 项目主启动类 | 调用其他工具类实现文本查重 |
四个类对应的测试类 | 分别测试各个类的方法是否正常运行 |
项目设计
项目流程设计图
项目结构
项目实现
- 解决中文分词问题
参考网站:7个优秀的开源中文分词库推荐,实用性强
经过对比测试,最终选择中文分词依赖:HanLP
maven外部依赖
- 相似度算法的实现
对比了余弦相似度算法和simHash算法,最终选择simHash算法
simHash算法简单介绍
- 文本分词:将文本通过算法分为
语义不同的字或词
,语义与顺序无关 - 等长哈希:将分词获得的字或词分别求出
二进制hash值
,并将该hash值填充至等长 - 赋权求和:对
每个hash值都赋一个权值
(如出现的频率大小等分成不同等级),将hash值乘以权值
后得到一个向量,若比特位为1,则加上向量在该位的分量,否则减去该位的分量
- 降维:将文本的所有分词都赋权求和后,得到一个总的向量,将该向量
大于0的位用1取代,小于等于0的用0取代
,得到一个01向量,该向量就是文本的simhash
- 数据处理
海明距离两个码字的对应比特取值不同的比特数称为这两个码字的海明距离。在一个有效编码集中,任意两个码字的海明距离的最小值称为该编码集的海明距离。
得到两个文本字符串的simHash值后,通过计算两者海明距离来计算重复率
计算模块接口部分的性能
运行耗时分析图
运行耗时对比图
运行占用内存分析图
上述图示可得:相对较为耗时,占用内存较大的是用于分词的外部依赖和计算分词的hash值
模块部分单元测试展示
测试代码覆盖率
文本路径正确与错误对比
获取原始文本和对比文本的simHash
分词工具分词测试
标点符号对重复率的影响
分词顺序对重复率的影响
模块部分异常处理说明
读取路径为空异常
读取路径错误异常
写入路径错误异常
读取文本为空
读取文本为空时,返回空的simHash,即文本重复率必定为0,因此无需抛出异常
项目运行示例
运行项目测试
运行结果
标签:20,个人,项目,海明,算法,simHash,文本,分词 来源: https://www.cnblogs.com/kizan/p/15291625.html