首页 > 其他分享 >论文查重

论文查重

时间:2024-09-13 13:46:53浏览次数:5  
标签:查重 similarity text 论文 cosine file import path

论文查重

这个作业属于哪个课程 软件工程
这个作业要求在哪里 个人项目
这个作业的目标 初步认识软件开发流程,独立培养开发能力,熟悉PSP记录开发过程

PSP

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

前言

作为开发人员,不幸的是此前未曾接触熟悉过Python语言,本次开发即第一次实战,在使用C语言进行开发途中遇到许多问题,调试无果,遂改用面向对象语言进行开发

为熟悉软件开发流程,本次开发将按照PSP进行开发记录

相似度计算

余弦相似度

雅可比相似度

编辑距离

莱文斯坦距离 / 编辑距离(Edit Distance,Levenshtein Distance只是编辑距离的其中一种)

公式理解:通过动态规划来实现,设 dp[i][j] 表示字符串 A 的前 i 个字符和字符串 B 的前 j 个字符的编辑距离,我们有以下的状态转移方程:

如果 A[i] == B[j],那么 dp[i][j] = dp[i-1][j-1]。
否则,dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1。

接口设计

使用代码实现预设操作——仅仅考虑传入英文和中文文档的情况

针对中文文档
  1. 净化文本

re库是Python的正则表达式库,使用它来移除文本中的标点符号,使用正则表达式[^\w\s]来匹配所有的标点符号,然后使用re.sub函数将它们替换为无

  1. 停用词处理--需求不允许读写其他文件,此处停用词处理仅供参考

STOP_WORDS需要自己指定停用表,初步设想是打开以及做好的停用表文件

  1. 分词处理

jieba库是一个用于中文分词的Python库,这个函数的作用是对文本进行分词。使用jieba.cut函数来进行分词,然后使用' '.join来将分词后的结果连接成一个字符串

针对英文文档
  1. 转换小写
  2. 净化文本
  3. 移除停用词

函数的作用是移除文本中的英文停用词。我们使用nltk.corpus.stopwords.words('english')来获取英文的停用词列表,然后移除他们

对两种处理进行区分并相应处理

  • 预处理函数的构建

函数会对传入的文档以及其语言不同分别处理,调用上述文档处理文件执行操作

  • 相似度的计算

三种方法均已实现此处仅给出main默认使用的余弦算法

  • 将结果输出保存到目标文件

  • 接受文件参数以及函数调用入口

给出接口设计的调用图,能力有限不能理解所有内容

单元测试

初次开发对流程不是很了解,本次单元测试是在进行接口优化后才学习完成的,对本版块还是不太熟悉,测试是模仿写出来的

Python的unittest库提供了编写单元测试的框架
首先创建一个测试类

class TestCosine(unittest.TestCase):

编写测试用例

def test_cosine_similarity_sklearn(self):
       vec1 = Counter(["你好", "世界"])
       vec2 = Counter(["你好", "世界"])
       self.assertEqual(cosine_similarity_sklearn(vec1, vec2), 1.0)

代码覆盖率

修改了几次效果不是很好,或许忽略了某些情况

优化处理

本次不再给出代码,详细请在PSP开发记录文档中查看

对于当前代码我们在执行的时候不难发现有许多存在的问题,最主要的问题是无法满足5s完成计算的需求,所以我们来分析程序的运行

通过测试案例:使用命令行来传入


 python cosine_similarity.py .\orig.txt .\orig_0.8_add.txt .\output.txt

此处的两个文件有千字

运行函数监测并发图

不难发现这次进程耗时巨大

开始优化处理

考虑多进程执行
创建一个进程池,通过并行处理,对两个出入进行文档处理,zip(texts1, texts2, output_files)创建一个元组的列表,其中每个元组包含一个来自texts1的元素、一个来自texts2的元素和一个来自output_files的元素。然后,starmap函数将这些元组解包,并将元组中的元素作为参数传递给worker函数,最终实现并行处理
优化之后:

不难发现变快了近一秒

再次尝试优化分析

