第一次个人编程作业
软件工程 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-12 |
---|---|
作业要求 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13014 |
作业目标 | 学习使用Java建立工程项目,学会论文查重的具体实现步骤 |
github链接 | https://github.com/jzyyyds/jzyyyds/tree/main/3121005122 |
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 40 | 30 |
-Estimate | -估计这个任务需要多少时间 | 40 | 30 |
Development | 开发 | 390 | 370 |
-Analysis | -需求分析 (包括学习新技术) | 120 | 90 |
-Design Spec | -生成设计文档 | 40 | 0 |
-Design Review | -设计复审 | 20 | 20 |
-Coding Standard | -代码规范 (为目前的开发制定合适的规范) | 30 | 10 |
-Design | -具体设计 | 30 | 30 |
-Coding | -具体编码 | 160 | 180 |
-Code Review | -代码复审 | 20 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 190 | 250 |
-Reporting | -报告 | 100 | 120 |
-Test Report | -测试报告 | 40 | 60 |
-Size Measurement | -计算工作量 | 30 | 30 |
-Postmortem & Process Improvement Plan | -事后总结, 并提出过程改进计划 | 20 | 40 |
合计 | 620 | 650 |
模块接口的设计与实现过程
模块接口设计
主入口模块
主函数
类 | 函数 | 作用 |
---|---|---|
CheckMain | main | 主函数入口 |
工具类(simHash和海明距离)
类 | 函数 | 作用 |
---|---|---|
SimHashUtils | getSimHash(String date) , getHash(String str) | 获取simHash, 获取hash的值 |
hammingUtils | getHammingDis(String simHash1,String simHash2) ,getSimilarity(String simHash1, String simHash2) | 获取海明距离, 计算相似度的值 |
IkUtils | getString(String data,boolean useSmart) | 进行分词,获取关键词 |
FileUtils | readFile(String fileName),writeFile(String fileName,String data) | 导入txt文件,写入txt文件 |
自定义异常
类 | 函数 | 作用 |
---|---|---|
FileException | FileException(String errMessage),getErrMessage(),handle() | 有参构造,获取错误信息,异常的处理 |
模块实现过程
主要实现过程
- 主程序根据传入的路径参数调用文件读写工具对文本路径中的文件进行读取。
- 文件读写工具读取txt文件中的内容,转换为对应的字符串。
- 使用IK分词模块将字符串分词,获取关键词。
- 计算词集的hash值。
- 调用simHash算法计算文本的simHash的值。
- 通过海明距离来进行计算两文本的相似度。
- 退出程序。
运行结果
算法函数的实现过程
simHash
1.分词:对需要比较的文本进行分词,提取特征向量。并对特征向量,进行权重(weight)设置。
2.hash: 通过hash函数计算各个特征向量的hash值。hash值为二进制数0 1 组成的n-bit签名。
3.加权:在hash值的基础上,给所有特征向量进行加权。
4.合并:将上述各个特征向量的加权结果累加,变成只有一个序列串。
5.降维:对于n-bit签名的累加结果,如果大于0则置1,否则置0,从而得到该语句的simhash值,最后我们便可以根据不同语句simhash的海 明距离来判断它们的相似度。
海明距离
1.通过传入两个simHash来进行计算海明距离
2.根据公式0.01 * (100 - distance * 100 / 128)来计算相似度
模块接口部分的性能改进
性能分析图
改进思路
由分析图可以看出:
调用最多的是DictSegment,char[]和String,都和分词有关,由此看出分词很重要``
模块部分单元测试展示
FileUtilsTest
@Test
public void testreadFile(){
String fileName="C:\\Users\\17680\\Desktop\\orig.txt";
FileUtils.readFile(fileName);
}
@Test
public void testreadFileException(){
String fileName="C:\\Users\\17680\\Desktop\\system.log";
FileUtils.readFile(fileName);
}
@Test
public void testwriteFile(){
String fileName="C:\\Users\\17680\\Desktop\\jzy.txt";
String date="测试成功!";
FileUtils.writeFile(fileName,date);
}
@Test
public void testwriteFileException(){
String fileName="C:\\Users\\17680\\Desktop\\system.log";
String date="测试成功!";
FileUtils.writeFile(fileName,date);
}
}
测试思路:
测试导入正常的txt文件和不正常的txt文件的情况,测试写入正常的txt文件和不正常的txt文件的情况
测试结果:
IkUtilsTest
@Test
public void testIk(){
String data="我喜欢大海啊";
List<String> string = IkUtils.getString(data, false);
System.out.println(string.toString());
}
测试思路:
测试分词的情况
测试结果:
SimHashUtilsTest
@Test
public void testgetSimHash(){
String s = FileUtils.readFile("C:\\Users\\17680\\Desktop\\orig.txt");
String simHash = SimHashUtils.getSimHash(s);
System.out.println(simHash);
}
@Test
public void testgetHash(){
String s = FileUtils.readFile("C:\\Users\\17680\\Desktop\\orig.txt");
String hash = SimHashUtils.getHash(s);
System.out.println(hash);
}
测试思路:
读取文件,然后看可不可以计算simHash和hash值
测试结果:
hammingUtilsTest
@Test
public void testgetSimilarity(){
String s = FileUtils.readFile("C:\\Users\\17680\\Desktop\\orig.txt");
String s1 = FileUtils.readFile("C:\\Users\\17680\\Desktop\\orig_0.8_add.txt");
String simHash = SimHashUtils.getSimHash(s);
String simHash1 = SimHashUtils.getSimHash(s1);
double similarity = hammingUtils.getSimilarity(simHash, simHash1);
System.out.println(similarity);
}
@Test
public void testgetHammingDis(){
String s = FileUtils.readFile("C:\\Users\\17680\\Desktop\\orig.txt");
String s1 = FileUtils.readFile("C:\\Users\\17680\\Desktop\\orig_0.8_add.txt");
String simHash = SimHashUtils.getSimHash(s);
String simHash1 = SimHashUtils.getSimHash(s1);
int hammingDis = hammingUtils.getHammingDis(simHash, simHash1);
System.out.println(hammingDis);
}
测试思路:
导入文件,计算相对应的simHash,然后计算相似度
测试结果:
模块部分异常处理说明
当读写的文件不是txt文件类型的时候
public class FileException extends RuntimeException{
private String errMessage;
public FileException(){
super();
}
public FileException(String errMessage){
super(errMessage);
this.errMessage=errMessage;
}
public String getErrMessage(){
return errMessage;
}
public static void handle(){
throw new FileException("仅支持读取txt类型文件");
}
}