软件工程-作业2:第一次个人编程作业:论文查重

news/2025/3/10 20:48:17/文章来源:https://www.cnblogs.com/nancimoheng/p/18759518
项目 内容
这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023
这个作业在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13324
这个作业的目标 学会如何个人系统化地完成软件开发,学会使用性能测试工具和单元测试优化程序

Github链接

https://github.com/moheng391/3123004161

PSP表格

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

模块接口的设计与实现

    在开发文本相似度计算模块时,我们需要设计一个高效、可扩展的接口,以便能处理不同类型的输入文本并计算它们的相似度。整个模块的设计主要包括以下几个部分:

1. 模块结构

    整个计算模块通过多个函数来组织,主要包括:

  • 文本预处理(preprocess_text):该函数负责对原始文本进行清洗和分词。它会去除标点符号、将文本转换为小写,并利用 jieba 进行中文分词。输出是处理后的文本,适合用于后续的相似度计算。

  • 相似度计算(calculate_tfidf_similarity):该函数使用 TF-IDF 算法来计算两个文本之间的相似度。它利用 sklearn 提供的 TfidfVectorizer 来提取文本的特征,并通过余弦相似度(Cosine Similarity)计算文本之间的相似度。关键部分是如何选择 ngram_range 和 min_df,这将直接影响模型的性能和准确性。

  • 文件读取(read_file):该函数负责读取外部文件,自动检测文件编码并返回文本内容。它利用 chardet 库来识别编码,确保能够处理不同编码格式的文件。

2. 功能关系与设计图

    模块中的几个主要函数互相协作,形成一个完整的工作流程:

  • 用户通过输入文件路径调用 read_file 函数,读取文件内容;
  • read_file 读取的文本通过 preprocess_text 进行预处理;
  • 经过预处理的文本会被传入 calculate_tfidf_similarity 函数进行相似度计算。
    关键函数(如 calculate_tfidf_similarity)的核心算法是 TF-IDF 和余弦相似度计算。

关键算法:

  • TF-IDF(词频-逆文档频率):这是自然语言处理中的经典算法,用于衡量词语对一个文本的重要性。通过计算词语在文档中出现的频率(TF)和它在整个语料库中出现的稀有度(IDF),我们能够准确提取出文本中的关键信息。

  • 余弦相似度:该方法用于度量两个文本向量之间的相似性。它将两个向量的夹角转化为相似度度量,从而能够评估两个文本内容的相似性。

3. 性能优化

    计算模块性能的优化是另一个重要的环节。我通过多次测试和分析,成功提高了模块的计算效率,特别是在处理大规模文本时。

性能改进思路:
优化文本预处理:原始的文本预处理过程中,由于文本需要进行多次分割和清洗,我们通过减少不必要的操作(例如,只进行必要的标点符号清除)来提高处理速度。

性能分析图:

4. 单元测试

    为了确保模块的功能正常运行,我编写了详细的单元测试,验证每个模块的正确性和健壮性。

测试函数:

test_preprocess_text:测试文本预处理功能是否能正确分词并去除标点。
test_calculate_tfidf_similarity:测试 TF-IDF 相似度计算函数是否能够返回合理的相似度值。
test_read_file:测试文件读取函数,确保能够正确读取文件内容。

测试数据构造:

    测试数据包括了正常的文本输入、空文本以及包含特殊字符的文本。这样可以验证函数的鲁棒性。

点击查看代码
import unittest
from main import preprocess_text, calculate_tfidf_similarity, read_file  # 确保 text_processing.py 存在class TestTextProcessing(unittest.TestCase):def test_preprocess_text(self):text = "这是一个测试文本。"processed_text = preprocess_text(text)self.assertEqual(processed_text, "这是 一个 测试 文本")def test_calculate_tfidf_similarity(self):text1 = "今天天气很好"text2 = "今天天气非常好"similarity = calculate_tfidf_similarity(preprocess_text(text1), preprocess_text(text2))self.assertGreater(similarity, 0.1)  # 避免 min_df 影响class TestFileHandling(unittest.TestCase):def test_read_file(self):with open("test.txt", "w", encoding="utf-8") as f:f.write("测试内容")file_content = read_file("test.txt")self.assertIn("测试内容", file_content)def test_file_not_found(self):with self.assertRaises(SystemExit):read_file("non_existing_file.txt")if __name__ == "__main__":unittest.main()

单元测试结果:

测试覆盖率:

5. 异常处理

    在开发过程中,我们设计了多种异常来处理文件读取、文本处理等可能遇到的错误情况。例如:

  • 文件未找到:当文件路径错误或文件不存在时,程序会抛出异常并终止执行。
  • 文件编码错误:当文件编码格式无法识别时,程序会提示用户并中止操作。

异常设计目标:

    每种异常的设计都考虑了常见的错误场景,确保程序能够在遇到问题时给出明确的提示信息,并优雅地终止。每个异常都会有相应的单元测试用例,确保在这些特殊情况下程序能够正常运行。

异常处理代码:

例如,文件未找到时抛出的异常:

