这个作业属于哪个课程 | 作业课程 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。 |
*PSP2.1* | *Personal Software Process Stages* | *预估耗时(分钟)* | *实际耗时(分钟)* |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 600 | 1240 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 120 | 360 |
· Design Spec | · 生成设计文档 | 20 | 40 |
· Design Review | · 设计复审 | 20 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
· Design | · 具体设计 | 40 | 60 |
· Coding | · 具体编码 | 220 | 240 |
· Code Review | · 代码复审 | 20 | 40 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 240 |
Reporting | 报告 | ||
· Test Repor | · 测试报告 | 40 | 180 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
· 合计 | 600 | 1240 |
1.路径:SE_two\src\main\java\
Cosine类:计算余弦相似度
IO类:文件读取与写入
Main类:主类
Participle类:分词
2.路径:SE_two\src\main\resources\
hit_stopwords.txt:停用词词典,选用的是哈工大版停用词
3.路径:SE_two\src\test\
java文件夹下存放的是测试类,测试各对应类中的各个方法
例:testCosine类测试Cosine类中的各个方法
resources文件夹下存放的是测试过程中需要读入和写出的文本
该项目主要使用:hanlp分词器+余弦相似度算法
假设有两个句子:
句子A:这只皮靴号码大了,那只号码合适。
句子B:这只皮靴号码不小,那只更合适。
第一步:分词
先是标准分词结果:
句子A:[这, 只, 皮靴, 号码, 大, 了, ,, 那只, 号码, 合适, 。]
句子B:[这, 只, 皮靴, 号码, 不, 小, ,, 那只更, 合适, 。]
读取停用词:
[———, 》),, )÷(1-, ”,, )、, =(, :, →, ℃ , ...]
对标准分词结果进行停用词过滤:
句子A:[只, 皮靴, 号码, 大, 那只, 号码, 合适]
句子B:[只, 皮靴, 号码, 不, 小, 那只更, 合适]
实现:Participle.participle() 借助 hanlp分词器
第二步:合并分词
将第一步得到的两个分词结果进行合并:
[只, 皮靴, 号码, 大, 那只, 合适, 不, 小, 那只更]
实现:Participle.unionSet()
第三步:计算词频
计算各句子分词在合并分词中出现的次数
句子A:[只, 皮靴, 号码, 大, 那只, 号码, 合适]
合并分词:[只 1, 皮靴 1, 号码 2, 大 1, 那只 1, 合适 1, 不 0, 小 0, 那只更 0]
句子A词频:[1, 1, 2, 1, 1, 1, 0, 0, 0]
句子B:[只, 皮靴, 号码, 不, 小, 那只更, 合适]
合并分词:[只 1, 皮靴 1, 号码 1, 大 0, 那只 0, 合适 1, 不 1, 小 1, 那只更 1]
句子B词频:[1, 1, 1, 0, 0, 1, 1, 1, 1]
实现:Participle.computingWordFrequency()
第四步:计算余弦相似度
计算结果作为相似度对比结果
A·B=(1, 1, 2, 1, 1, 1, 0, 0, 0)·(1, 1, 1, 0, 0, 1, 1, 1, 1)=5
|A|=|(1, 1, 2, 1, 1, 1, 0, 0, 0)|=3
|B|=|(1, 1, 1, 0, 0, 1, 1, 1, 1)|=根号7
cos=5/(3*根号7)=0.6299
实现:Cosine.calculate()
参考博客:余弦计算相似度度量
程序中消耗较大的有:
int[] 相关的主要有,词频计算与余弦相似度计算
hanlp 分词器分词与停用词过滤
不知道为什么,在 IDEA中直接运行测试方法只用 900ms左右
而在 IDEA中通过 Profile测试工具运行测试文本却要用 4s左右
即使是实际使用,也只是用 1s左右
测试结果与异常提醒均以注释形式写入代码中
lines covered低的原因是:写了很多异常情况信息提示,却很少用到
异常处理写了很多,这里展示不完,主要说一下写在哪里,写了什么。
基本各个方法都写关于传入参数的异常处理,例:
关于计算的方法,一些计算过程也写了异常处理,例:
关于异常情况,大致上都在测试类中,把各个方法会碰到的异常情况都测试了一次,并且异常处理结果以注释形式写在各个测试方法中,有兴趣的可以在单元测试那里看。
mevan项目以及打包后的jar包,读取resources文件夹下的txt文件失败问题:
参考博客