个人第一次编程作业

一.作业要求

这个作业属于那个课程广工20203软件工程
这个作业的要求个人项目作业-论文查重
Gitcode地址仓库

二.项目设计

2.1 项目需求

  • 题目:论文查重
    描述如下:
    设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
  • 原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
  • 抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。

要求输入输出采用文件输入输出,规范如下:

  • 从命令行参数给出:论文原文的文件的绝对路径。
  • 从命令行参数给出:抄袭版论文的文件的绝对路径。
  • 从命令行参数给出:输出的答案文件的绝对路径。

2.2 开发环境

  • 开发语言:Java 11
  • IDE: Intellij IDEA 2021
  • 项目构建工具:maven
  • 性能分析工具:JProfiler 11
  • 依赖外部jar包:汉语言处理包
<dependency>
    <groupId>com.hankcs</groupId>
    <artifactId>hanlp</artifactId>
    <version>portable-1.5.4</version>
</dependency>

2.3 设计思路

1.流程
在这里插入图片描述
2.算法
在这里插入图片描述


三.接口设计与实现

3.1 读写txt模块

  • 类:TxtIOUtils
  • 方法:1.readTxt:读取txt文件;2.writeTxt:写入txt文件

3.2 SimHash模块

  • 类:SimHashUtils
  • 方法:1.getHash:传入String,计算出它的hash值,并以字符串形式输出;2.getSimHash:传入String,计算出它的simHash值,并以字符串形式输出

3.3 海明距离模块

类:HammingUtils
方法:1.getHammingDistance:输入两个 simHash 值,计算出它们的海明距离 distance

for (int i = 0; i < simHash1.length(); i++) {
                // 每一位进行比较
                if (simHash1.charAt(i) != simHash2.charAt(i)) {
                    distance++;
                }
            }
    2、getSimilarity:输入两个 simHash 值,调用 getHammingDistance 方法得出海明距离 distance,在由 distance 计算出相似度。
return 0.01 * (100 - distance * 100 / 128);

3.4 main主模块

  • 方法:
  • 从命令行输入的路径名读取对应的文件,将文件的内容转化为对应的字符串
  • 由字符串得出对应的 simHash值
  • 由 simHash值求出相似度
  • 把相似度写入最后的结果文件中
    -退出程序

四.性能改进

4.1 性能分析

在这里插入图片描述
在这里插入图片描述


五.单元测试

5.1 读写模块测试

public class TxtIOUtilsTest {
    @Test
    public void readTxtTest() {
        // 路径存在,正常读取
        String str = TxtIOUtils.readTxt("D:/test/orig.txt");
        String[] strings = str.split(" ");
        for (String string : strings) {
            System.out.println(string);
        }
    }
    @Test
    public void writeTxtTest() {
        // 路径存在,正常写入
        double[] elem = {0.11, 0.22, 0.33, 0.44, 0.55};
        for (int i = 0; i < elem.length; i++) {
            TxtIOUtils.writeTxt(elem[i], "D:/test/ans.txt");
        }
    }
    @Test
    public void readTxtFailTest() {
        // 路径不存在,读取失败
        String str = TxtIOUtils.readTxt("D:/test/none.txt");
    }
    @Test
    public void writeTxtFailTest() {
        // 路径错误,写入失败
        double[] elem = {0.11, 0.22, 0.33, 0.44, 0.55};
        for (int i = 0; i < elem.length; i++) {
            TxtIOUtils.writeTxt(elem[i], "User:/test/ans.txt");
        }
    }
}

  • 覆盖率:
    在这里插入图片描述

5.2 SamHash模块测试

public class SimHashUtilsTest {
    @Test
    public void getHashTest(){
        String[] strings = {"余华", "是", "一位", "真正", "的", "作家"};
        for (String string : strings) {
            String stringHash = SimHashUtils.getHash(string);
            System.out.println(stringHash.length());
            System.out.println(stringHash);
        }
    }
    @Test
    public void getSimHashTest(){
        String str0 = TxtIOUtils.readTxt("D:/test/orig.txt");
        String str1 = TxtIOUtils.readTxt("D:/test/orig_0.8_add.txt");
        System.out.println(SimHashUtils.getSimHash(str0));
        System.out.println(SimHashUtils.getSimHash(str1));
    }
}

  • 覆盖率:
    在这里插入图片描述

5.3 海明距离模块测试

public class HammingUtilsTest {
    @Test
    public void getHammingDistanceTest() {
        String str0 = TxtIOUtils.readTxt("D:/test/orig.txt");
        String str1 = TxtIOUtils.readTxt("D:/test/orig_0.8_add.txt");
        int distance = HammingUtils.getHammingDistance(SimHashUtils.getSimHash(str0), SimHashUtils.getSimHash(str1));
        System.out.println("海明距离:" + distance);
        System.out.println("相似度: " + (100 - distance * 100 / 128) + "%");
    }
}


  • 覆盖率:

在这里插入图片描述


5.4 主模块测试

public class MainTest {
    @Test
    public void origAndAllTest(){
        String[] str = new String[6];
        str[0] = TxtIOUtils.readTxt("D:/test/orig.txt");
        str[1] = TxtIOUtils.readTxt("D:/test/orig_0.8_add.txt");
        str[2] = TxtIOUtils.readTxt("D:/test/orig_0.8_del.txt");
        str[3] = TxtIOUtils.readTxt("D:/test/orig_0.8_dis_1.txt");
        str[4] = TxtIOUtils.readTxt("D:/test/orig_0.8_dis_10.txt");
        str[5] = TxtIOUtils.readTxt("D:/test/orig_0.8_dis_15.txt");
        String ansFileName = "D:/test/ansAll.txt";
        for(int i = 0; i <= 5; i++){
            double ans = HammingUtils.getSimilarity(SimHashUtils.getSimHash(str[0]), SimHashUtils.getSimHash(str[i]));
            TxtIOUtils.writeTxt(ans, ansFileName);
        }
    }
}
  • 结果:

在这里插入图片描述


六.模块异常处理

1.对无关文本进行处理

 private String cleanResume(String content) {
  String[] tobeReplace = {
      "\n","\r","\t","\\n","\\r","\\t"
};
 for (String s:tobeReplace) {
    content = content.replace(s,"");
}
return content;
}

2.文本过短

 try{
if(str.length() < 200) throw new ShortStringException("文本过短!");
}catch (ShortStringException e){
e.printStackTrace();
return null;
}

七.PSP表格

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划6060
· Estimate· 估计这个任务需要多少时间6060
Development开发480500
· Analysis· 需求分析 (包括学习新技术)160160
· Design Spec· 生成设计文档6050
· Design Review· 设计复审6040
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)6060
· Design· 具体设计100100
· Coding· 具体编码360400
· Code Review· 代码复审120125
· Test· 测试(自我测试,修改代码,提交修改)120120
Reporting报告3030
· Test Repor测试报告3030
· Size Measurement· 计算工作量3030
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划3030
合计18401795
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值