Bootstrap

Python-基于PyQt5,wordcloud,pillow,numpy,os,sys等的智能词云生成器(最终版)

前言:日常生活中,我们有时后就会遇见这样的情形:我们需要将给定的数据进行可视化处理,同时保证呈现比较良好的量化效果。这时候我们可能就会用到词云图。词云图(Word cloud)又称文字云,是一种文本数据的图片视觉表达方式,一般是由词汇组成类似云的图形,用于展示大量文本数据。词云这个概念首先是由美国西北大学新闻学副教授、新媒体专业主任里奇·戈登提出的,通常用于描述网站上的关键字元数据(标签),或可视化自由格式文本。“词云”就是通过形成“关键词云层”或“关键词渲染”,对网络文本中出现频率较高的“关键词”的视觉上的突出,每个词的重要性以字体大小或颜色显示。今天,我们就一起来学习如何利用Python制作一个简单的智能词云生成器。与上次不同的是,我们这次将给原程序扩展额外功能-从文本文件中提取文本数据(包括纯文本文件(TXT文件),PDF文件Word文件)以及智能推荐词云背景色-从形状图片中提取主要颜色,并将其用于智能背景色推荐。

编程思路:本次编程我们将会调用到调用到wordcloud,PyQt5,pillow(PIL),numpy,sys,os,pytesseract,docx,pdfplumber,colorthief等库。其中,wordcloud是本次编程的主体,它可以指定词云的形状,颜色,字体,背景等,帮助我们轻松地生成美观、直观的词云。PyQt5被用于创建一个图形用户界面,包括按钮、文本框、标签、布局管理器,颜色拾取器等组件,以及处理用户交互和事件,它将在词云生成的功能与用户界面相结合方面会很有用。pillow是Python的一个很重要的图像处理库,它被用于读取我们选择好的词云的形状图片,并将其转换为numpy数组,以便在生成词云时使用。numpy则负责进行数据处理(包括我们输入的文本以及传入的图片等信息)。sysos将会帮助我们与Python解释器(PyCharm)进行交互,以及控制程序的执行,并对系统文件进行相关操作。与上次相比,我们导入了新的库:pytesseract,它可以将图像中的文字转换为字符串,从而实现了对扫描版PDF文件的文字提取。pdfplumber让我们可以很方便地从 PDF 文件中提取文本内容(包括普通的文本型PDF和扫描版的PDF)。docx是Python的一个很强大的文本文件处理库,有了docx 库,我们可以方便地从docx文件(扩展名为.docx)中提取文本内容,并将其显示在文本编辑框中。最后,我们还将会用到colorthief,它将帮助我们从形状图片中提取主要颜色,并将其用于智能背景色推荐。

第一步:导入库

标准库:sys,os。

第三方库:PyQt5,pillow(PIL),wordcloud,numpy,docx,pdfplumber,pytesseract,colorthief。

#导入必要库
import sys
import os
import numpy as np
from PIL import Image
from wordcloud import WordCloud
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt, QSettings
import docx
import pdfplumber
import pytesseract
from colorthief import ColorThief

第二步:创建预定义颜色列表

这里我们需要创建一个预定义颜色列表,其中包含50种一般的颜色代表的RGB值,供用户在后续颜色菜单栏中自由选择词云图背景颜色。

# 预定义颜色列表(50种常见颜色)
COLOR_PRESETS = [
    "#FFFFFF", "#000000", "#FF0000", "#00FF00", "#0000FF", "#FFFF00", "#00FFFF", "#FF00FF",
    "#C0C0C0", "#808080", "#800000", "#808000", "#008000", "#800080", "#008080", "#000080",
    "#FFA07A", "#FF7F50", "#FF4500", "#FFD700", "#FF8C00", "#FF69B4", "#FF1493", "#C71585",
    "#DB7093", "#FFC0CB", "#FFB6C1", "#FFA500", "#FF6347", "#FFE4E1", "#FFF0F5", "#FAEBD7",
    "#F5F5DC", "#F0FFF0", "#F0FFFF", "#F0E68C", "#FFFACD", "#E6E6FA", "#DDA0DD", "#D8BFD8",
    "#DA70D6", "#BA55D3", "#9370DB", "#8A2BE2", "#7B68EE", "#6A5ACD", "#483D8B", "#4169E1",
    "#00BFFF", "#1E90FF", "#87CEEB", "#87CEFA", "#ADD8E6", "#B0C4DE", "#5F9EA0", "#4682B4"]

