软件工程个人项目

news/2025/9/18 17:15:23/文章来源:https://www.cnblogs.com/nailong100/p/19099205

3123004548软件工程个人项目

这个作业属于哪个课程 <https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024>
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13477
这个作业的目标 <设计一个能处理长文本的论文查重算法>

声明:本算法实现的测试环境为python 3.11

GitHub链接:https://github.com/Ascrio/3123004548

PSP表格相关记录

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

模块接口的设计与实现过程

设计概述

采用基于余弦相似度算法的词袋模型,设计了该论文查重功能,并通过DocumentComparator类来封装整个查重算法功能,并采用面向对象的方式组织代码,确保模块化和可维护性

函数设计以及调用模块展示

核心函数DocumentComparator类包括以下函数

1._ init _():初始化jieba分词器

2.fetch_document_data(): 读取文档内容

3.process_content(): 对内容进行分词和预处理,同时构建词汇表

4.compute_document_similarity(): 余弦相似度算法计算两个文档的相似度

5.execute_comparison(): 执行完整的比较流程

辅助函数primary_function()则负责处理命令行参数和程序流程

各函数之间调用模块关系如下

diagram

算法设计于与流程展示

1.对指定的文本进行jieba分词器处理,将文本处理成词语序列,同时过滤处理文本中出现的符号

2.读取源文档和目标文档,并对两个文档进行分词和过滤处理

3.使用gensim构建词袋模型(Bag-of-Words Model)

4.计算文本余弦相似度,并将结果标准化到[0,1]范围

5.输出结果至文件

核心函数DocumentComparator 流程图如下

4e4ac3f0d27a53bf62d2b7fc46da9462

算法的关键点在于文本分词以及词袋模型的构建,文本分词为文档转换成词频向量做了铺垫,而词袋模型的构建是文本查重算法实现的基础核心

该算法实现简单,无需复杂的语义分析,适合处理大量文档,且对词序不敏感能够实现检测内容重复而非结构化抄袭,同时不依赖词典库

模块接口的性能改进

最初代码采用基于给定停用词列表的simhash算法,经运行后得出性能分析图如下

image

后经研究发现,代码对停用词列表高度依赖且算法因为反复查看停用词导致算法的时间成本耗费很大,同时存在多处函数开销极大的情况(如_find_and_load函数)

同时,该算法存在无法区分差距较大的文本,导致即使文本完全不同,也有50%以上的相似度,如下图所示

image

经过代码改进,性能图如下

image

可见,函数平均时间耗费有所降低,且函数利用得到有效提升

同时,对于差异较大的文本,该算法能够完全区分并且以此给出较低的相似度

image

在改进版的算法中,虽然消耗最大的函数依旧为_find_and_load函数,但是函数的平均开销相比前者有所降低,性能得到一定改进

运行结果展示

如下展示两个相似文本orig.txt和orig_0.8_add.txt的运行结果

将两个文本的路径代入后,输入两个txt文件的路径,显示运行结果图如下

image

显示结果为99.17%,符合结果预期

模块部分单元测试展示

为了测试代码稳定性,设计了18处测试代码paperchecker.py,经测试改进代码已全部通过

image

考虑篇幅限制,此处仅展示3处测试代码

测试一:对于完全相同的文本,相似度应为1

def test_similarity_calculation_identical(self):text1 = "这是一个完全相同的测试文本"text2 = "这是一个完全相同的测试文本"processed1 = self.comparator.process_content(text1)processed2 = self.comparator.process_content(text2)similarity = self.comparator.compute_document_similarity(processed1, processed2)self.assertAlmostEqual(similarity, 1.0, delta=0.1)

测试二:对于完全不同的文本,相似度应小于0.4

def test_similarity_calculation_different(self):text1 = "这是第一个测试文本,关于人工智能和机器学习"text2 = "恐惧是生物的本能,勇气是人类的赞歌"processed1 = self.comparator.process_content(text1)processed2 = self.comparator.process_content(text2)similarity = self.comparator.compute_document_similarity(processed1, processed2)self.assertLess(similarity, 0.4)

测试三:对于一个有文本的文件和一个没有文本的文件,相似度应为0

   def test_one_empty_file_processing(self):content = "这是一个有内容的文件"with tempfile.NamedTemporaryFile(mode='w', delete=False, encoding='utf-8') as f:f.write(content)temp_file1 = f.namewith tempfile.NamedTemporaryFile(mode='w', delete=False, encoding='utf-8') as f:temp_file2 = f.nameprocessed1 = self.comparator.process_content(content)processed2 = self.comparator.process_content("")similarity = self.comparator.compute_document_similarity(processed1, processed2)self.assertEqual(similarity, 0.0)os.unlink(temp_file1)os.unlink(temp_file2)

