首页 > 其他分享 >个人项目

个人项目

时间:2024-03-13 21:44:27浏览次数:23  
标签:文本 String .. 项目 int 个人 test txt

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024
这个给作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136
这个作业的目标 论文查重

一、github链接:

https://github.com/githdx/3122004570.git

二、PSP表格

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

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

设计:

CheckMain类:实现类。

  • 读取命令行参数。读取第一个路径为原文txt,第二个路径为抄袭txt,第三个路径为答案txt。经过一系列方法后将相似度写入答案txt中。

txtHandle类:处理txt文件

  • txtRead方法:文本读取。将txt文本内容读取成字符串。
  • txtWrite方法:文本写入。将相似度写入到txt文本内。

Calculation类:获取SimHash

  • getSimHash方法:获取字符串的SimHash。传入txt文本内容的字符串,经过一系列方法,输出该文本的SimHash值。
  • participle方法:分词。传入txt文本内容的字符串,输出特征词数组
  • Hash方法:传入特征词数组,输出对应的hash值
  • weightedAndMerged方法:加权、合并。传入文本的hash值,经过加权、合并最后输出权重向量
  • dimensionalityReduction方法:降维。传入文本的权重向量,输出文本的SimHash值
  • calculateHammingDistance方法:根据两个文本的SimHash计算海明距离
  • calculateHammingSimilarity方法:根据海明距离计算论文相似度保留两位小数

流程图:

算法关键:

参考:https://zhuanlan.zhihu.com/p/578254728
先通过txtRead读取原文文件和抄袭文件后,再经过分词、hash、加权、合并和降维分别计算两个文本SimHash值,接着根据两个文本的SimHash值计算海明距离,最后再计算出相似度并写入答案文件中

四、计算模块接口部分的性能改进

改进部分:

原加权、合并方法分开写,要经历两次两层for循环

//加权
    private static int[][] weighted(List<String> hashList){
        int size= hashList.size();
        int[][] weightVectorList=new int[size][256];
        for(int i=0;i<size;i++) {
            String str = hashList.get(i);
            for (int j = 0; j < str.length(); j++) {
                //权重范围0-10,特征词在数组中位置越靠前权重越大
                int weight = 10 - 10 * i / size;
                //加权
                if (str.charAt(j) == '1') weightVectorList[i][j] = weight;
                else weightVectorList[i][j] = -weight;
            }
        }

        return weightVectorList;
    }

    //合并
     public static int[] merged(int[][] list){
        int length=list.length;
        int[] weightVectorList=new int[length];
        int i=0;
        System.out.println(list.length);
        for(int[] arr:list){
            //System.out.println(arr.length);
            for(int j=0;j<256;j++){
                weightVectorList[i]+=arr[j];
            }
            i++;
        }
        return weightVectorList;
    }

优化后,加权、合并在一个方法中,只经历一次两层for循环

//加权、合并
    private static int[] weightedAndMerged(List<String> hashList){
        int size= hashList.size();
        //256位的加权向量
        int[] weightVectorList=new int[256];
        for(int i=0;i<size;i++) {
            String str = hashList.get(i);
            for (int j = 0; j < str.length(); j++) {
                //权重范围0-10,特征词在数组中位置越靠前权重越大
                int weight = 10 - 10 * i / size;
                //加权并合并
                if (str.charAt(j) == '1') weightVectorList[j] += weight;
                else weightVectorList[j] -= weight;
            }
        }
        return weightVectorList;
    }

性能图

五、计算模块部分单元测试展示

测试在不同的原文文件和抄袭文件下得到的相似度

@Test
    public void mainTest(){
        String test1= "../../src/resources/orig.txt";
        String test2= "../../src/resources/orig_0.8_add.txt";
        String test3= "../../src/resources/orig_0.8_del.txt";
        String test4= "../../src/resources/orig_0.8_dis_1.txt";
        String test5= "../../src/resources/orig_0.8_dis_10.txt";
        String test6= "../../src/resources/orig_0.8_dis_15.txt";
        String test7= "../../src/resources/test_1.txt";
        String test8= "../../src/resources/test_2.txt";
        String test9= "../../src/resources/test_3.txt";
        String test10= "../../src/resources/test_4.txt";
        String ans1="../../src/resources/answer_test.txt";

        System.out.println("测试一结果:");
        test(test1,test2,ans1);
        System.out.println("测试二结果:");
        test(test1,test3,ans1);
        System.out.println("测试三结果:");
        test(test1,test4,ans1);
        System.out.println("测试四结果:");
        test(test1,test5,ans1);
        System.out.println("测试五结果:");
        test(test1,test6,ans1);
        System.out.println("测试六结果:");
        test(test1,test7,ans1);
        System.out.println("测试七结果:");
        test(test1,test8,ans1);
        System.out.println("测试八结果:");
        test(test1,test9,ans1);
        System.out.println("测试九结果:");
        test(test1,test10,ans1);
        System.out.println("测试十结果:");
        test(test4,test5,ans1);
    }

    public static void test(String path1,String path2,String path3){
        String txt1,txt2;
        //文件打开失败,结束
        if((txt1=TxtHandle.txtRead(path1))==null||(txt2=TxtHandle.txtRead(path2))==null)return;
        //获取txt文本的SimHash值
        int[] weightVectorList1,weightVectorList2;
        //文本内容过短,结束
        if((weightVectorList1=Calculation.getSimHash(txt1))==null||(weightVectorList2=Calculation.getSimHash(txt2))==null)return ;
        //计算海明距离
        int distance= Calculation.calculateHammingDistance(weightVectorList1,weightVectorList2);
        //计算论文相似度
        double similarity= Calculation.calculateHammingSimilarity(distance);
        System.out.println("论文相似度为:"+similarity+"%");
        //将结果写入文件
        TxtHandle.txtWrite(path3,similarity);
    }

