第一次编程作业

第一次编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13477
这个作业的目标 实现一个3000字以上论文查重程序
Github链接 https://gitee.com/luoluck123/engineering/tree/3123004800

PSP表格

PSP Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 80 90
· Estimate · 估计任务时间 80 90
Development 开发 1100 1220
· Analysis · 需求分析(含学习新技术) 150 210
· Design Spec · 生成设计文档 100 120
· Design Review · 设计复审(同伴评审) 60 50
· Coding Standard · 代码规范(制定/遵循) 40 40
· Design · 具体设计(模块划分、算法设计) 240 260
· Coding · 具体编码 240 270
· Code Review · 代码复审(自审+工具检查) 90 90
· Test · 测试(单元测试+集成测试+性能测试) 180 180
Reporting 报告 210 210
· Test Report · 测试报告(覆盖率、性能分析) 120 120
· Size Measurement · 计算工作量(代码行数、文档页数) 30 30
· Postmortem & Process Improvement Plan · 事后总结与过程改进计划 60 60
合计 1390 1520

算法摘要

该论文查重算法基于n-gram与Jaccard相似度计算,首先对原文和待检测文本进行统一预处理:去除所有非中文字符、英文及数字以外的噪声字符,并将文本按语言单元切分(中文拆为单字,英文和数字保留完整形式);接着分别提取两篇文档的2-gram和3-gram特征集合,捕捉局部语言结构;最后通过Jaccard相似度衡量两集合的重叠程度,并结合不同n-gram的权重(2-gram占40%、3-gram占60%)计算最终重复率,有效检测文本间的内容重叠情况。

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

1.模块划分

模块文件 核心函数/类 功能描述
file_input.py read_file_from_args() 解析命令行参数,获取三个文件路径
file_processing.py file_read(file_path) 读取文件内容,处理多种文件异常
file_write(file_path, data) 写入结果到文件(追加模式)
file_normalize(raw_text) 文本清洗,去除非中英数字字符
split_chinese_english_number(text_segments) 按中英文数字进行分词处理
generate_ngram(tokens, n) 生成n-gram特征集合
FileProcessor 封装文件处理全流程的面向对象接口
main.py jaccard_similarity(first_set, second_set) 计算两个集合的Jaccard相似度
document_similarity(file_processor) 综合计算文档相似度并输出结果
main() 程序入口,串联各模块执行完整流程

模块功能说明

  • file_input.py:输入处理模块,负责命令行参数解析
  • file_processing.py:核心处理模块,包含文件IO、文本预处理、特征提取等功能
  • main.py:业务流程模块,实现相似度计算算法和主流程控制

2.接口设计与实现分析

接口名称 核心功能 输入参数 输出 实现技术 异常处理
read_file_from_args 解析命令行参数获取文件路径 无(依赖sys.argv) [orig_path, copy_path, output_path] argparse.ArgumentParser 参数格式错误时系统退出
file_read 读取文本文件(UTF-8编码) file_path: str 文件内容字符串(失败返回None) 上下文管理器with open FileNotFoundError, PermissionError, UnicodeDecodeError等
file_normalize 文本清洗、分词处理 raw_text: str 分词后的词语列表 正则表达式清洗+中英文数字分割 无显式异常,空文本返回空列表
generate_ngram 生成n-gram特征集合 tokens: list, n: int n-gram字符串集合 滑动窗口算法+集合去重 文本过短时返回空集合
jaccard_similarity 计算两集合的Jaccard相似度 first_set: set, second_set: set 相似度浮点数(0.0-1.0) 集合交集并集运算 空集合处理(返回1.0)
document_similarity 综合计算文档相似度 file_processor: FileProcessor 无(结果写入文件) 2-gram/3-gram加权融合 依赖底层组件异常处理
FileProcessor.init 自动化处理流程初始化 file_paths: list FileProcessor实例 门面模式封装处理流程 文件读取失败时部分属性为空
main 串联全流程控制 无(依赖命令行参数) 无(控制台输出结果) 模块协调+流程调度 try-finally确保性能分析执行

3.关键函数流程图

3.1 file_processing.py 文本预处理流程流程图

deepseek_mermaid_20250923_a5168c

3.2 main.py 流程图

3.4.1 主程序流程

deepseek_mermaid_20250923_deb9a0

3.4.2 相似度计算流程

deepseek_mermaid_20250923_96aa3c

4.算法关键与独到之处

4.1 n-gram + Jaccard相似度原理

n-gram:将文本分割为连续n个字符/词语的序列,捕捉局部语言模式。
Jaccard相似度:通过集合交集与并集的比例衡量文本重叠度,公式:相似度 = |A∩B| / |A∪B|

4.2 独到优化

混合语言自适应分词:对中文按字符分割,英文数字保持完整,完美处理代码、论文中的混合语言内容;

长度自适应n-gram策略:文本>1000字符时启用3-gram(权重0.6),短文本仅用2-gram,平衡精度与效率;

计算模块接口部分的性能改进

用 cProfile 定位耗时瓶颈

运行
image


image

性能分析

1. 最耗时的操作

文件系统操作:nt.stat 调用占用了 0.017 秒(17毫秒),调用 388 次

文件读取:BufferedReader.read 占用了 0.016 秒(16毫秒),调用 76 次

动态模块创建:_imp.create_dynamic 占用了 0.015 秒(15毫秒),调用 7 次

2. 模块导入开销

从分析结果看,大部分时间花在了模块导入上:

mock.py 导入:0.082 秒

base_events.py 导入:0.066 秒

sst.py 导入:0.025 秒

_base.py 导入:0.009 秒

计算模块部分单元测试展示

测试用例设计

image

image

image

image

image

image

image

image

最终覆盖率

image

计算模块异常处理说明

file_processing.py

image
image

posted @ 2025-09-23 23:13  luoluck  阅读(21)  评论(0)    收藏  举报