当前位置: 首页 > news >正文

一个使用pyqt的word文档查重工具

一个使用pyqt的word文档查重工具

  • 使用场景
  • 代码
  • 使用截图
  • 打包好的软件下载链接
  • 结尾

使用场景

有时我们在借鉴一篇文档之后还不想有太多重复,这个时候可以使用这个工具对两个word文档进行对比

代码

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel, QFileDialog
from docx import Document
import re, datetimeclass WordComparerApp(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('Word 文档比较器')self.setGeometry(100, 100, 400, 200)self.centralWidget = QWidget(self)self.setCentralWidget(self.centralWidget)self.layout = QVBoxLayout()self.file1_label = QLabel('选择文件1:')self.layout.addWidget(self.file1_label)self.file1_button = QPushButton('选择文件1')self.file1_button.clicked.connect(self.openFile1)self.layout.addWidget(self.file1_button)self.file2_label = QLabel('选择文件2:')self.layout.addWidget(self.file2_label)self.file2_button = QPushButton('选择文件2')self.file2_button.clicked.connect(self.openFile2)self.layout.addWidget(self.file2_button)self.compare_button = QPushButton('开始比较')self.compare_button.clicked.connect(self.compareFiles)self.layout.addWidget(self.compare_button)self.centralWidget.setLayout(self.layout)def openFile1(self):options = QFileDialog.Options()file1, _ = QFileDialog.getOpenFileName(self, "选择文件1", "", "Word Files (*.docx)", options=options)if file1:self.file1_label.setText(f'选择文件1: {file1}')self.file1 = file1def openFile2(self):options = QFileDialog.Options()file2, _ = QFileDialog.getOpenFileName(self, "选择文件2", "", "Word Files (*.docx)", options=options)if file2:self.file2_label.setText(f'选择文件2: {file2}')self.file2 = file2def compareFiles(self):if hasattr(self, 'file1') and hasattr(self, 'file2'):doc1 = self.readDocx(self.file1)doc2 = self.readDocx(self.file2)print('开始比对...'.center(80, '*'))t1 = datetime.datetime.now()for i in range(len(doc1)):if i % 100 == 0:print('处理进行中,已处理段落 {0:>4d} (总数 {1:0>4d} ) '.format(i, len(doc1)))for j in range(len(doc2)):self.compareParagraph(doc1, i, doc2, j)t2 = datetime.datetime.now()print('\n比对完成,总用时: ', t2 - t1)def getText(self, wordname):d = Document(wordname)texts = []for para in d.paragraphs:texts.append(para.text)return textsdef msplit(self, s, separators=',|\.|\?|,|。|?|!'):return re.split(separators, s)def readDocx(self, docfile):print('*' * 80)print('文件', docfile, '加载中……')t1 = datetime.datetime.now()paras = self.getText(docfile)segs = []for p in paras:temp = []for s in self.msplit(p):if len(s) > 2:temp.append(s.replace(' ', ""))if len(temp) > 0:segs.append(temp)t2 = datetime.datetime.now()print('加载完成,用时: ', t2 - t1)self.showInfo(segs, docfile)return segsdef showInfo(self, doc, filename='filename'):chars = 0segs = 0for p in doc:for s in p:segs = segs + 1chars = chars + len(s)print('段落数: {0:>8d} 个。'.format(len(doc)))print('短句数: {0:>8d} 句。'.format(segs))print('字符数: {0:>8d} 个。'.format(chars))def compareParagraph(self, doc1, i, doc2, j, min_segment=5):p1 = doc1[i]p2 = doc2[j]len1 = sum([len(s) for s in p1])len2 = sum([len(s) for s in p2])if len1 < 10 or len2 < 10:return []lst = []for s1 in p1:if len(s1) < min_segment:continuefor s2 in p2:if len(s2) < min_segment:continueif s2 in s1:lst.append(s2)elif s1 in s2:lst.append(s1)count = sum([len(s) for s in lst])ratio = float(count) / min(len1, len2)if count > 10 and ratio > 0.1:print(' 发现相同内容 '.center(80, '*'))print('文件1第{0:0>4d}段内容:{1}'.format(i + 1, p1))print('文件2第{0:0>4d}段内容:{1}'.format(j + 1, p2))print('相同内容:', lst)print('相同字符比:{1:.2f}%\n相同字符数: {0}\n'.format(count, ratio * 100))return lstdef main():app = QApplication(sys.argv)ex = WordComparerApp()ex.show()sys.exit(app.exec_())if __name__ == '__main__':main()

使用截图

在这里插入图片描述

打包好的软件下载链接

文档查重器

结尾

如果觉得文章对你有用请点赞、关注 ->> 你的点赞对我太有用了
群内交流更多技术
130856474 <-- 在这里

相关文章:

一个使用pyqt的word文档查重工具

一个使用pyqt的word文档查重工具 使用场景代码使用截图打包好的软件下载链接结尾 使用场景 有时我们在借鉴一篇文档之后还不想有太多重复&#xff0c;这个时候可以使用这个工具对两个word文档进行对比 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWind…...

SpringCloud Alibaba Sentinel 与 SpringCloud Gateway 的限流有什么差别?(三种限流算法原理分析)

目录 一、Sentinel 与 Gateway 的限流有什么差别&#xff1f; 1.1、前置知识 - 四种常见的限流算法 1.1.1、Tips 1.1.2、计数器算法 1&#xff09;固定窗口计数器算法 2&#xff09;滑动窗口计数器算法 1.1.3、令牌桶算法 1.1.4、漏桶算法 1.2、解决问题 一、Sentinel…...

邦芒忠告:职场新人最需要避开的十大雷坑

职场人最害怕的就是踩雷进坑&#xff0c;很多新入职场的小白都会战战兢兢&#xff0c;生怕哪里不对&#xff0c;冒犯了哪一位&#xff0c;或者触犯了哪一条潜规则。害怕自己踩到雷&#xff0c;没有走好职场第一步。最近&#xff0c;单位进了几个新人&#xff0c;看到他们就想起…...

MySQL-进阶-索引

一、索引概述 1、介绍 2、有误索引搜索效率演示 3、优缺点 二、索引结构 1、B-Tree&#xff08;多路平衡查找树&#xff09; 2、BTree 3、Hash 三、索引分类 四、索引语法 1、语法 2、案例 五、SQL性能分析 1、查看执行频次 2、慢查询日志 3、show-profile 4、explain...

GitLab入门指南:上传与下载操作一网打尽

GitLab简介&#xff1a; GitLab是一个基于Git的开源仓库管理系统&#xff0c;提供了一个Web界面的Git存储库管理器&#xff0c;并集成了多种开发工具的功能&#xff0c;如代码审查、问题跟踪、持续集成和持续部署等。GitLab可以在本地服务器上部署&#xff0c;也可以使用其提供…...

GPT应用_PrivateGPT

项目地址&#xff1a;https://github.com/imartinez/privateGPT 1 功能 1.1 整体功能&#xff0c;想解决什么问题 搭建完整的 RAG 系统&#xff0c;与 FastGPT 相比&#xff0c;界面比较简单。但是底层支持比较丰富&#xff0c;可用于知识库的完全本地部署&#xff0c;包含大…...

Qt‘s 撤销框架(Qt‘s Undo Framework)

一、开篇序言 我们常常有这样的业务场景,需要支持撤回的动作(即 undo)。如果让你来设计,聪明的你肯定也能立即想到解决问题的办法,对,将操作的 command { 对象,指令,属性 } 保存到一个容器中。 如果是仅需要单步撤销, 使用栈容器 保存command,动作执行即指令入栈, …...

【C++】stack、queue的使用及模拟实现

目录 一、stack1.1 stack的使用1.2 stack的模拟实现 二、queue2.1 queue的使用2.2 queue的模拟实现 一、stack 1.1 stack的使用 stack是一种容器适配器&#xff0c;它的特点是后进先出&#xff0c;只能在容器的一端进行插入和删除操作。 stack的使用很简单&#xff0c;主要有…...

外包干了2个多月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

html5实现好看的年会邀请函源码模板

文章目录 1.设计来源1.1 邀请函主界面1.2 诚挚邀请界面1.3 关于我们界面1.4 董事长致词界面1.5 公司合作方界面1.6 活动流程界面1.7 加盟支持界面1.8 加盟流程界面1.9 加盟申请界面1.10 活动信息界面 2.效果和源码2.1 动态效果2.2 源码目录结构 源码下载 作者&#xff1a;xcLei…...

【C++】反向迭代器模拟实现

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.利用适配器的思想…...

【低照度图像增强系列(5)】Zero-DCE算法详解与代码实现(CVPR 2020)

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标…...

三维重建衡量指标记录

1、完整性比率 Completeness Rati (CR) 完整性比率 完整性比率是用于评估三维重建质量的指标之一&#xff0c;它衡量了重建结果中包含的真实物体表面或点云的百分比。完整性比率通常是通过比较重建结果中的点云或三维模型与真实或标准点云或模型之间的重叠来计算的。 具体计算…...

在WinForms中控制模态对话框的关闭行为

博客文章&#xff1a;在WinForms中控制模态对话框的关闭行为 引言 在Windows Forms (WinForms) 应用程序中&#xff0c;对话框的行为控制是提升用户体验的关键部分。特别是在使用模态对话框时&#xff0c;防止用户不经意间关闭它变得尤为重要。本文将探讨如何通过重写 FormClo…...

java web mvc-02-struts2

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails Struts2 Apache Struts是一个用于创…...

文件上传之大文件分块上传

分久必合&#xff0c;合久必分 优势部分&#xff1a;减少了内存占用&#xff0c;可实现断点续传&#xff0c;并发处理&#xff0c;利用带宽&#xff0c;提高效率 不足之处&#xff1a;增加复杂性&#xff0c;增加额外计算存储 应用场景&#xff1a;云存储大文件上传、多媒体平台…...

测试用例评审流程

1:评审的过程 A:开始前做好如下准备 1、确定需要评审的原因 2、确定进行评审的时机 3、确定参与评审人员 4、明确评审的内容 5、确定评审结束标准 6、提前至少一天将需要评审的内容以邮件的形式发送给评审会议相关人员。并注明详审时间、地点及偿参与人员等。 7、 在邮件中提醒…...

鸿蒙开发案列一

1、开发需求 案例app一打开是“Hello world” 界面&#xff0c;开发者点击“Hello world”变成“Hello ArkUI”’ 2、源代码 Entry Component struct Hello {State person_name: string Worldbuild() {Row() {Column() {Text(Hello this.person_name).fontSize(50).fontWei…...

Vue实现图片预览,侧边栏懒加载,不用任何插件,简单好用

实现样式 需求 实现PDF上传预览&#xff0c;并且不能下载 第一次实现&#xff1a;用vue-pdf&#xff0c;将上传的文件用base64传给前端展示 问题&#xff1a; 水印第一次加载有后面又没有了。当上传大的pdf文件后&#xff0c;前端获取和渲染又长又慢&#xff0c;甚至不能用 修…...

Spring依赖注入之setter注入与构造器注入以及applicationContext.xml配置文件特殊值处理

依赖注入之setter注入 在管理bean对象的组件的时候同时给他赋值&#xff0c;就是setter注入&#xff0c;通过setter注入&#xff0c;可以将某些依赖项标记为可选的&#xff0c;因为它们不是在构造对象时立即需要的。这种方式可以减少构造函数的参数数量&#xff0c;使得类的构…...

Compose-Skill:为Jetpack Compose应用注入AI能力的组件化技能库

1. 项目概述&#xff1a;一个为Compose应用注入AI能力的技能库最近在折腾Jetpack Compose项目时&#xff0c;我一直在想&#xff0c;能不能让UI开发也“智能”一点&#xff1f;比如&#xff0c;用户输入一段模糊的描述&#xff0c;界面就能自动生成对应的组件布局&#xff1b;或…...

JetBrains IDE试用期重置工具:30天免费试用无限续杯指南

JetBrains IDE试用期重置工具&#xff1a;30天免费试用无限续杯指南 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 你是否遇到过JetBrains IDE试用期到期&#xff0c;却还没准备好购买许可证的困扰&#xff1f;i…...

基于MCP协议构建AI智能体记忆系统:mnemo-mcp实战指南

1. 项目概述&#xff1a;一个为AI记忆而生的开源工具最近在折腾AI应用开发&#xff0c;特别是围绕大语言模型&#xff08;LLM&#xff09;构建智能体&#xff08;Agent&#xff09;时&#xff0c;一个绕不开的痛点就是“记忆”。模型本身没有持久化记忆&#xff0c;每次对话都是…...

如何用RPG Maker多层级视差地图插件创建专业级游戏场景?

如何用RPG Maker多层级视差地图插件创建专业级游戏场景&#xff1f; 【免费下载链接】RPGMakerMV RPGツクールMV、MZで動作するプラグインです。 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerMV RPG Maker多层级视差地图插件是一个功能强大的开源工具&#xf…...

戴尔笔记本风扇终极管理指南:3种模式轻松掌控散热与噪音

戴尔笔记本风扇终极管理指南&#xff1a;3种模式轻松掌控散热与噪音 【免费下载链接】DellFanManagement A suite of tools for managing the fans in many Dell laptops. 项目地址: https://gitcode.com/gh_mirrors/de/DellFanManagement 还在为戴尔笔记本风扇的噪音而…...

构建插件化搜索聚合服务:从架构设计到Go语言实现

1. 项目概述与核心价值最近在折腾一个个人项目&#xff0c;需要实现一个轻量级的在线搜索聚合功能。我的需求很简单&#xff1a;不想在代码里写死一堆搜索引擎的API调用&#xff0c;也不想每次加个新搜索源就改一遍逻辑。就在我到处翻找有没有现成的轮子时&#xff0c;一个叫st…...

别再为LocalDateTime头疼了!SpringBoot 3.x全局配置Jackson与表单提交的完整避坑指南

SpringBoot 3.x日期处理终极指南&#xff1a;从Jackson到表单提交的全链路解决方案 每次看到控制台抛出Failed to convert from type [java.lang.String] to type [java.time.LocalDateTime]异常时&#xff0c;我都想对着屏幕大喊&#xff1a;"我知道日期格式应该是yyyy-M…...

[NLP]Huggingface模型与数据集高效下载全攻略:告别网络瓶颈

1. 为什么你需要这篇Huggingface下载指南 作为一名NLP工程师&#xff0c;我太理解那种盯着进度条干着急的感受了。记得上个月我在复现一个对话模型时&#xff0c;光是下载6B参数的模型就花了整整一上午——不是因为模型太大&#xff0c;而是公司网络时不时抽风&#xff0c;每次…...

CircuitPython库管理全攻略:从手动安装到CircUp工具实战

1. 项目概述&#xff1a;CircuitPython库管理的核心价值 如果你刚开始接触CircuitPython&#xff0c;可能会被一个看似简单的问题绊住&#xff1a;为什么我复制了别人的代码&#xff0c;板子却毫无反应&#xff0c;或者串口里报了一堆看不懂的错误&#xff1f;十有八九&#x…...

LinkSwift:重新定义网盘文件下载体验的本地化革命

LinkSwift&#xff1a;重新定义网盘文件下载体验的本地化革命 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...