软工作业二_个人项目
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-34/ |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-34/homework/13023 |
这个作业的目标 | 完成一个个人项目 |
github链接 | https://github.com/guiwuwu/3121005150 |
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10min | 15min |
Estimate | 估计这个任务需要多少时间 | 100min | 130min |
Development | 开发 | 120min | 100min |
Analysis | 需求分析 (包括学习新技术) | 60min | 80min |
Design Spec | 生成设计文档 | 30min | 30min |
Design Review | 设计复审 | 15min | 10min |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10min | 8min |
Design | 具体设计 | 10min | 15min |
Coding | 具体编码 | 100min | 90min |
Code Review | 代码复审 | 10min | 8min |
Test | 测试(自我测试,修改代码,提交修改) | 30min | 20min |
Reporting | 报告 | 10min | 10min |
Test Repor | 测试报告 | 10min | 10min |
Size Measurement | 计算工作量 | 5min | 5min |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 5min | 5min |
合计 | 520min | 531min |
需求
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
模块接口设计
类及其方法
-
App:main方法
- 从命令行输入的路径读取文件,调用IOtxt将文件的内容转化为字符串
- 得出 simHash 值
- 由 simHash 值求出相似度
- 把相似度写入结果文件中
- 退出程序
-
HamMingUtils:计算海明距离的类
- getHammingDistance:输入两个 simHash 值,计算出它们的海明距离 distance
- getSimilarity:由simHash 值和海明距离 distance 计算出相似度。
-
SimilarityHash:计算SimHash值的类
- 通过外部包 HanLP的方法extractKeyword去出关键词
- getHash得出哈希值
- 加权、合并
- 降维
-
IOtxt:读写txt文件的类
- readTxt:读取txt文件
- writeTxt:写入txt文件
-
TxtException:处理txt文件错误信息的类
关键算法
- SimilarityHash与海明距离的计算流程图
性能分析
- Overview
- 函数调用
- 分析:占用最多的是hanlp包提供的接口,和开辟内存空间如数组、字符串、浮点数。所以性能上不需改进
单元测试
String path1="C:\\Users\\zengyf\\Desktop\\测试文本\\orig.txt";//原文
String path2="C:\\Users\\zengyf\\Desktop\\测试文本\\orig_0.8_add.txt";
String path3="C:\\Users\\zengyf\\Desktop\\测试文本\\orig_0.8_del.txt";
String path4="C:\\Users\\zengyf\\Desktop\\测试文本\\orig_0.8_dis_1.txt";
String path5="C:\\Users\\zengyf\\Desktop\\测试文本\\orig_0.8_dis_10.txt";
String path6="C:\\Users\\zengyf\\Desktop\\测试文本\\orig_0.8_dis_15.txt";
@Test //原文与原文对比,查重率百分之百
public void Test2(){
try {
String str0 = IOtxt.readTxt(path1);
String str1 = IOtxt.readTxt(path1);
String ansFileName = "C:\\Users\\zengyf\\Desktop\\测试文本\\ans1.txt";
double ans = HamMingUtils.getSimilarity(SimilarityHash.getSimHash(str0), SimilarityHash.getSimHash(str1));
String result="查重率:"+ans;
IOtxt.writeTxt(result, ansFileName);
}catch (Exception err){
System.out.println(err);
}
}
- 测试结果
- 覆盖率
异常处理
@Test //读入的路径不存在的异常情况
读入文件的绝对路径不存在计算机中
public void Test3(){
try {
String str0 = IOtxt.readTxt("C:\\NotFound.txt");
String str1 = IOtxt.readTxt(path1);
String ansFileName = "C:\\Users\\zengyf\\Desktop\\测试文本\\ans2.txt";
double ans = HamMingUtils.getSimilarity(SimilarityHash.getSimHash(str0), SimilarityHash.getSimHash(str1));
String result="查重率:"+ans;
IOtxt.writeTxt(result, ansFileName);
}catch (Exception err){
err.printStackTrace();
System.out.println("未找到指定路径文件");
}
}
@Test //写入的路径错误的异常情况
结果文件的写入绝对路径不存在计算机中
public void Test4(){
try {
String str0 = IOtxt.readTxt(path1);
String str1 = IOtxt.readTxt(path1);
String ansFileName = "Z:\\Users\\zengyf\\Desktop\\测试文本\\ans3.txt";
double ans = HamMingUtils.getSimilarity(SimilarityHash.getSimHash(str0), SimilarityHash.getSimHash(str1));
String result="查重率:"+ans;
IOtxt.writeTxt(result, ansFileName);
}catch (Exception err){
err.printStackTrace();
System.out.println("写入路径错误!");
}
}
@Test 文章内容为空
当文本长度太短时,HanLp无法取得关键字,需要抛出异常。
public void Test5(){
try {
String str0 = IOtxt.readTxt("");
String str1 = IOtxt.readTxt("");
String ansFileName = "C:\\Users\\zengyf\\Desktop\\测试文本\\ans4.txt";
double ans = HamMingUtils.getSimilarity(SimilarityHash.getSimHash(str0), SimilarityHash.getSimHash(str1));
String result="查重率:"+ans;
IOtxt.writeTxt(result, ansFileName);
}catch (Exception err){
err.printStackTrace();
System.out.println("文章内容太少");
}
}
@Test //正常读写(不传入参数)
getSimHash方法参数不能为空
public void Test6(){
try {
String str0 = IOtxt.readTxt(path5);
String str1 = IOtxt.readTxt(path6);
String ansFileName = "C:\\Users\\zengyf\\Desktop\\测试文本\\ans5.txt";
double ans = HamMingUtils.getSimilarity(SimilarityHash.getSimHash(), SimilarityHash.getSimHash());
String result="查重率:"+ans;
IOtxt.writeTxt(result, ansFileName);
}catch (Exception err){
err.printStackTrace();
System.out.println("请输入参数!");
}
}
@Test //传入参数类型错误
getSimHash函数传入的参数应该是字符串,传入其他类型时要处理
public void Test7(){
try {
String str0 = IOtxt.readTxt(path2);
String str1 = IOtxt.readTxt(path6);
String ansFileName = "E:\\Users\\zengyf\\Desktop\\测试文本\\ans6.txt";
double ans = HamMingUtils.getSimilarity(SimilarityHash.getSimHash(1), SimilarityHash.getSimHash(2));
String result="查重率:"+ans;
IOtxt.writeTxt(result, ansFileName);
}catch (Exception err){
err.printStackTrace();
System.out.println("传入参数类型错误!");
}
}