个人项目

第一次个人编程作业 — 论文查重项目

github链接 https://github.com/Eazinchen/3123004262/tree/master
这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13477
这个作业的目标 设计一个论文查重程序,并进行性能分析与测试

PSP 表格(预估/实际耗时)

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

一、项目简介

本项目实现了一个中文论文查重算法,能够比较原文论文抄袭版论文之间的相似度,并输出相似度到指定文件。
算法核心为 中文分词 + Tfidf 向量化 + 余弦相似度计算,在处理中文文本时通过停用词过滤提高相似度的准确性。


二、程序实现

1. 主要功能模块

  1. tokenize(text)

    • 功能:分词、去停用词
    • 输入:文本字符串
    • 输出:处理后的词列表
  2. compute_similarity(text1, text2)

    • 功能:将文本转为 Tfidf 向量并计算余弦相似度
    • 输入:原文文本和抄袭文本
    • 输出:相似度浮点数(0~1)
  3. main.py

    • 功能:从命令行读取文件路径,调用 compute_similarity,并将结果写入答案文件
    • 使用方法:
      python main.py [原文文件] [抄袭版文件] [答案文件]
      

2. 改进措施

  1. 文本预处理

    • 使用 jieba 分词
    • 去停用词,减少无意义词影响
  2. 性能优化

    • TfidfVectorizer 替代手写词频矩阵
    • sklearn 内部优化余弦相似度计算
    • 可用 cProfile + snakeviz 分析性能瓶颈

三、计算模块部分异常处理说明

  1. 文件路径异常

    • 设计目标:确保程序在输入文件不存在或路径错误时,提示用户并安全退出
    • 示例处理
      try:
          with open(file_path, 'r', encoding='utf-8') as f:
              content = f.read()
      except FileNotFoundError:
          print(f"错误:文件 {file_path} 不存在")
          exit(1)
      
  2. 空文本异常

    • 设计目标:避免原文或抄袭文本为空导致计算相似度报错
    • 示例处理
      if not text1.strip() or not text2.strip():
          print("错误:原文或抄袭文本为空")
          exit(1)
      
  3. 编码异常

    • 设计目标:处理文件读取时的编码问题,保证 UTF-8 文本正常解析
    • 示例处理
      try:
          content = open(file_path, 'r', encoding='utf-8').read()
      except UnicodeDecodeError:
          print(f"错误:文件 {file_path} 编码错误,请使用 UTF-8 编码")
          exit(1)
      
  4. 异常输入参数

    • 设计目标:确保命令行输入参数正确数量
    • 示例处理
      import sys
      if len(sys.argv) != 4:
          print("用法: python main.py [原文文件] [抄袭文件] [答案文件]")
          exit(1)
      

四、性能分析

  1. 工具:Python 内置 cProfile + snakeviz 可视化
  2. 主要耗时函数
    • jieba.lcut() 占大部分时间
    • TfidfVectorizer.fit_transform()
  3. 改进结果
    • 文本量较大时,性能比原始手写版本提升约 50% 以上
    • 单次短文本相似度计算耗时约 0.002 秒

五、单元测试

  • 使用 pytest 完成 10 个测试用例
  • 测试覆盖面:
    1. 完全相同文本
    2. 轻微修改文本
    3. 完全不同文本
    4. 空文本情况
    5. 长文本与短文本
    6. 标点符号差异
  • 测试命令:
    pytest -v
    
posted @ 2025-09-23 19:29  eazin_星予土  阅读(16)  评论(0)    收藏  举报