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

Python-基于PyQt5,wordcloud,pillow,numpy,os,sys的智能词云生成器

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

编程思路:本次编程我们将会调用到调用到wordcloud,PyQt5,pillow(PIL),numpy,sys,os等库。其中,wordcloud是本次编程的主体,它可以指定词云的形状,颜色,字体,背景等,帮助我们轻松地生成美观、直观的词云。PyQt5被用于创建一个图形用户界面,包括按钮、文本框、标签、布局管理器等组件,以及处理用户交互和事件,它将在词云生成的功能与用户界面相结合方面会很有用。pillowPython的一个很重要的图像处理库,它被用于读取我们选择好的词云的形状图片,并将其转换为numpy数组,以便在生成词云时使用。numpy则负责进行数据处理(包括我们输入的文本以及传入的图片等信息)。sys和os将会帮助我们与Python解释器(PyCharm)进行交互,以及控制程序的执行,并对系统文件进行相关操作。

第一步:导入库

标准库:sys,os。

第三方库:PyQt5,pillow(PIL),wordcloud,numpy。

#导入必要库
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

第二步:创建功能类

我们用PyQt5库创建了一个功能丰富的GUI类(词云生成器类),允许用户选择形状图片、输入文本内容、选择字体文件、生成词云并保存生成的词云图片。在词云生成器类这个类中,我们创建了总共7个函数(初始化函数,UI初始化函数,系统图片文件夹获取函数,词云形状图片加载函数,字体文件选择函数,词云生成核心逻辑函数和词云图片保存函数),它们将执行各自的功能,共同完成生成词云图的工作。

#词云生成器类
class WordCloudGenerator(QWidget):
    #初始化函数
    def __init__(self):
        super().__init__()
        self.mask_image = None
        self.font_path = None
        self.temp_path = self.get_pictures_path()
        self.initUI()
    #UI初始化函数
    def initUI(self):
        # 主布局
        main_layout = QHBoxLayout()

        # 左侧面板
        left_panel = QVBoxLayout()
        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)

        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.image_btn)
        left_panel.addWidget(self.image_preview)
        left_panel.addWidget(QLabel('输入文本:'))
        left_panel.addWidget(self.text_edit)
        left_panel.addWidget(self.font_btn)
        left_panel.addWidget(self.generate_btn)
        left_panel.addWidget(self.save_btn)

        # 右侧面板
        right_panel = QVBoxLayout()
        self.result_preview = QLabel('词云预览区域')
        self.result_preview.setFixedSize(400, 400)
        self.result_preview.setFrameShape(QFrame.Box)
        self.result_preview.setAlignment(Qt.AlignCenter)

        # 添加右侧组件
        right_panel.addWidget(QLabel('词云图预览:'))
        right_panel.addWidget(self.result_preview)

        # 组合主布局
        main_layout.addLayout(left_panel, 40)
        main_layout.addLayout(right_panel, 60)
        self.setLayout(main_layout)

        # 窗口设置
        self.setWindowTitle('智能词云生成器')
        self.setWindowIcon(QIcon('icon.png'))  # 可选图标
        self.resize(800, 600)
        self.show()

    def get_pictures_path(self):
        """获取系统图片文件夹路径"""
        if os.name == 'nt':
            return os.path.join(os.environ['USERPROFILE'], 'Pictures')
        else:
            return os.path.expanduser('~/Pictures')

    def load_image(self):
        """加载形状图片"""
        path, _ = QFileDialog.getOpenFileName(
            self, '选择形状图片', '', '图像文件 (*.jpg *.jpeg *.png *.bmp)')
        if path:
            self.mask_image = np.array(Image.open(path))
            pixmap = QPixmap(path).scaled(300, 300, Qt.KeepAspectRatio)
            self.image_preview.setPixmap(pixmap)

    def select_font(self):
        """选择字体文件"""
        path, _ = QFileDialog.getOpenFileName(
            self, '选择字体文件', '', '字体文件 (*.ttf *.otf)')
        if path:
            self.font_path = path

    def generate_wordcloud(self):
        """生成词云核心逻辑"""
        text = self.text_edit.toPlainText()
        if not text.strip():
            QMessageBox.warning(self, '内容缺失', '请输入需要生成词云的文本内容!')
            return
        if self.mask_image is None:
            QMessageBox.warning(self, '形状未选', '请先选择词云形状图片!')
            return

        try:
            # 配置词云参数
            wc = WordCloud(
                background_color='white',
                mask=self.mask_image,
                font_path=self.font_path,
                max_words=200,
                width=800,
                height=600
            )
            wc.generate(text)

            # 保存临时文件
            temp_file = os.path.join(self.temp_path, "wordcloud_temp.png")
            wc.to_file(temp_file)

            # 显示预览
            pixmap = QPixmap(temp_file).scaled(400, 400, Qt.KeepAspectRatio)
            self.result_preview.setPixmap(pixmap)
        except Exception as e:
            QMessageBox.critical(self, '生成错误', f'词云生成失败: {str(e)}')

    def save_wordcloud(self):
        """保存词云图片"""
        if not self.result_preview.pixmap():
            QMessageBox.warning(self, '无内容', '请先生成词云!')
            return

        default_path = os.path.join(self.temp_path, "我的词云.png")
        path, _ = QFileDialog.getSaveFileName(
            self,
            '保存词云',
            default_path,
            'PNG图像 (*.png);;JPEG图像 (*.jpg);;所有文件 (*)'
        )
        if path:
            # 保持原始分辨率保存
            Image.open(os.path.join(self.temp_path, "wordcloud_temp.png")).save(path)
            QMessageBox.information(self, '保存成功', f'词云已保存至:\n{path}')

