第一次个人编程作业

软件工程 https://edu.cnblogs.com/campus/gdgy/CSGrade21-1
作业要求 https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13014
作业目标 学习使用Java建立工程项目,了解开发流程

Github链接

https://github.com/muggle1116/muggle1116/tree/main/3221004855

PSP表格

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

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

模块接口设计

实现过程及流程图

实现过程

  • 导入文件 FileUtils.readFile()
    • 根据传入的路径参数调用文件读写工具对文件进行读取,转换为字符串
  • 调用simHash算法计算文本的simHash的值 SimHashUtils.getSimHash()
    • 分词:使用ToAnalysis分词器进行中文分词,分割字符串保存为一个集合
    • 计算文本中各个分词的Hash值
    • 将各个分词的Hash值进行加权合并
    • 将合并结果进行降维处理,返回128位二进制的文本Simhash值
  • 计算文本相似度 HaimingUtils.getSimilar()
    • 传入两个文本的SimHash值,计算两个SimHash值的海明距离distance
    • 根据公式0.01 * (100 - distance * 100 / 128)来计算相似度
  • 写入结果 FileUtils.writeFile()
    • 根据传入的路径参数调用文件读写工具将结果写入对应路径的文件

流程图

运行结果

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

性能分析图

改进思路

由图可以看出,使用最多的是Integer、HashMap、char[]和int[],由此可知,可以通过选择一个性能较好的分词器以提高程序性能。

模块部分单元测试展示

测试覆盖率

文件读取测试FileUtilsTest

测试思路:导入正常的txt文件和不正常的txt文件,写入正常的txt文件和不正常的txt文件。
测试代码

{
   //正确读取文件
    @Test
    public void testreadFile(){
        String filename="D:\\zhd\\学习\\软件工程\\2\\orig.txt";
        String s = FileUtils.readFile(filename);
        System.out.println(s);
    }

    //正确写入文件
    @Test
    public void testwriteFile(){
        String filename="D:\\zhd\\学习\\软件工程\\2\\text.txt";
        String data="test";
        FileUtils.writeFile(filename,data);
    }

    //错误读取文件
    @Test
    public void testReadException(){
        String filename="D:\\zhd\\学习\\软件工程\\2\\orig.xlsx";
        try {
            FileUtils.readFile(filename);
        } catch (Exception e) {
            e.getMessage();
        }
    }

    //错误写入文件
    @Test
    public void testWriteException(){
        String filename="D:\\zhd\\学习\\软件工程\\2\\orig.xlsx";
        String data="1111";
        try {
            FileUtils.writeFile(filename,data);
        } catch (Exception e) {
            e.getMessage();
        }
    }
}
}

测试结果

分词器测试AnsjUtilTest

测试思路:输入一句话,打印分词情况
测试代码

{
    //测试分词器ansj
    @Test
    public void testAnsj(){
        String test="今天是星期六,天气很适合出去野餐";
        List<String> ansj = AnsjUtils.ansj(test);
        System.out.println(ansj.toString());
    }
}

测试结果

获取SimHash值测试SimHashUtilsTest

测试思路:传入词语测试getHash()并打印结果,传入文本测试getSimHash()并打印结果
测试代码

{
    //测试词语Hash值的获取
    @Test
    public void testgetHash(){
        String test="今天";
        String hash = SimHashUtils.getHash(test);
        System.out.println(hash);
    }
    
    //测试文本SimHash值的获取
    @Test
    public void testgetSimhash(){
        String test="今天是星期六,天气很适合出去野餐,我们决定去中山公园玩";
        String simhash = SimHashUtils.getSimhash(test);
        System.out.println(simhash);

    }
}

测试结果

计算海明距离测试HaimingUtilsTest

测试思路:输入两个文本并获取其SimHash值,将两个文本的SimHash值传入getHaimingDis()计算海明距离并打印,将海明距离传入getSimilar()计算相似度并打印
测试代码

{
     //测试海明距离计算
    @Test
    public void TestgetHaimingDis(){
        String test1="今天是星期六,天气很适合出去野餐,我们决定去中山公园玩";
        String test2="今天是星期日,天气非常适合出去玩,我们决定去越秀公园放风筝";
        String simhash1= SimHashUtils.getSimhash(test1);
        String simhash2 = SimHashUtils.getSimhash(test2);
        int haimingDis = HaimingUtils.getHaimingDis(simhash1,simhash2);
        System.out.println(haimingDis);
    }

    //测试文本相似度计算
    @Test
    public void TestgetSimilar(){
        String test1="今天是星期六,天气很适合出去野餐,我们决定去中山公园玩";
        String test2="今天是星期日,天气非常适合出去玩,我们决定去越秀公园放风筝";
        String simhash1= SimHashUtils.getSimhash(test1);
        String simhash2 = SimHashUtils.getSimhash(test2);
        double similar = HaimingUtils.getSimilar(simhash1, simhash2);
        System.out.println("相似度为"+similar);
    }
}

测试结果

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

文件异常处理

代码实现

{
    public class FileException extends RuntimeException{
        private String errMessage;
        public FileException(){
            super();
        }
        public FileException(String errMessage){
            super(errMessage);
            this.errMessage=errMessage;
        }
        public String getMessage(){
            return errMessage;
        }
        public static void handle(){
            throw new FileException("仅支持读取txt类型文件");
        }
    }
}
posted @ 2023-09-13 17:54  詹慧丹  阅读(76)  评论(0编辑  收藏  举报