第一次个人编程作业
这个作业属于哪个课程 | 网工1934-软件工程 |
---|---|
这个作业要求在哪里 | 点击查看要求 |
这个作业的目标 | 按个人开发流程完成论文查重项目 |
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
运行结果
当输入的路径异常时
运行结果