第一次个人编程作业
一、GitHub链接
二、计算模块接口的设计与实现过程
主要有三大类:
simhash算法解释:
-
本次个人编程项目主要采取simhash算法来计算文本相似度,在传统的simhash算法上进行了更改。
-
算法关键:计算得到汉明距离
-
最后由公式,将汉明距离带入x即可计算出文本相似度
算法改进:
-
不足:simhash算法在短文本上有着很大缺陷,比如:
1.福大今天真不错 2.福大今天真美丽
可据上述流程图,最后两个文本的64位二进制码分别为:
0001011101101001001110011100000100101000011100100110101111001100 1011101111001111111110011101101100111101111100101010001011001100
不同位数21位,即汉明距离为21,带入公式可得相似度约为0.0000007,可见若是对短文本使用simhash算法将会带来较大偏差。
-
改进思路:在短文本的比对中引入新的适合算法,偷瞧了下前面同学的算法,觉定使用余弦相似度算法
-
余弦相似度算法概要:
- 对比较文本分词得到词表
- 合并去重
- 计算特征值并向量化
- 计算余弦值:
三、计算模块接口部分的性能改进
由于相似度计算的模糊性,无法给出特定的某个数值来决定具体字数使用两者算法的准确度。改为测试字符数对效率的影响,可知当字符数大于3000时,simhash效率开始明显高于余弦相似度,因此本次项目将阈值设为3000.在3000字符数以下使用余弦相似度算法,以上使用simhash算法
性能分析:
- 总览:大概在2s左右完成,符合要求
-
类内存消耗:绝大部分消耗在了分词
四.计算模块部分单元测试展示
-
给出的示例文本测试
/** * 测试给出的示例原本 */ @Test public void simTest() throws IOException { File folder = new File("src/TestFile/sim_0.8"); File[] files = folder.listFiles(); for(File file:files){ if(file == files[0]){ continue; } System.out.println(files[0].getName()+" 与文本 " + file.getName() + "的相似度为:"); Unit.ans(files[0].getPath(),file.getPath()); System.out.println("-----------------------------"); } }
-
测试3000字以下使用余弦相似的算法:
/** * 在3000字符下文本的比较(使用余弦相似度算法) */ @Test public void CosTest() throws IOException { File folder = new File("src/TestFile/costest"); File[] files = folder.listFiles(); for(File file:files){ if(file == files[0]){ continue; } System.out.println(files[0].getName()+" 与文本 " + file.getName() + "的相似度为:"); Unit.ans(files[0].getPath(),file.getPath()); System.out.println("-----------------------------"); } }
- 注:sim和cos分别为simhash算法和余弦相似度算法所放的包,故存在覆盖率为0的情况
五、异常类(空文本报错)
public class CommonException extends RuntimeException {
public CommonException(String message) {
super(message);
}
public CommonException(String message, Throwable cause) {
super(message, cause);
}
}
if(text1.length() == 0 || text2.length() == 0){
throw new CommonException("文本为空");
}
六、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 40 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 5 | 5 |
Development | 开发 | 240 | 150 |
· Analysis | · 需求分析 (包括学习新技术) | 300 | 360 |
· Design Spec | · 生成设计文档 | 30 | 90 |
· Design Review | · 设计复审 | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 10 |
· Design | · 具体设计 | 120 | 60 |
· Coding | · 具体编码 | 240 | 200 |
· Code Review | · 代码复审 | 60 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 90 |
Reporting | 报告 | 40 | 100 |
· Test Repor | · 测试报告 | 20 | 20 |
· Size Measurement | · 计算工作量 | 15 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 120 | 60 |
· 合计 | 1350 | 1245 |