第一次个人编程作业
第一次个人编程作业
| 这个作业属于哪个课程 | 课程 |
|---|---|
| 这个作业要求在哪里 | 要求 |
| 这个作业的目标 | 实现论文查重算法 + 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、总结
第一次写报告。我不熟,不仅进度缓慢还质量不高,实在是所欠缺。

浙公网安备 33010602011771号