第三步:创建内部功能类

我们用PyQt5库创建了一个功能丰富的GUI类(词云生成器类),允许用户选择形状图片、输入文本内容、选择字体文件、生成词云并保存生成的词云图片。在词云生成器类这个类中,我们创建了总共19个函数(初始化函数,UI初始化函数,系统图片文件夹获取函数,词云形状图片加载函数,字体文件选择函数,词云生成核心逻辑函数和词云图片保存函数等),它们将执行各自的功能,共同完成生成词云图的工作。值得一提的是,相比于上次的代码,本次扩展了8个函数,其功能围绕从创建颜色拾取器,识别形状图片颜色以提供智能背景色推荐等功能展开。

#创建词云生成器类
class WordCloudGenerator(QWidget):
    #初始化函数
    def __init__(self):
        super().__init__()
        self.mask_image = None
        self.font_path = None
        self.bg_color = "#FFFFFF"
        self.temp_path = self.get_pictures_path()
        self.settings = QSettings("WordCloudApp", "Settings")
        self.initUI()
        self.load_settings()

    #初始化UI函数
    def initUI(self):
        # 主布局
        main_layout = QHBoxLayout()

        # 左侧面板
        left_panel = QVBoxLayout()

        # 文件导入按钮
        self.import_btn = QPushButton('导入文本文件(txt/docx/pdf(支持OCR识别))', self)
        self.import_btn.clicked.connect(self.import_text)

        # 形状图片选择
        self.image_btn = QPushButton('选择形状图片', self)
        self.image_btn.clicked.connect(self.load_image)

        # 图片预览
        self.image_preview = QLabel('图片预览区域')
        self.image_preview.setFixedSize(300, 300)
        self.image_preview.setFrameShape(QFrame.Box)
        self.image_preview.setAlignment(Qt.AlignCenter)

        # 颜色选择区域
        color_layout = QHBoxLayout()
        self.color_label = QLabel('背景颜色设置:')
        self.color_combo = QComboBox()
        self.color_combo.addItems(COLOR_PRESETS)
        self.color_combo.setEditable(True)
        self.color_combo.currentTextChanged.connect(self.update_bg_color)

        # 颜色拾取按钮
        self.color_picker_btn = QPushButton("颜色拾取", self)
        self.color_picker_btn.clicked.connect(self.pick_color)

        # 颜色预览
        self.color_preview = QLabel()
        self.color_preview.setFixedSize(50, 30)
        self.color_preview.setFrameShape(QFrame.Box)

        color_layout.addWidget(self.color_label)
        color_layout.addWidget(self.color_combo)
        color_layout.addWidget(self.color_picker_btn)
        color_layout.addWidget(self.color_preview)

        # 智能配色复选框
        self.auto_color_cb = QCheckBox("智能背景色推荐(根据图片背景色)", self)
        self.auto_color_cb.stateChanged.connect(self.toggle_auto_color)

        # 文本输入框
        self.text_edit = QTextEdit()
        self.text_edit.setPlaceholderText("在此输入文本内容,或使用上方按钮导入文件...")

        # 字体选择
        self.font_btn = QPushButton('选择字体文件(存在中文字体时需要)', self)
        self.font_btn.clicked.connect(self.select_font)

        # 生成按钮
        self.generate_btn = QPushButton('生成词云', self)
        self.generate_btn.clicked.connect(self.generate_wordcloud)

        # 保存按钮
        self.save_btn = QPushButton('保存词云', self)
        self.save_btn.clicked.connect(self.save_wordcloud)

        # 添加左侧组件
        left_panel.addWidget(self.import_btn)
        left_panel.addWidget(self.image_btn)
        left_panel.addWidget(self.image_preview)
        left_panel.addLayout(color_layout)
        left_panel.addWidget(self.auto_color_cb)
        left_panel.addWidget(QLabel('输入文本:'))
        left_panel.addWidget(self.text_edit)
        left_panel.addWidget(self.font_btn)
        left
;