工程概论(第一次编程作业)
工程概论(第一次个人编程作业)
Github地址
github(https://github.com/lii1008/lii1008/tree/main)
作业要求
作业属于哪个课程 | 工程概论(首页 - 计算21级 - 集美大学 - 班级博客 - 博客园 (cnblogs.com)) |
---|---|
作业要求 | 个人项目 - 作业 - 计算21级 - 班级博客 - 博客园 (cnblogs.com) |
作业目标 | 熟悉项目设计流程,学习有关的查重算法并实现 |
项目需求
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
- 原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
- 抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
- 从命令行参数给出:论文原文的文件的绝对路径。
- 从命令行参数给出:抄袭版论文的文件的绝对路径。
- 从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
算法实现基本流程
-
采用余弦相似度对比查重信息
-
首先处理文本,过滤掉标点
-
统计某一个分词词频,构建向量
-
根据向量计算余弦相似度
余弦定理查找相似度流程方法:
(1)找出两个文本的关键词,或直接统计不同的分词词频
(2)每个文本的各取出若干个关键词,合并成一个集合,计算每个文本对于这个集合中的词的词频
(3)生成两个文本各自的词频向量
(4)计算两个向量的余弦相似度,值越大就表示越相似
PSP表格
*PSP2.1* | *Personal Software Process Stages* | *预估耗时(分钟)* | *实际耗时(分钟)* |
---|---|---|---|
Planning | 计划 | 30 | 10 |
· Estimate | · 估计这个任务需要多少时间 | 120 | 100 |
Development | 开发 | 100 | 100 |
· Analysis | · 需求分析 (包括学习新技术) | 15 | 10 |
· Design Spec | · 生成设计文档 | - | - |
· Design Review | · 设计复审 | - | - |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | - | - |
· Design | · 具体设计 | 30 | 20 |
· Coding | · 具体编码 | 100 | 90 |
· Code Review | · 代码复审 | 20 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 20 |
Reporting | 报告 | 20 | 20 |
· Test Repor | · 测试报告 | 20 | 20 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
· 合计 | 515 | 440 |
算法部分解释
1.文件引入输出,Java方法下的文件读取和输出,直接使用BufferedReader
,BufferedWriter
,以及File
方法
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入第一个文件路径:");
String filePath1 = scanner.nextLine();
System.out.print("请输入第二个文件路径:");
String filePath2 = scanner.nextLine();
System.out.print("请输入结果路径:");
String resultFilePath = scanner.nextLine();
scanner.close();
2.构建向量,通过余弦相似性来比较两个文本的相似程度,最后输出
private static double calculateCosineSimilarity(Map<String, Integer> vector1, Map<String, Integer> vector2) {
int sum = 0;
long sq1 = 0;
long sq2 = 0;
for (String key : vector1.keySet()) {
int value1 = vector1.get(key);
int value2 = vector2.get(key);
sum += value1 * value2;
sq1 += value1 * value1;
sq2 += value2 * value2;
}
return sum / (Math.sqrt(sq1) * Math.sqrt(sq2));
}
异常处理
- 计算余弦相似度时出现异常
- 结果写入文件时出现异常