测试结束后,以覆盖率(pycharm自带功能)运行代码,结果如下图所示

f7a92ba751826db10221f3e8a3df46c1

模块部分异常处理说明

异常一:文档读取阶段异常

目标:当用户传入的文档路径无效(如文件不存在、无权限、编码错误等),避免程序因 FileNotFoundError、UnicodeDecodeError等异常而中断
处理方式:使用 try-except捕获所有可能的读取异常,打印具体错误信息,并返回空字符串 ""作为兜底内容

def fetch_document_data(self, document_location):try:with open(document_location, 'r', encoding='UTF-8') as file_obj:return file_obj.read()except Exception as error:print(f"文档读取异常 {document_location}: {error}")return ""

对应代码测试片段如下

class TestDocumentFetcher(unittest.TestCase):def test_fetch_nonexistent_file(self):comparator = DocumentComparator()result = comparator.fetch_document_data("dummy_nonexistent_file_12345.txt")self.assertEqual(result, "")  # 应返回空字符串

异常二:内容处理阶段异常

目标:对读取到的原始内容进行分词和过滤,但如果传入的内容为空(比如上个阶段读取失败返回了 ""),则直接返回空列表,避免后续处理出错。
处理方式​​:首先判断 content_data是否为空,如果是,则返回空列表 [],而不是继续分词。

def process_content(self, content_data):if not content_data:  # 处理空字符串(包括空文件)return []segmented_data = jieba.lcut(content_data)filtered_result = []for segment in segmented_data:if re.match(r"[a-zA-Z0-9\u4e00-\u9fa5]", segment):  # 保留中/英文字符和数字filtered_result.append(segment)return filtered_result

对应代码测试片段如下

def test_process_empty_content(self):comparator = DocumentComparator()result = comparator.process_content("")self.assertEqual(result, [])  # 空内容应返回空列表

模型改进建议及使用说明

模型改进建议

该模型存在以下局限性

1.对于短文本且近义词占比较多的相似文本,算法难以区分其相似度并会给出低于期望的相似度

2.难以区分极少数可能存在前后文关系的亦或是语序关系的文本

基于该局限性,给出如下可能改进方向

1.引入新模型,考虑词汇序列等信息

2.结合语义向量,使用深度学习模型

使用说明

main.py

运行时,用户需往命令行里输入对应格式

python main.py [原文文件路径] [抄袭版论文的文件路径] [答案文件路径]

image

输入后,函数将输出结果至答案txt文件中

image

paperchecker.py

运行时,需确保main.py文件存在且包含DocumentComparator类,往命令行输入python paperchecker.py即可运行18种单元测试,并给出对应结果

image

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

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

相关文章

学习道路道阻且长 希望自己坚持下去

本人是一名专升本的大三学生 现在专业是软件工程专业 从今天开始学习java 翻了一下资料 发现很多人建议从前端开始学习 在专科学习中 也学过相应的基础知识,不过遗忘程度可能有点严重。对于语言的基本语法掌握需要加强…

2025/9/18 总结

A 用时:2h 预期:100pts 实际:100pts 求出前缀和,\(s_k+s_i \text{xor} s_k\),考虑从高到低贪心,如果 \(s_i\) 的 \(j\) 位为 \(1\),不管如何贡献都有 \(2^j\),如果 \(s_i\) 的第 \(j\) 位为 \(0\),则 \(s_k\)…

P2216 [HAOI2007] 理想的正方形

P2216 [HAOI2007] 理想的正方形#include <bits/stdc++.h> using namespace std;const int maxn = 1e3 + 10; int a,b,n; int c[maxn][maxn]; deque <int> dq1,dq2; int max1[maxn][maxn],min1[maxn][maxn]…

PuTTY下载和安装

下载地址: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html更改安装路径创建桌面快捷方式

数据通路-单总线结构(最头晕的一集)

数据通路就是数据在各个部件之间传输的路径(包括路径上的部件) 控制信号是有控制部件产生的 数据通路的结构 1cpu内部单总线方式 2cpu内部多总线方式 3专用数据通路方式 内部总线 是指同一个部件,如cpu内部链接各寄…

python基础篇-集合

