个人项目-论文查重

这个作业属于属于哪个课程 网工1934-软件工程
作业要求在哪里 作业要求
作业目标 通过独立完成个人项目熟悉软件开发流程,提高编程能力

作业github链接
PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 30
· Estimate · 估计这个任务需要多少时间 1000 1145
Development 开发 400 610
· Analysis · 需求分析 (包括学习新技术) 30 30
· Design Spec · 生成设计文档 60 20
· Design Review · 设计复审 60 30
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 15
· Design · 具体设计 30 30
· Coding · 具体编码 280 340
· Code Review · 代码复审 20 30
· Test · 测试(自我测试,修改代码,提交修改) 30 30
Reporting 报告 20 20
· Test Report · 测试报告 30 30
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 20 20
Total · 合计 1030 1175
整体流程
1、将文件地址输入到readTxtile类中进读取文件以及去除文本的标点符号,返回String变量data
2、data进入Analyzer中,进行分词,返回list
3、list进入Count中,进行getStringFrequency获取词频向量以及getDoubleStrForCosValue进行余弦相似度的公式计算
4、三个类由Main调用输出重复率
计算模块接口的设计与实现过程
1、计算公式:
关键:余弦相似度 (Cosine Similarity) 通过计算两个向量的夹角余弦值来评估他们的相似度。将向量根据坐标值,绘制到向量空间中,求得他们的夹角,并得出夹角对应的余弦值,此余弦值就可以用来表征这两个向量的相似性。夹角越小,余弦值越接近于1,它们的方向越吻合,则越相似。
2、具体实现:
Count进行分次后的字符串的词频计算,用了两次循环分别对两个字符串进行词频计算,每遇到相同的的词语计数变量就自加,遍历完字符串后将当前变量的值放到数组相应位置。
getDoubleStrForCosValue利用Count中得到的字符串词频向量带入余弦相似度公式计算得出结果。
`public class Count {
/**
 * 获取两组字符串的词频向量
 * @param str1List
 * @param str2List
 * @return
 */
public static int [][] getStringFrequency(List<String> str1List,List<String> str2List){
    Set<String> cnSet = new HashSet<String>();
    cnSet.addAll(str1List);
    cnSet.addAll(str2List);
    int [][] res = new int[2][cnSet.size()];
    Iterator it = cnSet.iterator();
    int i=0;
    while(it.hasNext()){
        String word = it.next().toString();
        int s1 = 0;
        int s2 = 0;
        for(String str : str1List){
            if(word.equals(str)){
                s1++;
            }
        }
        res[0][i] = s1;
        for(String str : str2List){
            if(word.equals(str)){
                s2++;
            }
        }
        res[1][i] = s2;
        i++;
    }
    return res;
}
/**
 * 获取两组向量的余弦值
 * @param ints
 * @return
 */
public static float getDoubleStrForCosValue(int [][] ints){
    BigDecimal fzSum = new BigDecimal(0);
    BigDecimal fmSum = new BigDecimal(0);
    BigDecimal seq1SumBigDecimal = new BigDecimal(0);
    BigDecimal seq2SumBigDecimal = new BigDecimal(0);
    int num = ints[0].length;
    for(int i=0;i<num;i++){
        BigDecimal adb = new BigDecimal(ints[0][i]).multiply(new BigDecimal(ints[1][i]));
        fzSum = fzSum.add(adb);
        seq1SumBigDecimal = seq1SumBigDecimal.add(new BigDecimal(Math.pow(ints[0][i],2)));
        seq2SumBigDecimal = seq2SumBigDecimal.add(new BigDecimal(Math.pow(ints[1][i],2)));
    }

    //开方
    double sqrt1 = Math.sqrt(seq1SumBigDecimal.doubleValue());
    double sqrt2 = Math.sqrt(seq2SumBigDecimal.doubleValue());
    //使用BigDecimal保证精确计算浮点数
    fmSum = new BigDecimal(sqrt1).multiply(new BigDecimal(sqrt2));

    return fzSum.divide(fmSum,10,RoundingMode.HALF_UP).floatValue();
}`

计算模块接口部分的性能改进
1、去除多余的标点符号
2、利用匹配正则表达式有利于提高运行效率以及精确度。
计算模块部分单元测试展示
测试覆盖率

单元测试代码

总结
1、在网上查了很多资料,学习到了很多新的知识,代码实现了余弦相似度的计算
2、需求分析做的不够好,在分析这一块做的非常差,在看到项目需求之前根本不知道从何下手,查了很多资料之后才明白
3、在psp中也体现出来预想的与实际确实差距很大,需要积累更多的项目经验

posted @ 2021-09-19 20:26  彤云密布  阅读(57)  评论(0编辑  收藏  举报