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

ops/2025/2/6 2:24:59/

前言:日常生活中,我们有时后就会遇见这样的情形:我们需要将给定的数据进行可视化处理,同时保证呈现比较良好的量化效果。这时候我们可能就会用到词云图。词云图(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

python">#导入必要库
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初始化函数,系统图片文件夹获取函数,词云形状图片加载函数,字体文件选择函数,词云生成核心逻辑函数和词云图片保存函数),它们将执行各自的功能,共同完成生成词云图的工作。

python">#词云生成器类
class WordCloudGenerator(QWidget):#初始化函数def __init__(self):super().__init__()self.mask_image = Noneself.font_path = Noneself.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 = pathdef generate_wordcloud(self):"""生成词云核心逻辑"""text = self.text_edit.toPlainText()if not text.strip():QMessageBox.warning(self, '内容缺失', '请输入需要生成词云的文本内容!')returnif self.mask_image is None:QMessageBox.warning(self, '形状未选', '请先选择词云形状图片!')returntry:# 配置词云参数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, '无内容', '请先生成词云!')returndefault_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程序的入口点,我们将利用它来驱动以上词云生成器类并执行相关系统程序。

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

第四步:完整代码展示

python">#导入必要库
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 = Noneself.font_path = Noneself.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 = pathdef generate_wordcloud(self):"""生成词云核心逻辑"""text = self.text_edit.toPlainText()if not text.strip():QMessageBox.warning(self, '内容缺失', '请输入需要生成词云的文本内容!')returnif self.mask_image is None:QMessageBox.warning(self, '形状未选', '请先选择词云形状图片!')returntry:# 配置词云参数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, '无内容', '请先生成词云!')returndefault_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.ppmy.cn/ops/156027.html

相关文章

总结11..

#include <stdio.h> #include <string.h> #define MAXN 1001 #define MAXM 1000001 int n, m; char maze[MAXN][MAXN]; int block[MAXN][MAXN]; // 标记每个格子所属的连通块编号 int blockSize[MAXN * MAXN]; // 记录每个连通块的大小 int dx[] {0, 0, 1, -1};…

Python设计模式 - 组合模式

定义 组合模式&#xff08;Composite Pattern&#xff09; 是一种结构型设计模式&#xff0c;主要意图是将对象组织成树形结构以表示"部分-整体"的层次结构。这种模式能够使客户端统一对待单个对象和组合对象&#xff0c;从而简化了客户端代码。 组合模式有透明组合…

Heptagon record 数据结构

Heptagon 语言支持 record 数据结构。record 数据结构与 Scade struct 数据结构相似。对 record 结构的操作支持结构构造、record 成员访问&#xff0c;record 成员修改。 record 结构构造的形式如 {f1 val; f2; val2}。使用样例如 typet {f1:int; f2:bool} fun recordDef(…

电脑开机键一闪一闪打不开

家人们谁懂啊&#xff01;本来打算愉快地开启游戏时光&#xff0c;或者高效处理工作任务&#xff0c;结果按下电脑开机键后&#xff0c;它就只是一闪一闪的&#xff0c;怎么都打不开。相信不少朋友都遭遇过这种令人崩溃的场景&#xff0c;满心的期待瞬间化为焦急与无奈。电脑在…

asp.netcore 有关jwt的依赖包介绍

1. Microsoft.AspNetCore.Authentication.JwtBearer (8.0.10) 这是 ASP.NET Core 官方提供的用于处理 JWT Bearer 认证的包。它的主要作用是将 JWT 认证集成到 ASP.NET Core 的认证系统中。 主要功能&#xff1a; JWT 认证中间件&#xff1a;提供了一个中间件&#xff0c;用于…

Spring Boot项目如何使用MyBatis实现分页查询

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…

小程序越来越智能化,作为设计师要如何进行创新设计

一、用户体验至上 &#xff08;一&#xff09;简洁高效的界面设计 小程序的特点之一是轻便快捷&#xff0c;用户期望能够在最短的时间内找到所需功能并完成操作。因此&#xff0c;设计师应致力于打造简洁高效的界面。避免过多的装饰元素和复杂的布局&#xff0c;采用清晰的导航…

selenium记录Spiderbuf例题C03

防止自己遗忘&#xff0c;故作此为记录。 鸢尾花数据集(Iris Dataset) 这道题牵扯到JS动态加载。 步骤&#xff1a; &#xff08;1&#xff09;进入例题&#xff0c;需要找到按钮规律。 flip_xpath: str r"//li/a[onclickgetIrisData({});]" &#xff08;2&…