第一次个人编程作业
第一次个人编程作业
这个作业属于哪个课程 | 课程 |
---|---|
这个作业要求在哪里 | 要求 |
这个作业的目标 | 实现论文查重算法 + PSP表格 + 使用JProfiler性能分析 + GitHub管理 |
1、代码链接 | |
我的代码 | |
2、PSP表格 |
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 120 |
Estimate | 估计这个任务需要多少时间 | 10 | 0 |
Development | 开发 | 60 | 60 |
Analysis | 需求分析 (包括学习新技术) | 60 | 60 |
Design Spec | 生成设计文档 | 60 | 240 |
Design Review | 设计复审 | 10 | 10 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 30 |
Design | 具体设计 | 20 | 30 |
Coding | 具体编码 | 30 | 60 |
Code Review | 代码复审 | 10 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 5 | 10 |
Reporting | 报告 | 60 | 180 |
Test Repor | 测试报告 | 60 | 30 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 425 | 700 | |
3、计算模块接口的设计与实现过程 | |||
3.1 主要的类 | |||
File类: | |||
FileReader类: | |||
BufferedReader类:读出文件 | |||
FileOutputStream类:写入文件 | |||
StringUtils类:计算jaro-wink 距离 | |||
Main类:主方法 | |||
Test类:测试类 | |||
3.2 算法 | |||
1、算法简介 | |||
Jaro Distance是字符串相似性的一种度量方式,是一种编辑距离——指两个字串之间,由一个转成另一个所需的最少编辑操作次数,编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。Jaro 距离越高本文相似性越高,Jaro–Winkler distance是Jaro Distance的一个变种 | |||
2、算法原理 | |||
Jaro Distance: | |||
d(相似度 | Jaro Distance)=(m/s1+m/s2+(m-t)/m)/3 | ||
m是匹配数目(保证顺序相同) | |||
s字符串长度 | |||
t是换位数目: | |||
两个分别来自S1和S2的字符如果相距不超过 | |||
[max( | s1 | , | s2 |
我们就认为这两个字符串是匹配的;而这些相互匹配的字符则决定了换位的数目t,简单来说就是不同顺序的匹配字符的数目的一半即为换位的数目t,举例来说,MARTHA与MARHTA的字符都是匹配的,但是这些匹配的字符中,T和H要换位才能把MARTHA变为MARHTA,那么T和H就是不同的顺序的匹配字符,t=2/2=1。 | |||
Jaro-Winkler给予了起始部分就相同的字符串更高的分数,他定义了一个前缀p,给予两个字符串,如果前缀部分有长度为 的部分相同,则Jaro-Winkler Distance为: | |||
d(相似度 | Jaro-Winkler Distance)=d(相似度 | Jaro Distance)+(lp(1-d(相似度 | Jaro Distance))) |
l是前缀的相同的长度,但是规定最大为4 | |||
p则是调整分数的常数,规定不能超过0.25,不然可能出现dw大于1的情况,Winkler将这个常数定义为0.1 | |||
3、实现方式 | |||
使用common lang中的getJaroWinklerDistance实现 |
点击查看代码
public static double getJaroWinklerDistance(final CharSequence first, final CharSequence second) {
final double DEFAULT_SCALING_FACTOR = 0.1; //标准权重
if (first == null || second == null) {
throw new IllegalArgumentException("Strings must not be null");
}
final double jaro = score(first,second); // 计算Jaro score
final int cl = commonPrefixLength(first, second); // 计算公共前缀长度
final double matchScore = Math.round((jaro + (DEFAULT_SCALING_FACTOR * cl * (1.0 - jaro))) *100.0)/100.0; // 计算 Jaro-Winkler score
return matchScore;
}
4、性能测试
5、单元测试
测试类
public class Test {
public static void main(String[] args){
File f=new File(args[0]);//读取指定文件,文件中装有需要查重的文件名,然后
String s1,s2;
String[] s = new String[2];
int i;
try(BufferedReader fr=new BufferedReader(new FileReader(f))){
s1= fr.readLine();
s2= fr.readLine();
while (s1!=null&&s2!=null){
s[0]=s1;
s[1]=s2;
s[2]=args[1];//加载要将结果输入的文件
Main.main(s);//使用我写的查重程序
}
}catch (IOException e){e.printStackTrace();}
}
}
6、异常处理
7、总结
第一次写报告。我不熟,不仅进度缓慢还质量不高,实在是所欠缺。