第一次作业

[GitHub地址](https://github.com/810975/3119005325) 

软件工程 https://edu.cnblogs.com/campus/gdgy/networkengineering1934-Softwareengineering
作业要求 https://edu.cnblogs.com/campus/gdgy/networkengineering1934-Softwareengineering/homework/12137
作业目标 通过独立完成个人项目熟悉软件开发流程,提高编程能力

1.PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 20 20
Estimate 估计这个任务需要多少时间 1885  
Development 开发 900 1000
Analysis 需求分析 40 30
Design Spec 生成设计文档 15 15
Design Review 设计复审 10 20
Coding Standard 代码规范 5 5
Design 具体设计 25 30
Coding 具体编码 600 700
Code Review 代码复审 60 40
Test 测试(自我测试,修改代码,提交修改) 120 200
Reporting 报告 30 30
Test Repor 测试报告 30 25
Size Measurement 计算工作量 20 10
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 20 30
  合计 1885 2055

 

2.算法选择

翻阅网上资料,查询到论文查重主要使用SimHash算法

流程:

simhash算法分为5个步骤:分词、hash、加权、合并、降维,具体过程如下所述:

1.分词
给定一段语句,进行分词,得到有效的特征向量,然后为每一个特征向量设置1-5等5个级别的权重(如果是给定一个文本,那么特征向量可以是文本中的词,其权重可以是这个词出现的次数)。例如给定一段语句:“CSDN博客结构之法算法之道的作者July”,分词后为:“CSDN 博客 结构 之 法 算法 之 道 的 作者 July”,然后为每个特征向量赋予权值:CSDN(4) 博客(5) 结构(3) 之(1) 法(2) 算法(3) 之(1) 道(2) 的(1) 作者(5) July(5),其中括号里的数字代表这个单词在整条语句中的重要程度,数字越大代表越重要。

2.hash
通过hash函数计算各个特征向量的hash值,hash值为二进制数01组成的n-bit签名。比如“CSDN”的hash值Hash(CSDN)为100101,“博客”的hash值Hash(博客)为“101011”。就这样,字符串就变成了一系列数字。

3.加权
在hash值的基础上,给所有特征向量进行加权,即W = Hash * weight,且遇到1则hash值和权值正相乘,遇到0则hash值和权值负相乘。例如给“CSDN”的hash值“100101”加权得到:W(CSDN) = 100101 4 = 4 -4 -4 4 -4 4,给“博客”的hash值“101011”加权得到:W(博客)=101011 5 = 5 -5 5 -5 5 5,其余特征向量类似此般操作。

4.合并
将上述各个特征向量的加权结果累加,变成只有一个序列串。拿前两个特征向量举例,例如“CSDN”的“4 -4 -4 4 -4 4”和“博客”的“5 -5 5 -5 5 5”进行累加,得到“4+5 -4+-5 -4+5 4+-5 -4+5 4+5”,得到“9 -9 1 -1 1”。

5.降维
对于n-bit签名的累加结果,如果大于0则置1,否则置0,从而得到该语句的simhash值,最后我们便可以根据不同语句simhash的海明距离来判断它们的相似度。例如把上面计算出来的“9 -9 1 -1 1 9”降维(某位大于0记为1,小于0记为0),得到的01串为:“1 0 1 0 1 1”,从而形成它们的simhash签名。

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

工程总览:

用到的类
1.文件读取工具类

2.SimHash算法核心类

主要函数及功能:
1.分词
导入分词器的依赖

使用分词器StandardTokenizer

2.hash算法
这里分词后,通过hash函数计算各个分词的hash值

 

3.加权
这里规定分词的权重

4.合并
在这里对单个hash后的分词进行特征向量化,转成特定位数的特征向量,通过加权后合并

5.降维
通过此处降维,返回文档的SimHash。

独到之处

这里可以对html代码进行过滤。

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

消耗最大的函数

类的使用情况

改进
在读取文件时,使用缓冲流和StringBuilder提升性能。

5.计算模块部分单元测试展示

使用junit进行单元测试。

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

异常处理主要是两个,一是比较文件中有空文件,此时无需比较;二是文件路径不正确,不能找到文件。
1.发现空文件

 测试

2.路径错误
用File类里面自带的异常。
测试

 

 

 

posted @ 2021-09-19 11:00  風裖  阅读(91)  评论(0)    收藏  举报