这个作业属于哪个课程 | 软件工程2024 (广东工业大学) |
---|---|
这个作业要求在哪里 | 个人项目 |
这个作业的目标 | 写一个程序实现论文查重功能 |
设计一个论文查重算法,给出一个原文文件和一个经过增删改的抄袭版论文文件,在答案文件中输出其重复率。
从命令行参数给出原文文件的绝对路径、抄袭版论文的绝对路径、输出的答案文件的绝对路径。
- 原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
- 抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
- 功能拆分: 将功能分解为多个模块,如文件读取、文本处理、相似度计算、结果输出等。
- 语言选择: 考虑使用现有的工具和库来简化开发过程,提高稳定性,所以用了python。
- 编码测试: 编码过程中,按照拆分的模块逐步实现功能,并进行测试验证每个模块的正确性。
- 接收原文文件路径、抄袭版论文文件路径列表和输出文件路径作为参数。
- 将这些参数保存为对象属性,以备后续使用。
- 接收文件路径作为参数,使用utf-8编码方式读取文件内容。
- 返回文件内容。
- 使用jieba库对中文文本进行分词。
- 预处理文本,去除无用字符,只保留中文字符。
- 过滤停用词,保留长度大于1的词语。
- 返回分词结果列表。
- 对原文和抄袭版论文进行中文分词。
- 使用Jaccard相似度和difflib库计算文本相似度。
- 返回Jaccard相似度和difflib相似度列表。
- 读取原文和抄袭版论文的内容。
- 调用计算相似度函数计算相似度。
- 将相似度求平均值写入输出文件。
- 通过sys.argv获取命令行参数,sys.argv[1]是原文文件路径,sys.argv[2:-1]是抄袭版论文文件路径列表,sys.argv[-1]是输出文件路径实现一篇文章对多篇文章的比较。
- 实例化PlagiarismDetector对象,并调用运行函数。
- 输入:
python main.py <original_file> <copied_files...> <output_file>
python main.py "D:\python code\orig.txt" "D:\python code\orig_0.8_add.txt" "D:\python code\orig_0.8_del.txt" "D:\python code\orig_0.8_dis_1.txt" "D:\python code\orig_0.8_dis_10.txt" "D:\python code\orig_0.8_dis_15.txt" "D:\python code\output.txt"
- 打开output.txt,查看结果
如图所示,这个程序中性能消耗集中在以下几个方面:
-
difflib.SequenceMatcher的使用: difflib.SequenceMatcher在计算文本相似度时消耗了大量时间,特别是在调用ratio()方法时。这可能是因为它在内部执行了比较复杂的字符串匹配算法,导致性能较低。
-
中文分词的性能消耗: 使用jieba进行中文分词时,消耗了一定的时间。尤其是在调用jieba.lcut()方法和相关的分词操作时,性能较低。
计划改进方法:
- 优化文本相似度计算算法:替换difflib库中的相似度计算方法,可以使用一些更高效的文本相似度计算算法来提高性能。
- 使用其他更高效的中文分词工具
测试单元利用了unittest框架,通过运行coverage_demo.py调用test_main.py再调用main.py测试覆盖率,主要测试了以下内容:
- 测试 read_file 方法是否能正确读取文件内容。
def test_read_file(self):
- 测试 chinese_word_cut 方法是否能正确进行中文分词。
def test_chinese_word_cut(self)
- 测试 calculate_similarity 方法是否能正确计算相似度。
def test_calculate_similarity(self)
- 检查输出文件内容是否符合预期。
test_run(self)
测试截图:
在进行代码测试时,按照指定的方式输入多个文件的位置,并向指定的文件输出答案。所以主程序未覆盖部分也经过测试
当输入文件不存在时,系统会提示并退出
PS D:\python code> python main.py "D:\python code\or.txt" "D:\python code\orc.txt" "D:\python code\output.txt"
Error: Original file 'D:\python code\or.txt' does not exist. #or.txt不存在
Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|
Planning | 20 | 15 |
- Estimate | 20 | 15 |
Development | 410 | 555 |
- Analysis | 120 | 160 |
- Design Spec | 40 | 30 |
- Design Review | 10 | 5 |
- Coding Standard | 5 | 5 |
- Design | 30 | 15 |
- Coding | 150 | 240 |
- Code Review | 15 | 10 |
- Test | 40 | 90 |
Reporting | 30 | 35 |
- Test Report | 10 | 15 |
- Size Measurement | 10 | 10 |
- Postmortem & Process Improvement Plan | 10 | 10 |
合计 | 460 | 605 |