第一次个人编程作业

第一次个人编程作业

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

posted @ 2021-09-19 22:18  陆梦龙  阅读(48)  评论(0编辑  收藏  举报