第一次个人编程作业
作业github链接:https://github.com/HsuQingYoung/3121004931
Java实现论文查重算法
| 项目 | 链接 |
|---|---|
| 这个作业属于哪个课程 | 软件工程 |
| 这个作业要求在哪 | 作业要求 |
| 这个作业的目标 | 学会用java建立工程项目以及熟悉使用github |
| 作业github链接 | 作业github链接 |
PSP表格
| PSP2.1 | Person Software Process Stages |
预估耗时 (分钟) |
实际耗时 (分钟) |
|---|---|---|---|
| Planning | 计划 | 15 | 20 |
| Estimate | 估计这个任务需要多少时间 | 180 | 270 |
| Development | 开发 | 60 | 120 |
| Analysis | 需求分析 (包括学习新技术) | 30 | 60 |
| Design Spec | 生成设计文档 | 10 | 30 |
| Design Review | 设计复审 | 5 | 10 |
| Coding Standard | 代码规范(为目前的开发制定合适的规范) | 10 | 20 |
| Design | 具体设计 | 10 | 30 |
| Coding | 具体编码 | 60 | 90 |
| Code Review | 代码复审 | 10 | 60 |
| Test | 测试(自我测试,修改代码,提交修改) | 10 | 10 |
| Reporting | 报告 | 30 | 50 |
| Test Report | 测试报告 | 10 | 20 |
| Size Measurement | 设计工作量 | 10 | 30 |
| Postmortem&Process Improvement Plan | 事后总结,并提出过程改进计划 | 10 | 20 |
| 合计 | 460 | 840 |
流程图

流程设计
先通过命令行过的原文路径,抄袭文件路径,以及答案路径,接着调用FileOperation类的readTextFromFile()方法从原文路径和抄袭文件路径中读取文本,在调用CosSimility类的getCosSimility()方法获得两个文本的相似度。再调用FileOperation类的writeIntoFile()方法将相似度写入答案文件
算法设计

1.Main:程序入口
2.FileOperation:对文件的读写操作
readTextFromFile(String filePath):从文件路径读取文本并返回字符串
writeIntoFile(String filePath,String result):将计算的相似度结果写入文件
3.CosSimility:计算相似度
getCosSimility(String str1,String str2):计算两个文本的相似度并返回相似度结果
算法设计
| 算法 | |
|---|---|
| public static String readFromFile(String filePath) | 从文件路径中读取文件的内容 |
| public static void writeIntoFile(String filePath,String result) | 将相似度写进文件路径对应的文件中 |
| public static double getCosSimility(String str1,String str2) | 通过ansj分词器和余弦算法计算文本一和文本二的相似度 |
测试
测试文件的读取
点击查看代码
public class TestReadTextFromFile {
public static void main(String[] args) {
String originalFilePath = "D:\\softwork\\测试文本\\orig.txt";//原文路径;
FileOperation rtff=new FileOperation();
String originalText=rtff.readFromFile(originalFilePath);//原文
System.out.println(originalText);
}
}
测试结果如下图,读取成功

测试ansj分词器
点击查看代码
public class TestAnsj {
public static void main(String[] args) {
StopRecognition filter = new StopRecognition();
//过滤掉标点
filter.insertStopNatures("w");
Map<String,Integer> map1= new HashMap<>();
String originalFilePath = "D:\\softwork\\测试文本\\orig.txt";//原文路径;
FileOperation rtff=new FileOperation();
String originalText=rtff.readFromFile(originalFilePath);//原文
String analysisedText = ToAnalysis.parse(originalText).recognition(filter).toStringWithOutNature();
System.out.println((analysisedText));
}
}

测试余弦相似度的计算
点击查看代码
public class TestCosSimility {
public static void main(String[] args) {
String originalFilePath = "D:\\softwork\\测试文本\\orig.txt";//原文路径;
String copiedFilePath = "D:\\softwork\\测试文本\\orig_0.8_add.txt";//抄袭路径
FileOperation rtff=new FileOperation();
String originalText=rtff.readFromFile(originalFilePath);//原文
String copiedText=rtff.readFromFile(copiedFilePath);//抄袭
CosSimility cos=new CosSimility();
double result=cos.getCosSimility(originalText,copiedText);
System.out.println(result);
}
}

测试主类
点击查看代码
public class TestMain {
public static void main(String[] args) {
String originalFilePath = "D:\\softwork\\测试文本\\orig.txt";//原文路径;
String copiedFilePath = "D:\\softwork\\测试文本\\orig_0.8_del.txt";//抄袭路径
String answerFilePath ="D:\\softwork\\测试文本\\CosSimility.txt";
FileOperation rtff=new FileOperation();
String originalText=rtff.readFromFile(originalFilePath);//原文
String copiedText=rtff.readFromFile(copiedFilePath);//抄袭
String answer=rtff.readFromFile(answerFilePath);//相似度
CosSimility cos=new CosSimility();
Double result=cos.getCosSimility(originalText,copiedText);
rtff.writeIntoFile(answerFilePath,result.toString());
}
}

计算模块接口部分的性能改进
性能分析图


改进思路
从上图可以看出,内存中使用最多的是char,String类型的数据,前者为分词后,后者为分此前,可以通过选择一个性能更好的分词器以提高程序的性能
覆盖率

异常处理
对IO做了异常处理

在命令窗口运行jar包


浙公网安备 33010602011771号