点击查看代码
def read_file(file_path):""" 自动检测文件编码并读取文件内容 """try:# 以二进制模式读取文件的前10000字节with open(file_path, 'rb') as f:raw_data = f.read(10000)  # 读取文件前10000字节result = chardet.detect(raw_data)  # 使用chardet检测编码encoding = result['encoding']  # 获取检测到的编码# 使用检测到的编码重新打开文件并读取内容with open(file_path, 'r', encoding=encoding) as f:return f.read().strip()except FileNotFoundError as e:print(f"文件未找到: {file_path}, 错误: {e}")sys.exit(1)except UnicodeDecodeError as e:print(f"文件编码错误: {file_path}, 错误: {e}")sys.exit(1)except OSError as e:print(f"操作系统错误: {file_path}, 错误: {e}")sys.exit(1)except Exception as e:print(f"读取文件失败: {file_path}, 错误: {e}")sys.exit(1)

测试案例:

点击查看代码
def test_file_not_found(self):with self.assertRaises(SystemExit):read_file("non_existing_file.txt")

总结

    在本博客中,我们介绍了计算模块的设计与实现过程,包括算法的选择、性能优化、单元测试和异常处理。通过合理的架构设计和优化,我们的计算模块能够高效处理大规模文本数据,并且通过严格的单元测试确保功能的正确性和健壮性。同时,通过详细的异常处理设计,我们保证了系统在出现错误时能够优雅地退出并给出清晰的提示信息。

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

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

相关文章

换到Edge?我有几点不满意。

前言 向来我都是用百分浏览器这个套壳Chrome,然而在迁移的时候由于网络的原因,存在各种不方便,于是我试着去用Edge,虽然之前也在用,但从来没作为主力使用过。 不足之处 收藏功能一塌糊涂 当我右键某个书签文件夹时,选择添加该网页,他居然要我重新选书签所在的文件夹。更…

【端口转发】 lcx工具

lcx是一个居于socket套接字实现的端口转发工具,有windows和linux两个版本,windows叫lcx.exe,linux叫portmap 一个正常的socket隧道必须具备两端:服务器端和客户端 windows下: 1、转发端口: lcx.exe -slave 公网IP 端口 内网IP 端口2、监听端口: lcx.exe -listen 转发端口…

Manus验证码生成器

Manus验证码生成器 Manus 是Monica团队推出的全球首款通用型AI助手,能将想法转化为行动:不止于思考,更注重成果。 一、关注公众号二、从底部菜单中进入三、使用Manus验证码生成器本文来自博客园,作者:方倍工作室,转载请注明原文链接:https://www.cnblogs.com/txw1958/p/…

洛谷 P1111 修复公路(并查集)

并查集这题如果想到是并查集就很简单了,按t来排序一下就好了AcCode: #include<bits/stdc++.h> using namespace std; struct way{int v1, v2, t; }; bool Cmp(const way &a, const way &b){return a.t < b.t; }vector<way> w; int unionList[1010];int…

实验1 C语言输入输出和简单程序应用编程

任务1: 源代码:1 #include <stdio.h>2 #include <stdlib.h>3 4 int main()5 {6 printf(" o \n");7 printf("<H>\n");8 printf("I I\n");9 printf(" o \n"); 10 printf("<H>\n&quo…

某考核wp

就这样抱着胸中的苦痛,前往没有你的未来My Blog robots.txt进level1.php <?php error_reporting(0); highlight_file(__FILE__); $text = $_GET["text"]; $file = $_GET["file"]; if(isset($text)&&(!preg_match("/php/",$text))…

L1G3-浦语提示词工程实践

L1G3-浦语提示词工程实践 1. 提示工程 1.1 什么是提示词 根据大模型的应用领域,可以把提示词分为五类。其中,“文本生成”提示词是最基础最重要的。 提示词是调用生成式AI能力的基础接口。提示词调用生成式AI能力的两个阶段如下:大模型词元预测的原理:获取输入文本,模型处…

【Azure Storage Account】利用App Service作为反向代理后续 ---- 隐藏 SAS Token

问题描述前文提要:【Azure Storage Account】利用App Service作为反向代理, 并使用.NET Storage Account SDK实现上传/下载操作在前几天的实验中,使用了App Service作为反向代理,把默认的存储账号的域名修改为自定义的域名后,在 .NET Storage Account SDK中实现常规的上传/…

opera打不开任何网页

正文 opera的外观非常惊艳,给我一种新颖的感觉,直到我发现任何网页都打不开。 找到下面这个文件 C:\Users\acer\AppData\Roaming\Opera Software\Opera Stable\Local State使用你喜欢的任何编辑器打开,比如vscode。 搜索country修改如下字段 {"country":"US&…

Easyexcel(6-单元格合并)

EasyExcel在数据导出时,自定义单元格合并功能极大地增强了数据的可读性和组织性。通过 WriteSheet 对象,用户可以轻松实现单元格合并,指定合并区域的起始和结束行列,从而将相关信息整合在一起。注解 @ContentLoopMerge 用于设置合并单元格的注解,作用于字段上eachRow:每隔…

7-8-10阅读 91-129

7 - P91 けさ図書館へ行きました。図書館で太郎ちゃんに会いました。太郎ちゃんといっしょにビデオを見ました。わたしは旅行の本を借りました。あしたは日曜日です。あさ旅行の本を読みます。ごごデパートへ行きます。はなを買います。ははの誕生日のプレゼントです。 中文翻…

力扣第118题-杨辉三角

题目描述 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。示例 1:输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2:输入: numRows = 1 输出: [[1]]提示: 1 <= numRows <=…