第一次个人作业

news/2024/11/15 15:43:03/文章来源:https://www.cnblogs.com/LHH778/p/18410897
这个作业属于哪个课程 班级的链接
这个作业要求在哪里 作业要求的链接
这个作业的目标 实现论文查重算法,并对代码进行性能分析、单元测试,使用PSP表

GitHub链接

一、PSP表

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

二、计算模块的设计与实现

1、总体设计

流程图

2、详细设计

DataPreprocessing类

read_file 函数:读取文件数据,发生异常则抛出对应的异常并返回-1。
preprocess_data 函数:对数据进行全角转半角、去除HTML标签、保留中文字符操作,发生异常则抛出对应的异常并返回空字符.
to_dbc 函数:对数据进行全角转半角操作。

SimHashService类

get函数:使用jieba分词,过滤标点符号或无效字符,过滤标点符号或无效字符,按权重逐位计算哈希值,将统计结果转换成0/1字符串。

关键算法流程图!
get_word_hash 函数:计算词哈希值。
get_word_weight 函数:定义词的权重。
hamming_distance 函数:计算汉明距离。

SimilarityChecker类:

check_similarity函数:计算两篇文章的SimHash后计算汉明距离,根据汉明距离计算论文相似度。

三、性能改进

1、性能分析

这里我使用PyCharm自带的Profile功能进行性能分析。

从上图中可以看到耗时最长的是只执行一次的Python内置的,而我编写的代码耗时最长的是get函数,执行10914次,耗时2ms。

2、改进思路

可以增加对生成processed_text1, processed_text2的合理性判断,减少 checker.check_similarity方法的调用,因为get方法耗时很长,而get方法就是checker.check_similarity调用的。

四、单元测试

思路:

使用unittest库,共设计25个函数(分4个类TestDataPreprocessing、TestGetWordHash、TestHammingDistance、TestSimilarityChecker)来对6个关键函数进行测试,尽可能地对我所构建的论文查重算法进行测试,保证代码健壮性、准确性、通用性。

数据预处理单元测试代码展示:

    def test_preprocess_data_with_valid_input(self):"""测试 preprocess_data 方法,包含 HTML 标签和非中文字符"""text_content = "<html>这是一个测试! 123</html>"result = DataPreprocessing.preprocess_data(text_content)expected = "这是一个测试"  # 去除HTML标签和非中文字符后的结果self.assertEqual(result, expected)def test_preprocess_data_with_empty_input(self):"""测试 preprocess_data 方法,输入为空字符串"""text_content = ""result = DataPreprocessing.preprocess_data(text_content)self.assertEqual(result, "")def test_preprocess_data_with_all_non_chinese(self):"""测试 preprocess_data 方法,输入不包含中文字符"""text_content = "Hello, World! 123"result = DataPreprocessing.preprocess_data(text_content)self.assertEqual(result, "")def test_to_dbc_with_full_width_characters(self):"""测试 to_dbc 方法,将全角字符转换为半角"""input_str = "ABCabc123!@#"result = DataPreprocessing.to_dbc(input_str)expected = "ABCabc123!@#"self.assertEqual(result, expected)def test_to_dbc_with_mixed_characters(self):"""测试 to_dbc 方法,混合全角和半角字符"""input_str = "Hello ABC"result = DataPreprocessing.to_dbc(input_str)expected = "Hello ABC"self.assertEqual(result, expected)def test_read_file(self):"""测试 read_file 方法"""file_path = "D:\PyCharmCode\SimHash\\3122004446\DataSet\测试用例\DataPreprocessing.txt"result = DataPreprocessing.read_file(file_path)expected = "《软 件工程!,123"self.assertEqual(result, expected)def test_read_file_err1(self):"""测试 read_file 方法 不存在次文件"""file_path = "D:\PyCharmCode\SimHash\\3122004446\DataSet\测试用例\DataPreprocessing_err1.txt"result = DataPreprocessing.read_file(file_path)# print(f"result7:{result}")expected = -1self.assertEqual(result, expected)

单元测试结果截图

覆盖率

这里使用Python的coverage库进行分析。
代码文件覆盖率截图:

各个函数覆盖率截图:

各个类覆盖率截图:

五、异常处理

这里我用unittest库对各个单元进行异常测试。

异常一

read_file函数异常:在读取文件时找不到目标文件或无法正常打开目标文件时,异常时抛出异常提示并返回-1。
测试样例:

    def test_read_file_err1(self):"""测试 read_file 方法 不存在次文件"""file_path = "D:\PyCharmCode\SimHash\\3122004446\DataSet\测试用例\DataPreprocessing_err1.txt"result = DataPreprocessing.read_file(file_path)# print(f"result7:{result}")expected = -1self.assertEqual(result, expected)

结果截图:

异常二

to_dbc函数异常:当非字符串输入、非常大的字符串、特殊字符、外部环境问题、编码问题时,异常时抛出异常提示并返回输入内容。
测试样例:

class TestDataPreprocessing(unittest.TestCase):def test_to_dbc_with_mixed_characters(self):"""测试 to_dbc 方法,混合全角和半角字符"""input_str = Noneresult = DataPreprocessing.to_dbc(input_str)expected = Noneself.assertEqual(result, expected)

结果截图:

异常三

get_word_hash函数:当非字符串输入、索引越界、特殊字符、编码问题、极端长度的字符串时,异常时抛出异常提示并返回0。
测试样例:

