作业二
| 这个作业属于哪个课程 | 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 |
设计与实现
本项目中主要有六个类, 其中有四个类仅用于封装数据, 另外三个类用于处理数据.
-
CharacterInfo 类
此类用于存储前缀树中节点的字符和权重信息. -
DAGInfo 类
此类用于存储从句子中构建的有向无环图信息. -
RouteInfo 类
此类用于存储分词后的在有向无环图中的路径信息. -
PrefixTreeNode 类
此类用于维护前缀树的节点结构. -
Segment 类
此类用于分词的相关操作.-
importDict 函数 & handleWord 函数
从字典文件中导入前缀树. -
getDAG 函数
以前缀树中的分词权重从句子中的字词构建有向无环图. -
getRoute 函数
找出有向无环图中权重之和最大的路径. -
toResult 函数
把 getRoute 函数中获取到的路径转化为分词结果. -
getSegments 函数
综合调用上面三个函数, 返回分词结果.
-
-
Main 类
此类进行文件读写和相似度计算, 同时提供程序入口. -
main 函数
提供程序入口. -
readFile 函数 & writeFile 函数
文件的读写操作. -
getWordFreq 函数
根据分词结果统计词频. -
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);
}
测试覆盖率截图:

异常处理
- 空字符串
对于空字符串, 直接结束. - 导入字典失败
控制台输出失败消息, 提醒用户.

浙公网安备 33010602011771号