第一次个人编程作业
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34 |
| ----------------- | --------------- |
| 这个作业要求在哪里|https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229 |
| 这个作业的目标 |论文查重 |
代码链接:https://gitee.com/FWC2G3W8UR/3122004564-first
- 代码组织
主类 (PaperChecker): 负责读取命令行参数,调用查重逻辑,并输出结果。
查重工具类 (SimilarityChecker): 包含具体的查重算法,如基于最长公共子序列(LCS)、余弦相似度等。
文件读写类 (FileReaderWriter): 负责从文件读取文本,并写入结果到文件。 - 关键函数与流程图
关键函数
FileReaderWriter.readTextFromFile(String filePath): 读取文件内容并返回字符串。
SimilarityChecker.calculateSimilarity(String original, String plagiarized): 计算两个文本字符串的相似度,返回相似度百分比。
PaperChecker.main(String[] args): 主函数,解析命令行参数,调用查重逻辑,并输出结果。
流程图
开始
解析命令行参数
读取原文文件路径
读取抄袭版文件路径
读取输出文件路径
读取原文和抄袭版内容
调用 FileReaderWriter.readTextFromFile()
计算相似度
调用 SimilarityChecker.calculateSimilarity()
写入结果到文件
使用 FileReaderWriter 将相似度百分比写入输出文件
结束 - 算法关键与独到之处
算法选择:可以选择使用最长公共子序列(LCS)作为基础算法,因为LCS可以很好地反映两段文本在内容上的重叠程度。然后,通过LCS的长度与原文长度的比例来计算相似度。
独到之处:除了LCS,还可以引入词频统计和TF-IDF等文本处理技术,以更精确地识别出抄袭的部分,并区分重要内容和无关紧要的改动(如标点符号变化)。 - 性能改进思路
并行处理:如果文本量非常大,可以考虑使用多线程或分布式计算来并行处理文本的各个部分。
算法优化:对于LCS算法,可以采用动态规划的空间优化技术来减少内存使用。
缓存机制:对于频繁访问的数据(如词频表),可以使用缓存来提高访问速度。 - 单元测试设计
测试 FileReaderWriter.readTextFromFile:
构造测试数据:包含正常文本文件、空文件、不存在文件的路径。
验证返回结果是否符合预期。
测试 SimilarityChecker.calculateSimilarity:
构造多组测试数据,包括完全相同的文本、部分相同的文本、完全不同的文本等。
验证返回的相似度百分比是否正确。 - 异常处理
文件不存在异常:当尝试读取不存在的文件时,捕获 FileNotFoundException 并输出友好的错误信息。
读取文件错误:当文件内容不是预期的文本格式时(如二进制文件),捕获 IOException 并适当处理。
参数异常:检查命令行参数是否有效,如路径是否为空等。