集合 :集合内的数据不重复,但是数据是无序的创建集合 {} 或者set()注: 创建空集合只能用set(), 因为{}已经被字典占用了eg: s1 = {10, 20 ,40,30 }eg: s2 = set(abcdefg) :用set创建,序列会被拆开 = 》 {’a, b…

#egsg:在同一程序中比较-计算圆的面积

以下是一个同时使用easygui和pysimplegui实现的圆形面积计算程序,通过菜单让用户选择使用哪种GUI库: import math import easygui import PySimpleGUI as sgdef easygui_calculator():"""使用easygui…

282 项多模态胃肠病学数据集:适配 VLM 与 MLLM 微调,融合医学图像与临床文本的医疗 AI 训练数据

​ 获取更多高质量数据集,请访问典枢数据交易平台:https://dianshudata.com一、引言与背景 在医疗人工智能领域,胃肠病学的智能化诊断与分析始终依赖高质量数据的支撑,而视觉语言模型(VLM)与多模态大型语言模型(…

2-sat板子

vector<int>e[maxn]; int n,m; int inscc[maxn]; int low[maxn],dfn[maxn]; stack<int>stk; int instk[maxn]; int tot,cnt; vector<int>scc[maxn];void dfs(int u,int fa){low[u]=dfn[u]=++tot;stk…

Node.js 中使用 .env 文件管理环境变量

Node.js 中使用 .env 文件管理环境变量Node.js 中使用 .env 文件管理环境变量xiaochong0302鸠摩智首席音效师​关注他1 人赞同了该文章 Using .env File in Node.jsNode.js 应用程序通常依赖于环境变量来管理敏感信息或…

centos 7中安装jenkins

1.安装java11 [root@localhost ~]# yum install -y java-11-openjdk-devel [root@localhost ~]# java --version openjdk 11.0.23 2024-04-16 LTS OpenJDK Runtime Environment (Red_Hat-11.0.23.0.9-2.el7_9) (build …

pythonjs逆向 破解滑动验证码 - hello-*

现在的滑动验证码防盗等级都比较高,之前的是一张完整的图片带缺口,现在返回的图片是打乱顺序拼接而成的,所以现在破解不仅要识别滑块的缺口,同时还需要复原完整的图片一.伪造请求获取验证码图片可以看到请求中主要…

解决 pandas.to_csv 乱码、丢失行和自动换行问题 时间转换

解决 pandas.to_csv 乱码、丢失行和自动换行问题-百度开发者中心 https://developer.baidu.com/article/details/2792989 在使用 pandas.to_csv 函数时,可能会遇到一些问题,如乱码、丢失行和自动换行等。这些问题通常…

JavaDay7

数组 数组的定义数组是相同类型数据的有序集合。 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。数组声明创建首…

腾讯混元 3D 3.0 模型发布

腾讯混元 3D 3.0 模型发布腾讯混元 3D 3.0 模型发布来源: OSCHINA 编辑: 局 2025-09-16 18:06:000推广 | 鸿蒙应用开发者激励计划 2025 正式发布,总奖金池超亿元!限时开放,快来了解腾讯宣布推出混元 3D 3.0 模型,其…

Bun:不仅是新的JavaScript运行时,并且重塑了JavaScript工具链

Bun:不仅是新的JavaScript运行时,并且重塑了JavaScript工具链Bun:不仅是新的JavaScript运行时,并且重塑了JavaScript工具链 原创修改于 2023-11-09 18:56:015.4K00代码可运行举报文章被收录于专栏:世界尽头与冷酷…

AI Agent 与 MCP 核心解析与企业级应用指南

AI Agent 与 MCP 核心解析与企业级应用指南AI Agent 与 MCP 核心解析与企业级应用指南 一、引言 AI Agent(人工智能代理)与 MCP(Model Context Protocol,模型上下文协议)是当前人工智能技术前沿的核心概念。AI Ag…

前端场景题笔记

先说背景再说方案 1. js超过number最大值的数怎么处理? 换数据类型。 2. 如何解决页面请求接口大规模并发问题? 请求队列,Push,shift。防抖节流。 3. 大文件上传? 前端切片,标记唯一值,后端整合。 …

P3934 [Ynoi Easy Round 2016] 炸脖龙 I 做题记录

欧拉函数前置芝士:扩展欧拉定理 题目大意 给一个长为 \(n\) 的序列,\(m\) 次操作,每次操作:区间 \([l,r]\) 加 \(x\); 对于区间 \([l,r]\),查询:\[{a_l}^{{a_{l+1}}^{{a_{l+2}}^{{\dots} ^{a{r}}}}} \mod p \]思…

核桃 CSP-S 模拟

核桃 CSP-S 模拟 T3 题意: 给定一个 \(01\) 串,选定一个操作序列,每次从原串中删除一个数,保持原串中相对顺序不变,把形成的新字符串加入答案字符串,求出本质不同答案字符串总数。 其中 \(n\le 400\) 思路: 我们…