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

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

使用场景

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

代码

python 复制代码
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel, QFileDialog
from docx import Document
import re, datetime


class 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 = file1

    def 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 = file2

    def 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 texts

    def 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 segs

    def showInfo(self, doc, filename='filename'):
        chars = 0
        segs = 0
        for p in doc:
            for s in p:
                segs = segs + 1
                chars = 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:
                continue
            for s2 in p2:
                if len(s2) < min_segment:
                    continue
                if 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 lst


def main():
    app = QApplication(sys.argv)
    ex = WordComparerApp()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

使用截图

打包好的软件下载链接

文档查重器

结尾

如果觉得文章对你有用请点赞、关注 ->> 你的点赞对我太有用了

群内交流更多技术

130856474 <-- 在这里

相关推荐
_.Switch39 分钟前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一个闪现必杀技1 小时前
Python入门--函数
开发语言·python·青少年编程·pycharm
小鹿( ﹡ˆoˆ﹡ )1 小时前
探索IP协议的神秘面纱:Python中的网络通信
python·tcp/ip·php
卷心菜小温2 小时前
【BUG】P-tuningv2微调ChatGLM2-6B时所踩的坑
python·深度学习·语言模型·nlp·bug
陈苏同学2 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
唐家小妹2 小时前
介绍一款开源的 Modern GUI PySide6 / PyQt6的使用
python·pyqt
羊小猪~~3 小时前
深度学习项目----用LSTM模型预测股价(包含LSTM网络简介,代码数据均可下载)
pytorch·python·rnn·深度学习·机器学习·数据分析·lstm
Marst Code3 小时前
(Django)初步使用
后端·python·django
985小水博一枚呀3 小时前
【对于Python爬虫的理解】数据挖掘、信息聚合、价格监控、新闻爬取等,附代码。
爬虫·python·深度学习·数据挖掘
立秋67893 小时前
Python的defaultdict详解
服务器·windows·python