软工第二次作业--王腾

news/2025/9/24 0:05:18/文章来源:https://www.cnblogs.com/littseadol/p/19108381

论文查重系统设计与实现

项目信息

  • 课程:计科23级12班
  • 作业要求:[https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/homework/13468]
  • GitHub链接:[https://github.com/littseadol/littseadol/tree/version-1]
  • 作业目标:掌握GitHub使用方法,锻炼个人软件开发能力

一、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 45
Estimate 估计这个任务需要多少时间 60 45
Development 开发 480 520
Analysis 需求分析 (包括学习新技术) 120 90
Design Spec 生成技术文档 60 75
Design Review 设计复审 30 25
Coding Standard 代码规范 (为目前的开发制定合适的规范) 30 20
Design 具体设计 90 110
Coding 具体编码 150 180
Code Review 代码复审 30 40
Test 测试(自我测试,修改代码,提交修改) 90 120
Reporting 报告 180 165
Test Report 测试报告 60 70
Size Measurement 计算工作量 30 25
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 90 70
合计 720 730

二、模块接口的设计与实现

1. 模块划分

本系统采用模块化设计,主要包含以下核心模块:

  • Main.java - 主程序入口类
  • PlagiarismChecker - 论文查重核心类
  • TextProcessor - 文本处理类
  • SimilarityCalculator - 相似度计算类
  • FileUtils - 文件工具类
  • PlagiarismCheckerTest - 测试类

2. 类关系图

image

3. 相似度计算关键流程

文件读取 → 文本预处理 → 词频统计 → 余弦相似度计算 → 结果输出

4. 算法核心特点

基于余弦相似度的向量空间模型

  • 核心原理:将文本转换为词频向量,通过计算向量夹角余弦值来衡量相似度
  • 详细说明
    • 将每篇论文转换为词频映射表
    • 构建高维空间中的特征向量
    • 使用余弦公式计算向量相似度:cosθ = (A·B) / (||A|| * ||B||)

智能文本预处理

  • 核心原理:多层次的文本清洗和标准化处理
  • 详细说明
    • 字符过滤:移除标点符号和特殊字符
    • 格式统一:转换为小写,规范化空白字符
    • 词频统计:统计每个词汇的出现频率

5. 系统优势

  • 纯Java实现,无外部依赖,部署简单
  • 支持大文件处理,内存使用优化
  • 算法时间复杂度合理,适合批量处理

三、性能分析与改进

性能分析结果

12abe79635aea936652414426f413ad8
74ba3992e203af01a3b3482f9720262b

通过性能分析工具检测发现:

  1. I/O操作 - 文件读写占用主要时间
  2. 文本处理 - 正则表达式匹配和字符串操作
  3. 集合运算 - HashMap操作和集合交集计算

性能瓶颈识别

  • 文件读取时的缓冲机制可优化
  • 正则表达式匹配效率有待提升
  • 向量计算中的数学运算可优化

改进方向

  • 使用BufferedReader提高文件读取效率
  • 预编译正则表达式模式
  • 优化余弦相似度计算的数学公式

四、单元测试

测试函数设计

java
//开始测试
@Test
void checkIdenticalTexts() throws IOException {
System.out.println("\n=== 测试相同文本 ===");

    // 初始化查重器PlagiarismChecker checker = new PlagiarismChecker();System.out.println("正在比较:orig.txt 和 orig.txt");// 计算相似度double similarity = checker.check("src/test/resources/orig.txt","src/test/resources/orig.txt");// 打印详细结果System.out.printf("计算出的相似度:%.2f%% (预期:100.00%%)\n", similarity * 100);System.out.println("验证是否完全相似(误差±1%)...");// 断言assertEquals(1.0, similarity, 0.01);System.out.println("✅ 测试通过:相同文本相似度为100%");
}@Test
void checkDifferentTexts() throws IOException {System.out.println("\n=== 测试不同文本 ===");// 初始化查重器PlagiarismChecker checker = new PlagiarismChecker();System.out.println("正在比较:orig.txt 和 orig_0.8_add.txt");// 计算相似度double similarity = checker.check("src/test/resources/orig.txt","src/test/resources/orig_0.8_add.txt");// 打印详细结果System.out.printf("计算出的相似度:%.2f%% (预期:<10.00%%)\n", similarity * 100);System.out.println("验证是否差异显著...");// 断言assertTrue(similarity < 0.1,String.format("错误:相似度 %.2f%% 高于预期的10%%,论文抄袭", similarity * 100));System.out.println("✅ 测试通过:不同文本相似度<10%");
}

测试数据构造思路

  1. 边界测试:空文件、单字符文件等极端情况
  2. 功能测试:相同内容、不同内容、部分相似内容
  3. 异常测试:文件不存在、权限错误等异常情况

测试覆盖率

  • 核心算法类覆盖率:100%
  • 工具类覆盖率:85%
  • 异常处理覆盖率:90%

五、异常处理机制

文件操作异常

java
@Test
void testFileNotFoundException() {
try {
PlagiarismChecker checker = new PlagiarismChecker();
checker.check("nonexistent.txt", "plagiarized.txt");
fail("Expected IOException");
} catch (IOException e) {
assertTrue(e.getMessage().contains("文件不存在"));
}
}

数据处理异常

java
@Test
void testEmptyFileProcessing() throws IOException {
// 创建空测试文件
Files.write(Paths.get("empty.txt"), "".getBytes());

PlagiarismChecker checker = new PlagiarismChecker();
double similarity = checker.check("empty.txt", "empty.txt");
assertEquals(0.0, similarity, 0.01);

}

六、核心代码展示

Main.java

java
package org.example.checker;

import java.io.IOException;

public class Main {
private static final String HELP_MESSAGE ="java -jar target/main.jar src/main/resources/orig.txt src/main/resources/orig_0.8_add.txt src/main/resources/result.txt";

public static void main(String[] args) {args = new String[]{"src/main/resources/orig.txt", "src/main/resources/orig_0.8_add.txt", "src/main/resources/result.txt"};// 参数验证if (args.length != 3) {System.err.println("❌ 参数错误: 需要3个参数");System.err.println(HELP_MESSAGE);System.exit(1);}String originalFilePath = args[0];String plagiarizedFilePath = args[1];String outputFilePath = args[2];System.out.println("🚀 启动论文查重系统");System.out.printf("🔍 参数配置:\n- 原文: %s\n- 抄袭版: %s\n- 输出: %s\n",originalFilePath, plagiarizedFilePath, outputFilePath);try {// 执行查重PlagiarismChecker checker = new PlagiarismChecker();double similarity = checker.check(originalFilePath, plagiarizedFilePath);// 结果输出FileUtils.writeResult(outputFilePath, similarity);System.out.printf("\n💾 结果已保存到: %s\n", outputFilePath);// 相似度分级提示printSimilarityLevel(similarity);} catch (IOException e) {System.err.println("\n❌ 处理过程中发生错误:");e.printStackTrace();System.err.println("\n💡 可能的解决方案:");System.err.println("1. 检查文件路径是否正确");System.err.println("2. 确认文件编码为UTF-8");System.err.println("3. 验证文件读取权限");System.exit(1);}
}private static void printSimilarityLevel(double similarity) {System.out.println("\n📊 相似度分析报告:");double percent = similarity * 100;if (percent < 10) {System.out.printf("✅ 极低相似度 (%.2f%%): 文本高度原创\n", percent);} else if (percent < 20) {System.out.printf("⚠️ 低相似度 (%.2f%%): 可能存在少量引用\n", percent);} else if (percent < 30) {System.out.printf("❗ 中度相似 (%.2f%%): 需要检查是否适当引用\n", percent);} else if (percent < 50) {System.out.printf("❌ 高度相似 (%.2f%%): 可能存在抄袭\n", percent);} else {System.out.printf("🛑 极高相似度 (%.2f%%): 基本确认为抄袭\n", percent);}
}

}

七、项目总结

通过本次论文查重系统的开发,我深入掌握了:

  1. 软件工程实践:完整的软件开发流程,从需求分析到测试部署
  2. 算法实现能力:余弦相似度算法的具体实现和优化
  3. 代码质量保障:单元测试、异常处理、代码规范的重要性
  4. 工具链使用:Maven项目管理、Git版本控制、性能分析工具

项目成功实现了论文查重的核心功能,并在代码质量和性能方面达到了较高标准。通过这次实践,不仅提升了技术水平,也增强了解决实际问题的能力。论文查重系统设计与实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/914310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大连房地产网站开发wordpress 中文企业主题

不专心开车 Description 小硕开车经过一条公路&#xff0c;这条路线总共由n 1个不同海拔的点组成。小硕从海拔为0的点0开始骑行。 给小硕一个长度为n的整数数组arr&#xff0c;其中arr[i]是点i和点i 1的净海拔高度差&#xff08;0≤i < n&#xff09;。请你返回最高点的海…

郑州网站建设专注乐云seo共享办公商业租赁网站模板

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

如何创做网站阿里营销网站建设

PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES, Version 4.2为基础的对象关系型数据库管理系统(ORDBMS)。POSTGRES开创的许多概念在很久以后才出现在商业数据库中。PostgreSQL是最初伯克利代码的一个开放源码的继承者。它支持大部分SQL标准并且提供了许多其它现代特…

自己做网站卖东西需要交税吗天津网站建站推广

文章目录 技术栈踩坑记录 技术栈 JavaFX 11MavenJDK 11 踩坑记录 这些坑对于初学者很容易踩&#xff0c;JavaFX经常会报错空指针异常遇到其中一个问题可能就会消耗好几天的时间。 JavaFX 采用的是MVC架构设计&#xff0c;页面设计使用 fxml文件&#xff1b;业务逻辑采用Con…

手机网站自助建站常见的简单的营销软件

牛客题霸 [比较版本号] C题解/答案 题目描述 如果version1 > version2 返回1&#xff0c;如果 version1 < version2 返回-1&#xff0c;不然返回0. 输入的version字符串非空&#xff0c;只包含数字和字符.。.字符不代表通常意义上的小数点&#xff0c;只是用来区分数字…

出名的网站建设软件wordpress登录 跳转

1 声明和定义 声明就是告诉编译器有这个东西的存在&#xff0c;而定义则是这个东西的实现。 对于变量来说&#xff0c;声明就是告诉编译器存在这个名称的变量&#xff0c;定义则是给这个变量分配内存并赋值&#xff1a; // 变量声明&#xff0c;声明时不能赋值&#xff0c;如…

网站建设外包公司容易被客户投诉吗成都零起飞网站建设

工业高速发展的背后&#xff0c;离不开与之匹配的高端设备作为科研的支撑。品质检测仪器也在随着现代科技的发展而不断变化&#xff0c;随着科技的进步&#xff0c;各种大口径的管材、管道被生产制造出来&#xff0c;而对其外径尺寸的检测则因口径范围大而使得很少有仪器能进行…

牛客周赛 Round 110 E,F题解

E、小苯的数字变换 题意: 小苯在研究一种特殊的数字变换。对于一个正整数 \(x\),定义一个数字的“根”为不断将其各位数字相加直到得到个位数。例如: \[\text{根}(38) = 3 + 8 = 11 \rightarrow 1 + 1 = 2 \]\[\tex…

第5章:路由(Routing)与直连交换机(Direct Exchange)

本章目标理解直连交换机(Direct Exchange)的工作原理。掌握基于路由键(Routing Key)的消息过滤机制。学习多重绑定(Multiple Bindings)的概念。实现一个可以根据日志级别进行过滤的智能日志系统。一、理论部分 1…

网站做的好的tkd培训机构怎么做线上推广

原文 http://www.cnblogs.com/BoyceYang/archive/2013/06/15/3138142.html 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索引设计 4. 使用高效的查询设计 5. 使用技术分析低性能 6. 总结 1. 概述 在比较大的范围内找出能够大幅提高性能的区域&#xff0c;并且专注于分析…

网站内容与功能设计与实现的wordpress 主页 慢

大家好&#xff0c;我是微三云周丽&#xff0c;今天给大家分析当下市场比较火爆的商业模式&#xff01; 小编今天跟大伙们分享什么是社交电商与拼购玩法的wan美结合&#xff1f; 随着社交电商和拼购玩法的兴起&#xff0c;全民拼购模式正逐渐成为电商行业的新宠。结合了人性化…

网站页面类型中国去中心化搜索引擎

编程器可以做什么游戏&#xff1a;探索游戏开发的无限可能 编程器&#xff0c;作为游戏开发的核心工具&#xff0c;赋予了开发者创造独特游戏体验的能力。那么&#xff0c;编程器究竟可以做什么游戏呢&#xff1f;本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;…

移动互联网网站建设网站设计 布局

文章目录 1 简介2 Docker安装与配置2.1 安装Docker2.2 配置Docker镜像加速器2.3 调整Docker资源限制 3 准备Elasticsearch Docker镜像3.1 下载Elasticsearch镜像3.2 自定义镜像配置3.3执行Docker Compose 4 运行Elasticsearch容器4.1 创建Elasticsearch容器4.2 修改配置文件4.3…

前程无忧做简历网站网站已运行时间代码

在视频编辑和处理的领域&#xff0c;转换格式是一项常见的任务。在某些编辑和发布工作中&#xff0c;可能需要使用WMV格式。提前将素材转换为WMV可以节省在编辑过程中的时间和精力。从MP4到WMV的批量转换&#xff0c;不仅能使视频素材在不同的平台和设备上得到更好的兼容性&…

吴江那里有做公司网站的政务网站建设依据国家

初步认识JUnit 目前大多数的基于Java的企业应用软件&#xff0c;肯定少不了单元测试&#xff0c;程序员通过编写单元测试来验证自己程序的有效性&#xff1b;管理者通过持续自动的执行单元测试和分析单元测试覆盖率来确保软件本身的质量。可以说单元测试和集成测试在软件开发整…

怎么开个人网站赚钱网络推广公司名称

std::thread是C11线程库提供的线程创建。参数绑定的是线程需要调用的函数与参数。 1、如何创建 std::thread th;//空的&#xff0c; std::thread th1([]() { //匿名函数&#xff0c; //执行线程代码 }); void thFun(int k)&#xff1b; std::thread th(thFun,10);// thFun为…

科技公司网站php源码wordpress被禁

在 Git 中&#xff0c;如果你想从本地其他设备上获取分支&#xff0c;可以通过以下几种方式实现。不过&#xff0c;需要注意的是&#xff0c;Git 本身是分布式版本控制系统&#xff0c;通常我们是从远程仓库&#xff08;如 GitHub、GitLab 等&#xff09;拉取分支&#xff0c;而…

网站建站时间查询许昌网站建设汉狮怎么样

PAGE \* MERGEFORMAT43《软件工程》(第五版)习题参考答案第1章 一、判断题1、()软件的维护与硬件维护本质上是相同的。 2、(√)软件在运行和使用中也存在退化问题。 3、()软件危机的产生主要是因为程序设计人员使用了不适当的程序设计语言。 4、(√)软件同其他事物一样&#xf…

搜索百科(4):OpenSearch — 开源搜索的新选择

大家好,我是 INFINI Labs 的石阳。 欢迎关注 《搜索百科》 专栏!每天 5 分钟,带你速览一款搜索相关的技术或产品,同时还会带你探索它们背后的技术原理、发展故事及上手体验等。 上一篇我们围观了 “流量明星” Ela…

怎么学好网站开发开发网站性能监控

这是王垠发表的一篇文章&#xff0c;转给大家看看&#xff0c;希望有些收获王垠是谁&#xff1f;王垠&#xff0c;四川大学97级本科毕业&#xff0c;保送到清华大学计算机系直博。期间曾在清华大学计算机系软件所就读&#xff0c;主要进行集成电路布线算法的研究。在此期间&…