第三步:创建驱动单元

接着我们创建一段程序,它是Python程序的入口点,我们将利用它来驱动以上词云生成器类并执行相关系统程序。

#驱动程序单元
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = WordCloudGenerator()
    sys.exit(app.exec_())

第四步:完整代码展示

#导入必要库
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

#词云生成器类
class WordCloudGenerator(QWidget):
    #初始化函数
    def __init__(self):
        super().__init__()
        self.mask_image = None
        self.font_path = None
        self.temp_path = self.get_pictures_path()
        self.initUI()
    #UI初始化函数
    def initUI(self):
        # 主布局
        main_layout = QHBoxLayout()

        # 左侧面板
        left_panel = QVBoxLayout()
        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)

        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.image_btn)
        left_panel.addWidget(self.image_preview)
        left_panel.addWidget(QLabel('输入文本:'))
        left_panel.addWidget(self.text_edit)
        left_panel.addWidget(self.font_btn)
        left_panel.addWidget(self.generate_btn)
        left_panel.addWidget(self.save_btn)

        # 右侧面板
        right_panel = QVBoxLayout()
        self.result_preview = QLabel('词云预览区域')
        self.result_preview.setFixedSize(400, 400)
        self.result_preview.setFrameShape(QFrame.Box)
        self.result_preview.setAlignment(Qt.AlignCenter)

        # 添加右侧组件
        right_panel.addWidget(QLabel('词云图预览:'))
        right_panel.addWidget(self.result_preview)

        # 组合主布局
        main_layout.addLayout(left_panel, 40)
        main_layout.addLayout(right_panel, 60)
        self.setLayout(main_layout)

        # 窗口设置
        self.setWindowTitle('智能词云生成器')
        self.setWindowIcon(QIcon('icon.png'))  # 可选图标
        self.resize(800, 600)
        self.show()

    def get_pictures_path(self):
        """获取系统图片文件夹路径"""
        if os.name == 'nt':
            return os.path.join(os.environ['USERPROFILE'], 'Pictures')
        else:
            return os.path.expanduser('~/Pictures')

    def load_image(self):
        """加载形状图片"""
        path, _ = QFileDialog.getOpenFileName(
            self, '选择形状图片', '', '图像文件 (*.jpg *.jpeg *.png *.bmp)')
        if path:
            self.mask_image = np.array(Image.open(path))
            pixmap = QPixmap(path).scaled(300, 300, Qt.KeepAspectRatio)
            self.image_preview.setPixmap(pixmap)

    def select_font(self):
        """选择字体文件"""
        path, _ = QFileDialog.getOpenFileName(
            self, '选择字体文件', '', '字体文件 (*.ttf *.otf)')
        if path:
            self.font_path = path

    def generate_wordcloud(self):
        """生成词云核心逻辑"""
        text = self.text_edit.toPlainText()
        if not text.strip():
            QMessageBox.warning(self, '内容缺失', '请输入需要生成词云的文本内容!')
            return
        if self.mask_image is None:
            QMessageBox.warning(self, '形状未选', '请先选择词云形状图片!')
            return

        try:
            # 配置词云参数
            wc = WordCloud(
                background_color='white',
                mask=self.mask_image,
                font_path=self.font_path,
                max_words=200,
                width=800,
                height=600
            )
            wc.generate(text)

            # 保存临时文件
            temp_file = os.path.join(self.temp_path, "wordcloud_temp.png")
            wc.to_file(temp_file)

            # 显示预览
            pixmap = QPixmap(temp_file).scaled(400, 400, Qt.KeepAspectRatio)
            self.result_preview.setPixmap(pixmap)
        except Exception as e:
            QMessageBox.critical(self, '生成错误', f'词云生成失败: {str(e)}')

    def save_wordcloud(self):
        """保存词云图片"""
        if not self.result_preview.pixmap():
            QMessageBox.warning(self, '无内容', '请先生成词云!')
            return

        default_path = os.path.join(self.temp_path, "我的词云.png")
        path, _ = QFileDialog.getSaveFileName(
            self,
            '保存词云',
            default_path,
            'PNG图像 (*.png);;JPEG图像 (*.jpg);;所有文件 (*)'
        )
        if path:
            # 保持原始分辨率保存
            Image.open(os.path.join(self.temp_path, "wordcloud_temp.png")).save(path)
            QMessageBox.information(self, '保存成功', f'词云已保存至:\n{path}')

