软工作业2:论文查重

发布时间 2023-09-16 18:47:06作者: l11322

Github链接

https://github.com/lsw11322/lsw11322/tree/main/3121004744/paper_check

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade21-12
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13014
这个作业的目标 实现论文查重,学会编写测试单元

PSP表格

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

模块接口设计与实现过程

  • 接口设计
函数 功能
Sring readTxt(String txtPath) 传入文本路径,用字符串返回文本内容
void writeTxt(double sim, String txtPath) 传入相似度以及文本路径,将相似度的值输出到文本
String getHash(String str) 传入字符串,返回字符串对应Hash值
String getSimHash(String str) 传入字符串,返回字符串对应SimHash值
int getHammingDistance(String simHash1, String simHash2) 传入两文本的SimHash值,返回海明距离
double getSimilarity(int distance) 传入海明距离,返回两文本相似度
  • 关键函数流程图

性能分析

  • 性能分析图

  • 改进思路
    由上图知,外部包提供的类被频繁调用,因此可以选择性能更好的外部包分词器

模块部分单元测试展示

  • 测试覆盖率

  • HammingUtils类测试

public class HammingUtilsTest  {
    @Test
    public void getHammingDistance() {
        String str0 = IOUtils.readTxt("D:\\SoftwareProject\\hk1\\src\\main\\resources\\orig.txt");
        String str1 = IOUtils.readTxt("D:\\SoftwareProject\\hk1\\src\\main\\resources\\orig_0.8_add.txt");
        int distance = HammingUtils.getHammingDistance(SimHashUtils.getSimHash(str0), SimHashUtils.getSimHash(str1));
        System.out.println("海明距离:" + distance);
    }

    @Test
    //获取海明距离失败测试
    public void getHammingDistanceFailTest() {
        String str0 = "1010101010";
        String str1 = "1010101";
        System.out.println(HammingUtils.getHammingDistance(str0, str1));
    }

    @Test
    public void getSimilarityTest() {//测试getSimilarity
        String str0 = IOUtils.readTxt("D:\\SoftwareProject\\hk1\\src\\main\\resources\\orig.txt");
        String str1 = IOUtils.readTxt("D:\\SoftwareProject\\hk1\\src\\main\\resources\\orig_0.8_add.txt");
        int distance = HammingUtils.getHammingDistance(SimHashUtils.getSimHash(str0), SimHashUtils.getSimHash(str1));
        double similarity = HammingUtils.getSimilarity(distance);
        System.out.println("str0和str1的汉明距离: " + distance);
        System.out.println("str0和str1的相似度:" + similarity);
    }

}
  • 测试结果

异常处理说明

  • 异常处理
//读取文件内容并返回装有内容的字符串
    public static String readTxt(String txtPath){
        StringBuilder str = new StringBuilder();
        String strLine;
        // 将 txt文件按行读入 str中
        File file = new File(txtPath);
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(file);
            InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            // 字符串拼接
            while ((strLine = bufferedReader.readLine()) != null) {
                str.append(strLine);
            }
            // 关闭资源
            inputStreamReader.close();
            bufferedReader.close();
            fileInputStream.close();
        } catch (IOException e) {
            //打印异常信息
            e.printStackTrace();
        }
        return str.toString();
    }
  • 单元测试样例
 @Test
    //测试IOUtils类能否在读入路径不存在的文件时抛出异常信息
    public void readTxtFailTest() {
        String str = IOUtils.readTxt("D:\\SoftwareProject\\hk1\\src\\test\\resources\\meiyou.txt");
    }
  • 测试结果