第一次个人编程作业
个人作业
| 这个作业属于哪个课程 | 软件工程 |
|---|---|
| 这个作业要求在哪里 | |
| 这个作业的目标 | 熟悉github以及设计论文查重算法并测试算法,使用PSP表格记录自己在程序开发上的时间 |
一、github:3121005322
需求:
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
二、预计开发时间:
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 10 | |
| · Estimate | · 估计这个任务需要多少时间 | 10 | |
| Development | 开发 | 220 | |
| · Analysis | · 需求分析 (包括学习新技术) | 20 | |
| · Design Spec | · 生成设计文档 | 10 | |
| · Design Review | · 设计复审 | 10 | |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | |
| · Design | · 具体设计 | 20 | |
| · Coding | · 具体编码 | 120 | |
| · Code Review | · 代码复审 | 10 | |
| · Test | · 测试(自我测试,修改代码,提交修改) | 20 | |
| Reporting | 报告 | 60 | |
| · Test Repor | · 测试报告 | 25 | |
| · Size Measurement | · 计算工作量 | 20 | |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 15 | |
| ----------------- | · 合计 | 290 |
三、计算模块接口的设计与实现过程:
主要函数包括:
preprocess_and_tokenize(text):对文本进行预处理和分词,利用jieba进行分词处理。

calculate_cosine_similarity(text1, text2):计算两个文本之间的余弦相似度,包括词频向量的构建和余弦相似度的计算。

main(orig_file,plagiarized_file,answer_file):主函数,负责读取原文、抄袭版论文,计算相似度并将结果写入答案文件。

这些函数的关系是main函数是主调用函数,依赖于preprocess_and_tokenize和calculate_cosine_similarity函数来完成相似度计算的功能
流程图:

算法的关键:
1.预处理和分词对于文本相似度计算是关键的第一步,jieba分词在中文文本处理中常用且效果良好。
2.词频向量的构建:构建两个文本的词频向量,可以很好地表示文本的特征,进而计算余弦相似度。
3.余弦相似度的计算:通过向量化文本表示,利用余弦相似度计算文本之间的相似程度。
该算法的独到之处:
简单而高效:算法采用了简单而直观的文本处理流程,包括预处理、分词和余弦相似度计算。这种简单而高效的设计使得算法易于理解、实现和维护。
支持中文文本:算法使用了jieba分词库,能够很好地处理中文文本的分词问题,充分发挥了jieba的强大分词能力,适用于中文文本的相似度计算。
余弦相似度计算:使用余弦相似度作为文本相似度的度量方法。余弦相似度是一种广泛应用于文本相似度计算的方法,能够很好地衡量文本的相似程度。
可扩展性:尽管该算法目前实现了基本的文本相似度计算,但代码结构清晰、模块化,易于扩展和定制。可以根据需求添加更复杂的特征抽取方法或相似度计算方法。
命令行接口:算法提供了命令行接口,方便用户通过命令行传递文件路径进行相似度计算,使得算法可以很方便地嵌入到其他应用或流程中。
算法的性能:
在改进性能上花费的时间为:30min,
改进算法性能的思路:
算法复杂度分析:评估现有算法的时间复杂度和空间复杂度。了解算法的复杂度可以帮助你确定哪些部分需要优化。
使用更高效的数据结构:选择合适的数据结构来存储文本信息,以便更高效地进行处理。例如,使用哈希表来存储词频信息,可以快速查找词频。
并行化处理:利用多核处理器的并行计算能力,将任务分解为子任务并同时处理,提高计算效率。
优化瓶颈代码:通过代码剖析,确定性能瓶颈所在,然后集中精力优化瓶颈部分的代码,如循环中的重复计算或不必要的操作。
缓存优化:尽量减少IO操作,通过缓存中间结果以减少重复计算,尽可能减少内存读取写入等,以提高效率。
算法优化:考虑针对特定应用场景优化算法,可能有更高效的相似度计算算法适用于特定的文本特征。
批处理:考虑对多个文本进行批处理,减少启动程序和IO的时间,提高处理效率。
性能分析图:

消耗最大的函数:

测试:
部分测试代码截图:

部分测试函数说明:
test_single_word_texts: 测试含有单个单词的文本的相似度是否为1.0。
test_single_word_different_texts: 测试含有不同单词的文本的相似度是否为0.0。
test_texts_with_multiple_languages: 测试含有多种语言的文本的相似度是否为0.0。
测试结果截图:

异常处理:
文件不存在或无法读取异常 (FileNotFoundError): 当读取原文文件或抄袭版论文文件时,可能会出现文件不存在或无法读取的情况。
文件读取编码异常 (UnicodeDecodeError): 在以指定编码方式读取文件时,可能会遇到无法解码的异常情况。
代码:
点击查看代码
except FileNotFoundError as e:
print(f"Error: {e}. Please provide valid file paths.")
except UnicodeDecodeError as e:
print(f"Error: Unable to decode file with specified encoding. {e}")
except ValueError as e:
print(f"Error: {e}")
except Exception as e:
print(f"An unexpected error occurred: {e}")
完善PSP表格,记录各个模块花的时间
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 10 | 10 |
| · Estimate | · 估计这个任务需要多少时间 | 10 | 10 |
| Development | 开发 | 220 | 181 |
| · Analysis | · 需求分析 (包括学习新技术) | 20 | 20 |
| · Design Spec | · 生成设计文档 | 10 | 8 |
| · Design Review | · 设计复审 | 10 | 5 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 1 |
| · Design | · 具体设计 | 20 | 6 |
| · Coding | · 具体编码 | 120 | 105 |
| · Code Review | · 代码复审 | 10 | 6 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 20 | 30 |
| Reporting | 报告 | 60 | 65 |
| · Test Repor | · 测试报告 | 25 | 30 |
| · Size Measurement | · 计算工作量 | 20 | 5 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 15 | 30 |
| ----------------- | · 合计 | 290 | 256 |

浙公网安备 33010602011771号