第一次个人编程作业
第一次编程作业
软件工程 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-12 |
---|---|
作业要求 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13014 |
作业目标 | 学习使用Java(Maven)建立工程项目,运用各种测试工具,实现论文查重 |
github链接 | 链接 |
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
-Estimate | -估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 380 | 360 |
-Analysis | -需求分析 (包括学习新技术) | 120 | 90 |
-Design Spec | -生成设计文档 | 40 | 10 |
-Design Review | -设计复审 | 20 | 30 |
-Coding Standard | -代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
-Design | -具体设计 | 30 | 30 |
-Coding | -具体编码 | 160 | 200 |
-Code Review | -代码复审 | 20 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 240 |
-Reporting | -报告 | 90 | 120 |
-Test Report | -测试报告 | 40 | 60 |
-Size Measurement | -计算工作量 | 30 | 30 |
-Postmortem & Process Improvement Plan | -事后总结, 并提出过程改进计划 | 20 | 20 |
合计 | 1120 | 1270 |
编程环境:
- 编程语言:JAVA
- IDEA版本:IntelliJ IDEA Community Edition 2022.3
- 项目构建工具:maven
- 性能分析工具:JProfiler
模块与设计
设计
主要思路
模块
主要的类
App:是运行的类,输入文件的路径和写入的文件路径然后进行查重
utils文件夹中:
Fileu用于打开文件,读取文件。
hamming和Simhash是用于计算海明距离求相似度的
ikF是提词器,进行提词。
主要的函数
函数 | 作用 |
---|---|
getSimHash(String date) , getHash(String str) | 获取simHash, 获取hash的值 |
getHammingDis(String simHash1,String simHash2) ,getSimilarity(String simHash1, String simHash2) | getHammingDis(String simHash1,String simHash2) ,getSimilarity(String simHash1, String simHash2) |
getString(String data,boolean useSmart) | 进行分词,获取关键词 |
参考链接:SimHash
异常抛出函数:有参构造,获取错误信息,异常的处理
FileException(String errMessage),getErrMessage(),handle()。
运行结果
命令行输入:
txt结果:
核心算法
SimHash.
simhash是由 Charikar 在2002年提出来的,参考 《Similarity estimation techniques from rounding algorithms》 。
介绍下这个算法主要原理,为了便于理解尽量不使用数学公式,分为这几步:
1、分词,把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重,我们假设权重分为5个级别(1~5)。比如:“ 美国“51区”雇员称内部有9架飞碟,曾看见灰色外星人 ” ==> 分词后为 “ 美国(4) 51区(5) 雇员(3) 称(1) 内部(2) 有(1) 9架(3) 飞碟(5) 曾(1) 看见(3) 灰色(4) 外星人(5)”,括号里是代表单词在整个句子里重要程度,数字越大越重要。
2、hash,通过hash算法把每个词变成hash值,比如“美国”通过hash算法计算为 100101,“51区”通过hash算法计算为 101011。这样我们的字符串就变成了一串串数字,还记得文章开头说过的吗,要把文章变为数字计算才能提高相似度计算性能,现在是降维过程进行时。
3、加权,通过 2步骤的hash生成结果,需要按照单词的权重形成加权数字串,比如“美国”的hash值为“100101”,通过加权计算为“4 -4 -4 4 -4 4”;“51区”的hash值为“101011”,通过加权计算为 “ 5 -5 5 -5 5 5”。
4、合并,把上面各个单词算出来的序列值累加,变成只有一个序列串。比如 “美国”的 “4 -4 -4 4 -4 4”,“51区”的 “ 5 -5 5 -5 5 5”, 把每一位进行累加, “4+5 -4+-5 -4+5 4+-5 -4+5 4+5” ==》 “9 -9 1 -1 1 9”。这里作为示例只算了两个单词的,真实计算需要把所有单词的序列串累加。
5、降维,把4步算出来的 “9 -9 1 -1 1 9” 变成 0 1 串,形成我们最终的simhash签名。 如果每一位大于0 记为 1,小于0 记为 0。最后算出结果为:“1 0 1 0 1 1”。
海明距离
1.通过传入两个simHash来进行计算海明距离
2.根据公式0.01 * (100 - distance * 100 / 128)来计算相似度
实例流程:
单元测试
主要的测试类:
测试案例:使用相关数据进行测试,举例一些数据进行测试看看能不能运行
测试海明距离和相似度
红色的是测试错误格式,抛出成功
测试分词器
测试海明hash:
模块性能分析与改进
模块性能分析图:
海明计算模块
可以看到主要的占用是计算的模块和分词,已经进行优化了。
posted on 2023-09-16 22:17 lishaidapu 阅读(29) 评论(0) 编辑 收藏 举报