3124004092个人项目
论文查重系统个人项目
项目GitHub仓库:https://github.com/H434854542/3124004092-
1.项目简介
本项目使用Python实现简易论文查重程序,基于jieba分词对文本进行分词处理,采用余弦相似度算法计算两篇文档的重复率,输出相似度结果到目标文件。项目包含主程序、单元测试模块,完成功能测试、性能分析与测试覆盖率统计。
2.需求分析
2.1 功能需求
- 读取原文文本文件、待检测抄袭文本文件
- 使用jieba进行中文分词,去除停用词
- 计算两段文本的余弦相似度,得到重复率
- 将最终重复率写入输出答案文件
2.2 非功能需求
- 程序运行稳定,对常规长度文本可快速计算
- 代码可测试,编写单元测试验证核心计算逻辑
- 完成性能分析,定位程序耗时瓶颈
- 统计单元测试覆盖率,保证核心代码被覆盖
3.设计与实现
3.1 总体设计
程序分为三个核心模块:文本读取模块、分词预处理模块、余弦相似度计算模块。
- 文本读取:读取txt文件内容,捕获文件不存在异常。
- 分词预处理:调用jieba对文本分词,过滤停用词,生成词频向量。
- 相似度计算:基于词频向量计算余弦值,得到0~1之间的重复率。
3.2 核心代码
import jieba
import math
# 读取文本
def read_file(path):
try:
with open(path, 'r', encoding='utf-8') as f:
return f.read()
except FileNotFoundError:
print("文件不存在")
return ""
# 分词处理
def cut_words(text):
words = jieba.lcut(text)
stop = {",", "。", "、", "的", "了", "是"}
res = [w for w in words if w not in stop and len(w.strip())>0]
return res
# 构建词频字典
def get_word_freq(word_list):
freq = {}
for w in word_list:
freq[w] = freq.get(w,0)+1
return freq
# 余弦相似度计算
def calc_cosine(freq1, freq2):
all_words = set(freq1.keys()) | set(freq2.keys())
dot = 0
mod1 = 0
mod2 = 0
for w in all_words:
v1 = freq1.get(w,0)
v2 = freq2.get(w,0)
dot += v1*v2
mod1 += v1**2
mod2 += v2**2
if mod1 ==0 or mod2 ==0:
return 0.0
return dot/(math.sqrt(mod1)*math.sqrt(mod2))
def main():
import sys
if len(sys.argv)!=4:
print("用法: python main.py 原文.txt 抄袭版.txt 输出.txt")
return
f1,f2,fout = sys.argv[1],sys.argv[2],sys.argv[3]
t1 = read_file(f1)
t2 = read_file(f2)
w1 = cut_words(t1)
w2 = cut_words(t2)
fr1 = get_word_freq(w1)
fr2 = get_word_freq(w2)
sim = calc_cosine(fr1,fr2)
with open(fout,"w",encoding="utf-8") as f:
f.write(f"重复率:{sim:.2f}")
print(f"重复率:{sim:.2f}")
if __name__=="__main__":
main()
浙公网安备 33010602011771号