作业二

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13324
这个作业的目标 1. 编写一个程序, 计算两个文本文件的重复率
2. 深入学习 github 的使用

github仓库链接

https://github.com/ming-sc/3123004745


PSP 表格

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

设计与实现

本项目中主要有六个类, 其中有四个类仅用于封装数据, 另外三个类用于处理数据.

  1. CharacterInfo 类
    此类用于存储前缀树中节点的字符和权重信息.

  2. DAGInfo 类
    此类用于存储从句子中构建的有向无环图信息.

  3. RouteInfo 类
    此类用于存储分词后的在有向无环图中的路径信息.

  4. PrefixTreeNode 类
    此类用于维护前缀树的节点结构.

  5. Segment 类
    此类用于分词的相关操作.

    1. importDict 函数 & handleWord 函数
      从字典文件中导入前缀树.

    2. getDAG 函数
      以前缀树中的分词权重从句子中的字词构建有向无环图.

    3. getRoute 函数
      找出有向无环图中权重之和最大的路径.

    4. toResult 函数
      把 getRoute 函数中获取到的路径转化为分词结果.

    5. getSegments 函数
      综合调用上面三个函数, 返回分词结果.

  6. Main 类
    此类进行文件读写和相似度计算, 同时提供程序入口.

  7. main 函数
    提供程序入口.

  8. readFile 函数 & writeFile 函数
    文件的读写操作.

  9. getWordFreq 函数
    根据分词结果统计词频.

  10. jaccardSimilarity 函数 & cosineSimilarity 函数
    计算两种相似度.

性能分析


耗时最长的是导入字典, 这是因为为了分词的结果更精准, 使用了34万词数的词典.


单元测试

部分单元测试

    @Test
    public void mainTest() {
        String originPath = "src/main/resources/origin.txt";
        String addPath = "src/main/resources/add.txt";
        String resultPath = "src/main/resources/result.txt";
        Main.main(new String[]{originPath, addPath, resultPath});
    }

    @Test
    public void readFileTest() throws IOException {
        String originPath = "src/main/resources/origin.txt";
        String addPath = "src/main/resources/add.txt";

        String origin = Main.readFile(originPath);
        String add = Main.readFile(addPath);

        System.out.println(origin);
        System.out.println(add);
    }

测试覆盖率截图:


异常处理

  1. 空字符串
    对于空字符串, 直接结束.
  2. 导入字典失败
    控制台输出失败消息, 提醒用户.
posted @ 2025-03-08 23:52  _IMG  阅读(71)  评论(0)    收藏  举报