工程概论作业2

工程概论作业二

这个作业属于哪个课程 计算2112
这个作业要求在哪里 要求
这个作业的目标 熟悉作业格式

一,链接

[1.GitHub](1231z/查重 at fb7b76e22d47667baaa9c5153b6aae72a8ad36be · 1231z/1231z (github.com))

二,代码

package check;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;

import static org.junit.Assert.*;
public class MainTest {
    checkTest t = new checkTest();

    @Before
    public void setUp() {
        System.out.println("Start!");
    }

    @After
    public void tearDown() {
        System.out.println("Finish!");
    }


    /*
     * 实际存在的路径*/
    @Test
    public void existPath() throws IOException {
         
        try {
            t.checktest("src/test1/orig.txt", "src/test1/orig_0.8_add.txt", "src/test1/answer.txt");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /*
     * 空路径*/
    @Test
    public void nullPath() throws IOException {
        
        try {
            t.checktest("", "src/test1/orig_0.8_add.txt", "src/test1/answer.txt");
        } catch (IOException e) {
            e.printStackTrace();
            fail();
        }
    }

    /*
     * 不存在的路径*/
    @Test
    public void nonExistPath() throws IOException {
         
        try {
            t.checktest("src/orig.txt", "src/test1/orig_0.8_add.txt", "src/test1/answer.txt");
        } catch (IOException e) {
            e.printStackTrace();
            fail();
        }
    }

    /*
     * 相同的路径*/
    @Test
    public void samePath() throws IOException {
         
        try {
            t.checktest("src/test1/orig.txt", "src/test1/orig.txt", "src/test1/answer.txt");
        } catch (IOException e) {
            e.printStackTrace();
            fail();
        }
    }

    /*
     * 原始文本与增加字数的文本对比*/
    @Test
    public void addtext() throws IOException {
         
        try {
            t.checktest("src/test1/orig.txt", "src/test1/orig_0.8_add.txt", "src/test1/answer.txt");
        } catch (IOException e) {
            e.printStackTrace();
            fail();
        }
    }

    /*
     * 原始文本与减少字数的文本对比*/
    @Test
    public void deltext() throws IOException {
         
        try {
            t.checktest("src/test1/orig.txt", "src/test1/orig_0.8_del.txt", "src/test1/answer.txt");
        } catch (IOException e) {
            e.printStackTrace();
            fail();
        }
    }

    /*
     * 原始文本与减少字数的文本对比*/
    @Test
    public void addcompdeltext() throws IOException {
         
        try {
            t.checktest("src/test1/orig_0.8_del.txt", "src/test1/orig_0.8_add.txt", "src/test1/answer.txt");
        } catch (IOException e) {
            e.printStackTrace();
            fail();
        }
    }

    /*
     * 原文与orig_0.8_1文本对比*/
    @Test
    public void dis1text() throws IOException {
         
        try {
            t.checktest("src/test1/orig.txt", "src/test1/orig_0.8_dis_1.txt", "src/test1/answer.txt");
        } catch (IOException e) {
            e.printStackTrace();
            fail();
        }
    }

    /*
     * 原文与orig_0.8_10文本对比*/
    @Test
    public void dis10text() throws IOException {
        check.checkTest t = new check.checkTest();
        try {
            t.checktest("src/test1/orig.txt", "src/test1/orig_0.8_dis_10.txt", "src/test1/answer.txt");
        } catch (IOException e) {
            e.printStackTrace();
            fail();
        }
    }


    /*
     * 原文与orig_0.8_15文本对比*/
    @Test
    public void dis15text() throws IOException {
         
        try {
            t.checktest("src/test1/orig.txt", "src/test1/orig_0.8_dis_15.txt", "src/test1/answer.txt");
        } catch (IOException e) {
            e.printStackTrace();
            fail();
        }
    }

    /*
     * 超时监测,运行时间超过5s,不能通过测试*/
    @Test
    public void time() throws IOException {
         
        try {
            t.checktest("src/test1/orig.txt", "src/test1/orig_0.8_dis_15.txt", "src/test1/answer.txt");
        } catch (IOException e) {
            e.printStackTrace();
            fail();
        }
    }

}

三,思路

  • 计算模块接口的设计与实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?说明你的算法的关键(不必列出源代码),以及独到之处。(18')
  • mortal.text.similarity.TextSimilarityApp
    • 功能:文本相似度计算程序的主类,入口类
    • 参数:从命令行接受3个合理的文件路径,依次为:原文文件路径,被测试重复率文件路径,答案保存文件路径
    • 注意:
      1. 前两个命令行参数所指路径必须真实存在,否则抛出异常
      2. 答案文件可以不存在,此时程序将自动创建文件,请确保路径合理,应用程序有创建文件的权限。
      3. 若答案文件存在且保存了重要信息,请备份!否则程序输出答案前会删除文件
  • mortal.text.similarity.repeatcounter.RepeatWords
    • 功能:比较一对字符串数组的相似度,它基于以下规则进行比较
      1. 字符串数组的每个元素(即字符串)表示一个词语
      2. 字符串数组表示一个句子中去掉标点符号后分词的结果的数组
      3. 一对字符串数组之间只有必须超过指定数目的公共重复词语子数组,才会被记录为重复的词语
      4. 对于一对字符串数组A、B,所得的重复词语子数组,存在不同子数组在不同字符串中有不尽相同的部分词语重复。故对于每一个字符串数组,重复词语数量不是所有词语子数组的简单相加,而是在以该字符串数组为参考,去掉重复的词语后的数量。故A对B的重复词语数与B对A的重复词语不一定相等。(A对B是指以A为参考,去掉重复词语)
    • 功能控制:构造器接受两个字符串数组和一个int参数,int参数指示了开始计数为重复时的最少重复词语子数组长度。
  • mortal.textsimilarity.repeatcounter.RepeatRate
    • 功能:
      1. 接受两个字符串,这两个字符串包含要对比的两文本。
      2. 使用正则将文本划分为句子。
      3. 使用分词工具将句子分词
      4. 调用RepeatWords对对句子进行比较,获取这对句子中的重复词语数量
    • 功能控制:
      1. RepeatRate.calculater是进行第4步工作,这个方法接受两参数
      2. int Range: 控制一个文本中某一位置的句子应该与 在另一个文本中的相同位置的前后各相差Range个句子的范围内的所有句子 都计算重复率, 然后取最大值,作为该文本句子中与另一文本相似词语的数量
      3. int min : 传递给RepeatWords构造器的参数,指示RepeatWords应该计算重复词语的阈值。
  • mortal.text.similarity.repeatcounter.KMP
    • 功能:实现KMP算法匹配子串,用来实现获取文本中的不重复的相似词语。
posted @ 2023-09-20 18:09  落星的夜  阅读(40)  评论(0)    收藏  举报