第一次个人编程作业
| 软件工程 | 网工1934 |
|---|---|
| 作业要求: 1.在 Github 仓库中新建一个学号为名的文件夹。 2.在开始实现程序之前,在 PSP 表格记录下你估计在程序开发各个步骤上耗费的时间, 在实现程序之后,在PSP表格记录下你在程序的各个模块上实际花费的时间。 3.语言不限,并将编译好的程序发布到 Github 仓库中的 releases 中。 4.提交的代码要求经过 Code Quality Analysis 工具的分析并消除所有的警告。 5.完成项目的首个版本之后,请使用性能分析工具Studio Profiling Tools来找出代码中的性能瓶颈并进行改进。 6.使用Github来管理源代码和测试用例,代码有进展即签入Github。 7.使用单元测试对项目进行测试,并使用插件查看测试分支覆盖率等指标;写出至少10个测试用例确保你的程 序能够正确处理各种情况。 |
作业要求链接 |
[Github链接](https://github.com/szxxn/3119005336/tree/master)
一、PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 60 | 95 |
| Estimate | 估计这个任务需要多少时间 | 900 | 940 |
| Development | 开发 | ||
| Analysis | 需求分析 (包括学习新技术) | 300 | 280 |
| Design Spec | 生成设计文档 | 60 | 60 |
| Design Review | 设计复审 | 60 | 60 |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
| Design | 具体设计 | 30 | 30 |
| Coding | 具体编码 | 150 | 200 |
| Code Review | 代码复审 | 30 | 30 |
| Test | 测试(自我测试,修改代码,提交修改) | 60 | 70 |
| Reporting | 报告 | 30 | 20 |
| Test Repor | 测试报告 | 20 | 20 |
| Size Measurement | 计算工作量 | 15 | 15 |
| Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 30 |
| 合计 | 875 | 940 |
二、模块接口的设计与实现过程
2.1类
主类:
Main:main 方法所在的类
工具类:
- HammingUtils:计算海明距离的类
- SimHashUtils:计算 SimHash 值的类
- TxtIOUtils:读写 txt 文件的工具类
- ShortStringException:处理文本内容过短的异常类
2.2具体流程

2.3关键算法
SimHash+海明距离
第一步:分词,把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重。
第二步:hash,通过hash算法把每个词变成hash值,比如“美国”通过hash算法计算为 100101。这样我们的字符串就变成了一串串数字。
第三步:加权,通过第二步的hash生成结果,需要按照单词的权重形成加权数字串,比如“美国”的hash值为“100101”,通过加权计算为“4 -4 -4 4 -4 4”。
第四步:合并,把上面各个单词算出来的序列值累加,变成只有一个序列串。
第五步:降维,把第四步算出的序列串变成 0 1 串,形成我们最终的simhash签名。 如果每一位大于0 记为 1,小于0 记为 0。最后算出结果为:“1 0 1 0 1 1”。
2.4项目结构

三、部分代码展示
SimHash

海明距离

四、性能分析
概览

实时内存

从分析图可以看到:
调用次数最多的是com.hankcs.hanlp包提供的接口, 即分词、取关键词与计算词频花费了最多的时间。
所以在性能上基本没有什么需要改进的。
五、测试

在命令行运行不成功,和同学讨论后发现在idea上可以直接传参!

结果文件:

结果:


浙公网安备 33010602011771号