第一次个人编程作业
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/DoubleDegreeClassof2022?filter=all |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/DoubleDegreeClassof2022/homework/13333 |
| 这个作业的目标 | 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。 |
1.设计思路
1.1文本预处理:
读取两个文件:一个是原文文件,另一个是抄袭版论文文件。
对两个文件进行标准化处理(例如,去除标点符号、转换为小写字母等),便于后续比对。
1.2计算重复率:
这里可以使用字符串匹配或文本相似度算法,如Jaccard相似度或Cosine相似度,来计算原文和抄袭版论文的相似度。
Jaccard相似度:将两个文本转化为单词集合,然后计算交集和并集的比值。
Cosine相似度:将文本转化为词频向量,计算两个文本之间的角度余弦值。
1.3输出重复率:
输出的重复率需要保留两位小数。
2.实现步骤
2.1读取命令行参数:
使用Python的sys.argv获取文件路径参数。
2.2文件读取与预处理:
从原文和抄袭版论文中读取文本内容。
去除标点符号、转换为小写字母、去除停用词等。
2.3文本相似度计算:
将文本分割成单词,计算Jaccard或Cosine相似度。
2.4输出结果:
将结果输出到指定的文件,并格式化为浮动两位小数。
3.Python代码
import sys
import string
from collections import Counter
//计算Jaccard相似度//
def jaccard_similarity(text1, text2):
words1 = set(text1.split())
words2 = set(text2.split())
intersection = len(words1.intersection(words2))
union = len(words1.union(words2))
return intersection / union
//文本预处理:去除标点、转换为小写//
def preprocess_text(text):
text = text.lower()
text = text.translate(str.maketrans('', '', string.punctuation))
return text
def main():
if len(sys.argv) != 4:
print("Usage: python main.py [original_file] [plagiarism_file] [output_file]")
sys.exit(1)
original_file = sys.argv[1]
plagiarism_file = sys.argv[2]
output_file = sys.argv[3]
# 读取原文和抄袭版论文
with open(original_file, 'r', encoding='utf-8') as f:
original_text = f.read()
with open(plagiarism_file, 'r', encoding='utf-8') as f:
plagiarism_text = f.read()
# 预处理文本
original_text = preprocess_text(original_text)
plagiarism_text = preprocess_text(plagiarism_text)
# 计算Jaccard相似度
similarity = jaccard_similarity(original_text, plagiarism_text)
# 输出结果到文件
with open(output_file, 'w', encoding='utf-8') as f:
f.write(f"{similarity:.2f}\n")
if name == "main":
main()
python main.py C:/path/to/original.txt C:/path/to/plagiarism.txt C:/path/to/output.txt
4.代码说明
4.1预处理函数(preprocess_text):
将文本转化为小写,并去掉标点符号。
4.2相似度计算函数(jaccard_similarity):
使用Jaccard相似度计算文本的重复度。
将文本分割为单词集合,计算交集与并集的大小,进而得出相似度。
4.3主函数(main):
从命令行获取文件路径,读取原文和抄袭版论文。
对文件内容进行预处理并计算相似度。
最终结果按要求输出到指定文件,并保留两位小数。
5.PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | ||
| Estimate | 估计这个任务需要多少时间 | 20 | 15 |
| Development | 开发 | ||
| Analysis | 需求分析 (包括学习新技术) | 10 | 8 |
| Design Spec | 生成设计文档 | 15 | 10 |
| Design Review | 设计复审 | 10 | 8 |
| Planning | 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
| Design | 具体设计 | 20 | 20 |
| Coding | 具体编码 | 15 | 20 |
| Code Review | 代码复审 | 10 | 10 |
| Test | 测试(自我测试,修改代码,提交修改) | 15 | 20 |
| Reporting | 报告 | ||
| Test Repor | 测试报告 | 10 | 10 |
| Size Measurement | 计算工作量 | 5 | 5 |
| Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 15 |
| 合计 | 135 | 131 |
浙公网安备 33010602011771号