通过Python的cProfile模块生成性能分析报告

本模块提供方便的查询报告结果,也可以通过Pycharm专业版中的优化分析来实现

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
2       0.000    0.000    3.900    1.950 pool.py:359(map)
3       0.000    0.000    3.901    1.300 pool.py:761(wait)
3       0.000    0.000    3.901    1.300 pool.py:764(get)
6       0.000    0.000    3.905    0.651 threading.py:288(wait)

表中列出花销比较大的几个函数,查阅资料:multiprocessing.Pool().map函数和multiprocessing.pool.wait/get函数以及threading.wait函数都是用于并行处理和线程同步的,执行时间主要取决于代码的并行部分的运行时间,没有办法从这些代码入手

那么改变思路,来优化并行任务减少并行任务量

通过对比cpu核心数量与文件数量,保证任务量一定小于cpu核心数量,取其中最小值可以大大减少无用进程

执行代码

时间减少1秒左右,两次优化将效率提高一倍左右

异常处理

考虑单元的异常
当输入路径不存在的时候

python main.py .\text1.txt .\text2.txt .\out.txt

程序会自动创建文件,这样不符合要求,我们来修改main_cosine代码

增加一个查询文件是否存在的功能

# 检查文件路径是否存在
for file_path in file_paths1 + file_paths2:
	if not os.path.exists(file_path):
		raise FileNotFoundError(f"文件 {file_path} 不存在")

异常处理还有无效语言,文件权限等问题,能力有限就不继续探究

在准备结束项目的时候又发现了一个异常,当我尝试传入绝对路径时候,程序总是无法得出结果,于是开始排查异常

首先对绝对路径传入处理,拟使用了 Python 的 os 模块中的 os.path.normpath() 函数,可惜还是不对

再次分析代码,注意到处理文档函数传入的是一个字符串,这就导致了文档路径被当作字符串处理,这是因为之前在做性能优化时,为了减少IO次数而优化的,这个优化现阶段看起来不是那么好,修改它

