软件工程-论文查重系统

论文查重系统

软件工程 所在班级
作业要求 [要求]((个人项目 - 作业 - 计科21级12班 - 班级博客 - 博客园 (cnblogs.com)))
作业目标 论文查重系统,并优化代码,了解项目开发流程

GitHub仓库地址

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

设计与实现

流程图

image.png

结构

image

主要函数
分词-提取关键字

    public static List<String> getString(String data,boolean useSmart) {
        List<String> result=new ArrayList();
        try {
            //创建分词对象 true则按照最大长度划分,false则划分出所有可以划分的词
            Analyzer anal = new IKAnalyzer(useSmart);
            StringReader reader = new StringReader(data);
            //记录分词数据
            TokenStream ts = anal.tokenStream("", reader);
            CharTermAttribute term = ts.getAttribute(CharTermAttribute.class);
            //遍历分词数据
            ts.reset();
            while (ts.incrementToken()) {
                result.add(term.toString());
            }
            ts.close();
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            return result;
        }
    }

获取simHash

public static String getSimHash(String date){
    //用数组表示特征向量,取128位,从0位开始表示从高位到低位
    int[] arr = new int[128];
    List<String> Ikstring = ikF.getString(date, false);
    int size = Ikstring.size();
    int i=0;
    for (String s : Ikstring) {
        //获取hash值
        String hash = getHash(s);
        if(hash.length()<128){
            int num=128-hash.length();
            for(int j=0;j<num;j++){
                hash+="0";
            }
        }
        //加权合并
        for(int j=0;j<arr.length;j++){
            if(hash.charAt(j)=='1'){
                //权重分10级,由词频从高到低,取权重10~0
                arr[j] += (10 - (i / (size / 10)));
            }else{
                arr[j] -= (10 - (i / (size / 10)));
            }
        }
        i++;
    }
    //降维
    StringBuilder sb=new StringBuilder();
    for(int j=0;j<arr.length;j++){
        if(arr[j]<=0){
            sb.append("0");
        }else{
            sb.append("1");
        }
    }
    return sb.toString();
}

运行结果

image

image

单元测试

image.png

image.png
image.png

异常处理

文件类型不正确则抛出异常

image.png

性能分析

image

image

image

posted @ 2023-09-17 12:00  AFlicker  阅读(25)  评论(0编辑  收藏  举报