测试结果

测试覆盖率

六、计算模块部分异常处理说明

输入的文本路径数量不对时,输出错误提示

输入的文本路径不存在时,输出错误提示

输入的文本内容过短时,输出错误提示

标签:文本,String,..,项目,int,个人,test,txt
From: https://www.cnblogs.com/gf-29/p/18067347

相关文章

  • 从JavaSE到项目部署——Java基础学习第八天(Java面向对象编程初级)
    目录一、类与对象(OOP)——类        1、类与对象概述    2、对象在内存中的存在形式     3、属性/成员变量/field(字段)     4、对象创建和使用    5、对象创建过程二、方法    1、方法基本演示    2、方......
  • 【Django开发】前后端分离美多商城项目第1篇:美多商城【附代码文档】
    美多商城项目4.0文档完整教程(附代码资料)主要内容讲述:美多商城,项目准备,商业模式介绍,开发流程,需求分析,项目架构,创建工程,1.在git平台创建工程1.B2B--企业对企业,2.C2C--个人对个人,3.B2C--企业对个人,4.C2B--个人对企业,5.O2O--线上到线下,6.F2C--工厂到个人,7.B2B2C--企业--企业--......
  • 作页二:个人项目
    这个作业属于哪个课程软件工程2024-广东工业大学这个作业要求在哪里软件工程2024-班级博客这个作业的目标开发个人项目,实现论文查重githubgitcode仓库地址:https://gitcode.com/wdwwdw/3122004405/tree/main计算模块接口的设计与实现过程使用hcaks对中......
  • Vite构建的前端项目在执行 "npm run dev" 命令时报错 "failed to load vite.config.ts
    报错信息:Failedtoloadconfigfromxx/.../xx/vite.config.tserrorduringbuild:Error:Youinstalledesbuildforanotherplatformthantheoneyou'recurrentlyusing.Thiswon'tworkbecauseesbuildiswrittenwithnativecodeandneedstoinstal......
  • 个人项目
    主管作业属于哪个课程https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/这个作业要求在哪里https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136这个作业的目标实现自己的第一个个人项目,增强对项目开发的理解github链接......
  • 个人项目
    这个作业属于哪个课程https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/这个作业要求在哪里https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136这个作业的目标个人项目开发Github链接https://github.com/shishuiliuqin......
  • Node+Vue毕设高校教师项目申报管理平台(程序+mysql+Express)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在高等教育领域,教师参与科研项目是推动学科发展和创新的重要途径。随着科研竞争的加剧,高校教师需要积极申报各类科研项目以获取资金支持。然而,项目申报过程......
  • 【DataWhale学习】用免费GPU线上跑StableDiffusion项目实践
    用免费GPU线上跑SD项目实践​DataWhale组织了一个线上白嫖GPU跑chatGLM与SD的项目活动,我很感兴趣就参加啦。之前就对chatGLM有所耳闻,是去年清华联合发布的开源大语言模型,可以用来打造个人知识库什么的,一直没有尝试。而SD我前两天刚跟着B站秋叶大佬和Nenly大佬的视频学习过......
  • 3.2 RK3399项目开发实录-初次使用的环境搭建(物联技术666)
    通过百度网盘分享的文件:嵌入式物联网单片…链接:https://pan.baidu.com/s/1Zi9hj41p_dSskPOhIUnu9Q?pwd=8qo1提取码:8qo1复制这段内容打开「百度网盘APP即可获取」1.用户和密码1.1.UbuntuDesktop系统UbuntuDesktop系统开机启动后,自动登录到firefly用户。如果......
  • 3.1 RK3399项目开发实录-Linux开发,编译 Linux 固件(物联技术666)
    通过百度网盘分享的文件:嵌入式物联网单片…链接:https://pan.baidu.com/s/1Zi9hj41p_dSskPOhIUnu9Q?pwd=8qo1提取码:8qo1复制这段内容打开「百度网盘APP即可获取」1.编译Linux固件为了方便用户的使用与开发,官方提供了Linux开发的整套SDK,本章详细的说明SDK的具......