软工作业2

 

软工作业2

课程地址[广东工业大学-软件工程-计科21级12班] https://edu.cnblogs.com/campus/gdgy/CSGrade21-12
作业要求 https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13014
作业目标 了解论文查重机理; Git与GitHub的链接使用;

 
 

PSP表格

PSP2.1Personal 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 30
· Coding · 具体编码 25 30
· Code Review · 代码复审 10 5
· Test · 测试(自我测试,修改代码,提交修改) 20 15
Reporting 报告 60 70
· Test Repor · 测试报告 20 40
· Size Measurement · 计算工作量 20 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 50 40
  · 合计 435 455

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

1.test ---- main 方法

2.HammingUtils ---- 获取海明距离, 计算相似度的值

3.SimHashUtils ---- 计算 SimHash 值,获取simHash, 获取hash的值

4.TxtIOUtils ---- 导入txt文件,写入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;
    }

自定义异常

函数作用
FileException FileException(String errMessage),getErrMessage(),handle() 有参构造,获取错误信息,异常的处理

单元测试展示

代码覆盖率如下

 

模块部分异常处理说明

当读写的文件不是txt文件类型的时候


public class FileException extends RuntimeException{
    private String errMessage;
    public FileException(){
        super();
    }
    public FileException(String errMessage){
        super(errMessage);
        this.errMessage=errMessage;
    }
    public String getErrMessage(){
        return errMessage;
    }
    public static void handle(){
        throw new FileException("仅支持读取txt类型文件");
    }

}
posted @ 2023-12-04 14:22  三巡橄榄枝  阅读(11)  评论(0)    收藏  举报