def preprocess_text(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        text = f.read()
  ...

问题解决

你可以这样使用他们

python main.py \.your_text1 \.your_text2 \.your_out

全部代码给出:

# _*_ coding : utf-8 _*_
# @Time : 2024/3/7 20:30
# @Author : Slave
# @File : cosine_similarity
# @Project : 3122004884

# import cProfile -- 监视耗损模块
import multiprocessing
import os
import re
import jieba
import string
import sys
from collections import Counter
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from langdetect import detect
from nltk.corpus import stopwords as nltk_stopwords


# 净化文本内容

# 中文净化

# 移除标点
def remove_punctuation_ch(text):
    return re.sub(r'[^\w\s]', '', text)


# 分词处理
def segment_words_ch(text):
    return ' '.join(jieba.cut(text))


# 英文净化
# 转换大小写
def to_lower_en(text):
    return text.lower()


# 移除标点符号
def remove_punctuation_en(text):
    return text.translate(str.maketrans('', '', string.punctuation))


# 移除停用词
def remove_stopwords_en(text):
    stop_words = set(nltk_stopwords.words('english'))
    words = text.split()
    words = [word for word in words if word not in stop_words]
    return ' '.join(words)


def preprocess_text(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        text = f.read()
    language = detect(text)
    if language == 'zh-cn':
        text = remove_punctuation_ch(text)
        text = segment_words_ch(text)
    elif language == 'en':
        text = remove_punctuation_en(text)
        text = to_lower_en(text)
        text = remove_stopwords_en(text)
    return Counter(text.split())


def cosine_similarity_sklearn(vec1, vec2):
    # 将Counter对象转换为字符串
    text1 = ' '.join(['{} {}'.format(k, v) for k, v in vec1.items()])
    text2 = ' '.join(['{} {}'.format(k, v) for k, v in vec2.items()])

    # 创建CountVectorizer对象
    vectorizer = CountVectorizer()

    # 使用CountVectorizer对象将文本转换为向量
    x = vectorizer.fit_transform([text1, text2])

    # 计算余弦相似度
    similarity = cosine_similarity(x[0], x[1])[0][0]
    similarity = round(similarity, 2)
    print(similarity)
    return similarity


def worker(vec1, vec2, output_file):
    similarity = cosine_similarity_sklearn(vec1, vec2)

    with open(output_file, 'w') as f:
        f.write('cosine_similarity is:' + str(similarity))


def main_cosine():
    file_paths1 = [os.path.normpath(path) for path in sys.argv[1::3]]
    file_paths2 = [os.path.normpath(path) for path in sys.argv[2::3]]
    output_files = [os.path.normpath(path) for path in sys.argv[3::3]]

    # 检查文件路径是否存在
    for file_path in file_paths1 + file_paths2:
        if not os.path.exists(file_path):
            raise FileNotFoundError(f"文件 {file_path} 不存在")

    with multiprocessing.Pool(min(len(file_paths1), multiprocessing.cpu_count())) as pool:
        texts1 = pool.map(preprocess_text, file_paths1)
        texts2 = pool.map(preprocess_text, file_paths2)
        pool.starmap(worker, zip(texts1, texts2, output_files))


if __name__ == '__main__':
    main_cosine()
    # profiler = cProfile.Profile()
    # profiler.runcall(main_cosine)
    # profiler.print_stats()


标签:查重,similarity,text,论文,cosine,file,import,path
From: https://www.cnblogs.com/fanzhijie/p/18412049

相关文章

  • php毕业设计和课程设计14套——源码+论文完整资源下载
    精选14套基于php的毕业设计源码+论文完整下载大家好,给大家筛选整理一些质量很高的php毕业设计程序+源码+论文全套资源,希望能对大家有所帮助。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦温馨提示:可按ct......
  • java+vue计算机毕设大学生第二课堂【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在高等教育日益重视综合素质培养的今天,大学生第二课堂作为传统课堂教学的延伸与补充,扮演着举足轻重的角色。随着信息技术的飞速发展,如何利用数字化手......
  • java+vue计算机毕设宠物之家管理系统【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代社会生活节奏的加快与人们生活水平的提升,宠物已成为众多家庭不可或缺的重要成员。宠物数量的激增不仅反映了人们对情感陪伴的需求增加,也对宠......
  • java+vue计算机毕设大学生日常行为管理系统【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育的快速发展,大学生竞赛作为提升学生实践能力、创新思维及团队协作能力的重要平台,其影响力日益增强。然而,传统的管理方式往往依赖于人工操......
  • 基于Node.js+vue机房管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,计算机机房已成为高校、培训机构及企业不可或缺的重要设施。然而,传统机房管理方式往往依赖于人工记录与监控,存在效率低下、易出错、......
  • 基于Node.js+vue直面BOSS招聘管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在当今竞争激烈的就业市场中,招聘与求职双方均面临着信息不对称、沟通效率低下的挑战。传统招聘方式往往依赖于线下招聘会、招聘网站的海量信息筛选,以及繁琐......
  • 基于Node.js+vue基于SpringBoot的儿童福利院管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着社会对儿童福利事业关注度的不断提升,儿童福利院作为保障孤儿、弃婴及困境儿童基本生活权益的重要机构,其管理效率与服务质量直接关系到儿童的健康成长。......
  • 基于Node.js+vue基于SpringBoot动漫电影网站(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,网络娱乐已成为人们日常生活中不可或缺的一部分,尤其是动漫电影作为一种集艺术性、娱乐性和文化性于一体的媒介形式,受到了广泛的欢......
  • jsp宠物店管理系统 本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文
    jsp宠物店管理系统本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能技术要求:   开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主数据库使用MySQL开题报告内容......
  • 【开题报告】基于Springboot+vue基于Web的游戏道具交易平台系统(程序+源码+论文) 计算
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着网络游戏的蓬勃发展,游戏内经济体系日益完善,游戏道具作为虚拟商品已成为玩家间交易的重要组成部分。传统游戏内交易方式受限于平台规则、信任机制......