软工作业2:个人项目

作业概述

这个作业属于哪个课程 软件工程
这个作业要求在哪里 作业链接
这个作业的目标 完成项目实现论文查重算法

github

github链接

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 20 20
· Estimate · 估计这个任务需要多少时间 60 70
Development 开发 50 40
· Analysis · 需求分析 (包括学习新技术) 30 50
· Design Spec · 生成设计文档 30 30
· Design Review · 设计复审 10 10
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 20 15
· Design · 具体设计 20 20
· Coding · 具体编码 30 30
· Code Review · 代码复审 10 5
· Test · 测试(自我测试,修改代码,提交修改) 10 15
Reporting 报告 60 70
· Test Repor · 测试报告 30 40
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 50 40
· 合计 430 445

模块接口的设计与实现过程

1.test ---- main 方法

2.HammingUtils ---- 计算海明距离

3.SimHashUtils ---- 计算 SimHash 值

4.TxtIOUtils ---- 读写 txt 文件

5.ShortStringException ---- 处理文本内容过短

性能分析

方法调用情况


各部分代码耗时

最耗时的代码如下:

点击查看代码
 public static String getSimHash(String str){
        // 文本长度太短时HanLp无法取得关键字
        try{
            if(str.length() < 200) throw new ShortStringException("文本过短!");
        }catch (ShortStringException e){
            e.printStackTrace();
            return null;
        }
        // 用数组表示特征向量,取128位,从 0 1 2 位开始表示从高位到低位
        int[] v = new int[128];
        // 1、分词(使用了外部依赖hankcs包提供的接口)
        List<String> keywordList = HanLP.extractKeyword(str, str.length());//取出所有关键词
        // hash
        int size = keywordList.size();
        int i = 0;
        for(String keyword : keywordList){
            // 2、获取hash值
            String keywordHash = getHash(keyword);
            if (keywordHash.length() < 128) {
                // hash值可能少于128位,在低位以0补齐
                int dif = 128 - keywordHash.length();
                for (int j = 0; j < dif; j++) {
                    keywordHash += "0";
                }
            }
            // 3、加权、合并
            for (int j = 0; j < v.length; j++) {
                // 对keywordHash的每一位与'1'进行比较
                if (keywordHash.charAt(j) == '1') {
                    //权重分10级,由词频从高到低,取权重10~0
                    v[j] += (10 - (i / (size / 10)));
                } else {
                    v[j] -= (10 - (i / (size / 10)));
                }
            }
            i++;
        }
        // 4、降维
        String simHash = "";// 储存返回的simHash值
        for (int j = 0; j < v.length; j++) {
            // 从高位遍历到低位
            if (v[j] <= 0) {
                simHash += "0";
            } else {
                simHash += "1";
            }
        }
        return simHash;
    }

单元测试展示

代码覆盖率如下

异常处理说明

文本过短小于两百字,无法生成关键字进行比较

posted @ 2023-09-17 23:39  awsdl  阅读(22)  评论(0)    收藏  举报