#驱动程序单元
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = WordCloudGenerator()
    sys.exit(app.exec_())

第五步:运行效果展示

第六步:操作指南

点击"选择形状图片",选择你想生成的词云图的形状(注意:图片最好分辨率高,以白色为背景为好,这样生成的词云图清晰美观),接着在"输入文本"下面的输入框中输入你想要生成的词云图的内容,接着点击下方的"选择字体文件(中文字体需要)"(注意:如果你输入的是中文文本的话需要你自行准备相关的中文字体文件,TTF或OTF都行;如果是英文字符的话不用)。再点击下方"生成词云",你就可以在窗口右方看到生成的预览词云图(如果不满意,可以再次点击"生成词云"重新生成词云)。如果满意生成的词云,可以点击下方"保存词云",填写你的词云图片文件名,并选择文件类型(当然,你也可以默认该操作),点击保存,系统会弹出一个信息框,提醒你图片的保存位置,记住这个位置,点击保存。返回计算机系统,按照位置搜索即可找到你生成的词云图。

第七步:注意事项

- 形状图片(建议使用透明背景PNG图片)
- 中文字体文件(如需处理中文内容)

- 首次运行时会在系统图片文件夹创建临时文件
- 保存时可自由修改文件名,但默认保存在系统图片目录
- 程序会自动处理文件夹不存在的情况(系统一般自带Pictures目录)

(我是闪云-微星,感谢你的点赞/关注)

 


http://www.kler.cn/a/528788.html

相关文章:

  • vim的特殊模式-可视化模式
  • labelme_json_to_dataset ValueError: path is on mount ‘D:‘,start on C
  • 工具的应用——安装copilot
  • CAN总线数据采集与分析
  • 【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)
  • deepseek核心技术:MLA架构-多头潜在注意力
  • 2025.2.1——四、php_rce RCE漏洞|PHP框架
  • 【08-飞线和布线与输出文件】
  • STM32 TIM编码器接口测速
  • 大模型本地部署使用方法(Ollama脚手架工具、FisherAI浏览器大模型插件、AnythingLLM大模型集成应用平台)
  • 【技海登峰】Kafka漫谈系列(一)Kafka服务集群的核心组件
  • 力扣第149场双周赛
  • DeepSeek或准备适配国产GPU,将推动国产芯片生态发展
  • 2024第十五届蓝桥杯网安赛道省赛题目--cc(CyberChef)/crypto
  • 《AI大模型开发笔记》DeepSeek技术创新点
  • 机器学习优化算法:从梯度下降到Adam及其实验改进
  • Python从零构建macOS状态栏应用(仿ollama)并集成AI同款流式聊天 API 服务(含打包为独立应用)
  • 为什么LabVIEW适合软硬件结合的项目?
  • Redisson详解
  • 【学习笔记之coze扣子】应用创建
  • 编程题-最接近的三数之和
  • Http协议详解以及GET和POST请求
  • 吴恩达深度学习——超参数调试
  • WSL2 Ubuntu20.04 无法联网,解决方案
  • 一个缓冲区重叠漏洞分析与利用
  • 杨波 简单逻辑学:理性思考、清晰表达并解决问题 - 读书笔记