第一次个人编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience
GitHub地址 https://github.com/fc0822/fc/tree/main/3123004226
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13477
这个作业的目标 完成个人项目,实现查重功能

一、PSP表格

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

二、模块结构分析

核心功能与实现逻辑

  1. 文本读取:通过readFile方法读取文件内容,使用UTF-8编码确保中文正确处理
  2. 文本预处理:标准化文本格式,包括转换小写、去除标点符号等
  3. 分词处理:分别实现中英文分词逻辑
  4. 相似度计算:基于词频向量的余弦相似度算法
  5. 结果输出:将相似度结果以百分比形式写入指定文件

代码结构分析

1. 文本预处理模块

  • preprocessText方法负责文本清洗:
    • 将文本转为小写,实现大小写不敏感比较
    • 使用正则表达式PUNCTUATION_PATTERN去除所有标点符号
    • 合并多个空格为一个,统一文本格式

2. 分词模块

  • segmentText:根据文本是否包含中文自动选择分词策略

  • segmentChinese:中文分词(简单实现为单字分词)

  • segmentEnglish:英文分词(按空格分割)

    注意:当前中文分词是简单实现,实际应用中建议替换为专业分词库如IKAnalyzer,以获得更准确的词语分割结果。

3. 相似度计算模块

实现了余弦相似度算法:

  1. 计算两篇文本的词频映射(getFrequencyMap
  2. 构建包含所有独特词的集合
  3. 计算两个词频向量的点积和模长
  4. 通过公式点积/(模长1×模长2)计算余弦相似度

4. 文件操作模块

  • readFile:读取指定路径文件内容
  • writeResult:将相似度结果格式化(保留两位小数的百分比)后写入文件

5. 主程序入口

  • 验证命令行参数格式(需要3个参数:原文路径、抄袭文路径、结果路径)
  • 调用各模块完成整个查重流程
  • 异常处理:捕获并处理文件操作可能出现的IO异常

优点与特点

  1. 多语言支持:同时支持中文和英文文本的相似度检测
  2. 编码处理:明确使用UTF-8编码,确保中文等多语言文本正确处理
  3. 异常处理:包含基本的错误处理和参数验证
  4. 可扩展性:分词模块设计为独立方法,便于替换为更专业的分词实现

性能分析

image

image

三、关系图分析

一、模块关系图(组件关联)

5个核心模块,模块间通过“调用”或“数据传递”形成依赖关系,具体如下:

核心模块 包含的关键方法 主要功能 依赖的其他模块
1. 入口与控制模块 main 参数验证、流程调度、异常捕获 所有其他模块
2. 文件操作模块 readFilewriteResult 读取文本文件、写入相似度结果 无(基础工具模块)
3. 文本预处理模块 preprocessText 文本小写化、去标点、合并空格 无(基础工具模块)
4. 分词模块 segmentTextsegmentChinesesegmentEnglish 自动选择分词策略、中英文分词 文本预处理模块(依赖预处理后的文本)
5. 相似度计算模块 calculateSimilaritygetFrequencyMap 词频统计、余弦相似度计算 分词模块(依赖分词结果)

模块关系可视化

image

二、数据流程图(核心逻辑链路)

以“输入文件 → 输出相似度结果”为核心,数据在各模块间的流转过程如下,关键节点已标注数据格式:

  1. 输入阶段

    • 触发:main方法接收命令行参数(原文路径、抄袭文路径、结果路径)
    • 执行:调用readFile读取文件,返回String类型的文本内容(如原文内容origContent、抄袭文内容copyContent
  2. 预处理阶段

    • 输入:原始文本String
    • 执行:preprocessText处理文本,输出标准化文本(小写、无标点、单空格分隔,如“hello world”)
  3. 分词阶段

    • 输入:标准化文本String
    • 执行:
      • segmentText判断文本语言(含中文则调用segmentChinese,否则调用segmentEnglish
      • 输出:List<String>类型的分词结果(中文为单字列表,如["我","爱","编","程"];英文为单词列表,如["hello","world"])
  4. 相似度计算阶段

    • 输入:两篇文本的分词结果List<String>
    • 执行:
      1. getFrequencyMap将分词列表转为Map<String, Integer>(词频映射,如{"我":1,"爱":1})
      2. 构建“所有独特词集合”,计算词频向量的点积模长
      3. 用余弦公式计算相似度,返回double类型结果(如0.85表示85%相似)
  5. 输出阶段

    • 输入:double类型的相似度结果
    • 执行:writeResult将结果格式化为“百分比字符串”(如“85.00%”),写入指定路径的文件

数据流程可视化

image

四、测试代码分析

1. 测试目标

测试类围绕 Main 的主程序展开,验证其核心功能包括:

  • 参数合法性校验
  • 文件读取(支持UTF-8编码)
  • 文本预处理(清洗、标准化)
  • 分词(中英文处理)
  • 余弦相似度计算
  • 结果写入(百分比格式)
  • 完整流程的正确性

2. 核心测试方法解析

(1)testParameterValidation:参数验证测试

  • 测试场景:检查程序对命令行参数的合法性校验。
    • 参数不足(2个参数,预期应为3个:原始文件、复制文件、结果文件)。
    • 参数过多(4个参数)。
  • 验证方式:捕获程序输出的错误信息,确认包含“参数错误!正确格式”提示。

(2)testReadFile:文件读取功能测试

  • 测试场景:验证文件读取的正确性,尤其是UTF-8编码的支持。
    • 创建含中英文、特殊字符的临时文件(内容:测试UTF-8编码:Hello World! 123@#$%)。
    • 调用 Main.readFile 读取文件,验证读取内容与写入内容一致(含换行符)。

(3)testReadNonExistentFile:异常场景测试

  • 测试场景:读取不存在的文件时,是否正确抛出 IOException
  • 验证方式:通过 @Test(expected = IOException.class) 注解确认异常抛出。

(4)testTextPreprocessing:文本预处理测试

  • 测试场景:验证文本清洗逻辑(标点符号、大小写、空白字符处理)。
    • 标点符号:去除 , ! 。 ... 等,英文转为小写(如 Hello!hello)。
    • 空白字符:合并多个空格、制表符、换行符为单个空格(如 \tJava\nPython C++java python c++)。

(5)testWordSegmentation:分词功能测试

  • 测试场景:验证中英文分词逻辑(通过相似度计算间接验证)。
    • 中文:按单字分词(如 我爱中国我 爱 中 国 相似度为1.0)。
    • 英文:按空格分词(忽略多余空白,如 hello worldhello world 相似度为1.0)。
    • 混合文本:中英文分别按各自规则分词(如 Java编程java 编 程 相似度为1.0)。

(6)testCalculateSimilarity:余弦相似度计算测试

  • 测试场景:验证基于词频向量的余弦相似度计算逻辑。
    • 完全相同文本:相似度为1.0。
    • 完全不同文本:相似度为0.0。
    • 部分相似文本:
      • 中文示例:我爱中国北京我爱中国上海 共享4个词,相似度约为0.6667。
      • 英文示例:a b c d ea b c 共享3个词,相似度约为0.7746。
    • 边界情况:空文本与任何文本的相似度为0.0;标点和大小写不影响结果(如 Hello, World!hello world 相似度为1.0)。

(7)testWriteResult:结果写入功能测试

  • 测试场景:验证相似度结果是否按百分比格式写入文件(保留两位小数)。
    • 输入相似度 0.8567,验证写入内容为 85.67%

(8)testFullProcess:完整流程测试

  • 测试场景:模拟真实使用场景,验证从文件读取、处理到结果输出的全流程。
    • 创建原始文件和复制文件(内容高度相似,仅大小写和少数词不同)。
    • 调用 Main.main 执行完整逻辑,验证结果文件中相似度百分比>90%(符合预期)。
posted @ 2025-09-22 19:32  fc0822  阅读(5)  评论(0)    收藏  举报