class TestGetWordHash(unittest.TestCase):def test_empty_string(self):# 测试空字符串输入result = SimHashService.get_word_hash(123)self.assertEqual(result, BIGINT_0)

结果截图:

异常四

get_word_weight函数:当输入数字时,抛出异常提示并返回0。
测试样例:

class TestGetWordHash(unittest.TestCase):def test_empty_string(self):# 测试空字符串输入result = SimHashService.get_word_weight(111)self.assertEqual(result, BIGINT_0)

结果截图:

异常五

hamming_distance函数:当输入的值不是字符串时,抛出异常提示并返回-1。
测试样例:

class TestHammingDistance(unittest.TestCase):def test_both_none(self):# 测试两个输入都为 Noneresult = SimHashService.hamming_distance("110", 110)self.assertEqual(result, -1)

结果截图:

六、总结

这是我第一次按照PSP表写的程序,从前期的预估安排时间、学习新知识,到期间的编写程序,再到后期测试程序与撰写报告。体会到了PSP表对于提高软件开发人员个人生产效率和产品质量的作用,也接触到了unittest、coverage、profile等测试分析的方法,是一次难忘的编程经理。

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

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

相关文章

mybatis exists 中使用代替in关键字

使用场景,in适合数据量小的时候,exists适合数据量大的时候。<if test="torqueRecordPageDTO.vinList != null and torqueRecordPageDTO.vinList.size >0">and exists (select 1 from (<foreach collection="torqueRecordPageDTO.vinList" it…

图与网络——TSP问题精解

旅行商问题(Travelling Salesman Problem, TSP)是组合优化领域中的经典问题之一。TSP的概念最早可以追溯到18世纪,瑞士数学家欧拉在解决柯尼斯堡七桥问题时首次提出了关于图中遍历的问题。不过,作为一个优化问题,TSP在19世纪才开始形成系统的研究。1920年代,TSP被德国数学…

[NLP/AIGC] 大语言模型:零一万物

1 概述:零一万物 - 首款开源中英双语大模型 公司背景公司名称:零一万物(01.AI) 创始人:李开复博士(知名投资人、创新工场董事长兼CEO)产品介绍产品名称:Yi 系列大模型Yi-6B:数据参数量为60亿的双语(英文/中文)开源模型 Yi-34B:数据参数量为340亿的双语(英文/中文)…

jackson 原生反序列化触发 getter 方法

jackson 原生反序列化触发 getter 方法jackson的POJONode方法可以任意调用getterjackson序列化会任意调用getter分析 jackson 序列化会调用任意 getter 方法,jackson 反序列化也会任意调用 getter ,这两个都不需要多说什么了,在前面的 jackson 反序列化中的 TemplatesImpl 链…

urllib发送get请求_中文传参问题

GET请求是HTTP协议中的一种基本方法,当需要在GET请求中传递中文参数时需要额外对中文进行编码(英文不需要),因为url中只能包含ascii字符。 可以使用urllib.parser.urlencode()或urllib.parse.quote()方法对中文转码。 详细查官方文档: https://docs.python.org/3.12/libra…

jackson 反序列化学习

jackson 反序列化学习 jackson 介绍 Jackson 是一个用于处理 JSON 数据的开源 Java 库。Spring MVC 的默认 json 解析器便是 Jackson。 Jackson 优点很多。 Jackson 所依赖的 jar 包较少,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比…

LeetCode算法—递归

纵有疾风起;人生不言弃!一:递归 1、定义:函数直接或者间接的调用自己 2、四个要素 (1)接受的参数 (2)返回的值 (3)终止条件 (4)如何拆解 二:LeetCode 509 斐波那契数列 def func(n):if n<2:return nelse:return func(n-1)+func(n-2)n=int(input()) print(func(…

2024年9月最新Youtube转WAV高质量音频最新教程

​1.利用在线转换工具(最推荐的一种方式): YoutubeToWAV:打开浏览器,访问 https://www.youtubetowav.cc/的官方网站。在 YouTube 网站上找到您想要转换的视频,复制该视频的链接。回到网页,将复制的 YouTube 视频链接粘贴到指定的输入框中。点击Convert默认为audio标签的格…

[GDOUCTF 2023]ez_ze!

这题是一个jinja2的ssti模板注入,经过测试过滤了 _ {{}} . [] os popen getitem 输入{% print(lipsum|string|list) %}或者{% print(config|string|list) %}从这里面获取我们需要的字符 获取下划线和空格 {% set pop=dict(pop=1)|join %} {% set xia=(lipsum|string|list)|at…

dc-4

靶机下载地址:dc-4 找靶机 nmap -sV 192.168.6.0/24查看一下端口服务很明显就只是一个简单的登录框 我们爆破一下 最终得到用户名:admin 密码:happy 进去看看怎么个事很明显是一个选择既定的命令进行命令执行 我们可以抓包然后即可使用我们自己设计的命令直接拿shell然后再实现…

java方法:什么是方法?

java方法是语句的集合,它们在一起执行一个功能:方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 例如:即 ______()是方法 设计方法的原则:方法的本意时功能块,就是实现某个功能块,就是实现某个功能的语句块的集合,所以…

pediatrics_llm_qa:儿科问诊小模型

项目简介 本项目开源了基于儿科医疗指令微调的问诊模型:pediatrics_llm_qa(GitHub - jiangnanboy/pediatrics_llm_qa),目前模型的主要功能如下:智能问诊:问诊后给出诊断结果和建议。更新[2024/09/11] 开源了基于Qwen2-1.5B-instruct lora指令微调的儿科问诊模型开源模型模型…