python:wordcloud
# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/7/28 22:10 # User : geovindu # Product : PyCharm # Project : Pysimple # File : stylecloud_full.py import os import re import random import numpy as np import jieba import pandas as pd from io import BytesIO from PIL import Image from cairosvg import svg2png from wordcloud import WordCloud from palettable import palette as palettable_palette from fa6_icons import svgs DEFAULT_FONT_PATH None # FontAwesome 图标处理 def _get_fa_svg(icon_name: str) - str: parts icon_name.strip().split() if len(parts) ! 2: raise ValueError(icon_name格式示例: fas fa-heart) style, name parts style_map {fas: solid, far: regular, fab: brands} if style not in style_map: raise ValueError(f不支持的样式: {style}) style_name style_map[style] name name.replace(fa-, ).replace(-, _) try: svg_data str(getattr(svgs, name).get(style_name)) if not svg_data: raise ValueError(f图标 {icon_name} 不存在) return svg_data except Exception as e: raise RuntimeError(f图标 {icon_name} 获取失败请检查名称) from e def _fa_icon_to_mask(icon_name: str, size: int 512) - np.ndarray: svg_text _get_fa_svg(icon_name) svg_text re.sub(rwidth\d, fwidth{size}, svg_text) svg_text re.sub(rheight\d, fheight{size}, svg_text) png_bytes svg2png(bytestringsvg_text.encode(), output_widthsize, output_heightsize) img Image.open(BytesIO(png_bytes)).convert(L) arr np.array(img) mask np.where(arr 128, 255, 0).astype(np.uint8) return mask # 停用词 脏数据清理 def _load_stopwords(filepath: str None) - set: stopwords set() if filepath and os.path.exists(filepath): with open(filepath, r, encodingutf-8) as f: for line in f: w line.strip() if w: stopwords.add(w) return stopwords def _is_useless_single_char(word: str) - bool: 自动清理无意义单字、标点、数字 if len(word) ! 1: return False # 单字黑名单标点、数字、常见无意义单字 useless_chars r。【】{}、·~!#$%^*()_-|\/0123456789 return word in useless_chars def _filter_stopwords(word_list: list, stopwords: set) - list: result [] for w in word_list: w w.strip() if not w: continue if w in stopwords: continue if _is_useless_single_char(w): continue result.append(w) return result # CSV词频读取接口 新增 def load_wordfreq_from_csv(csv_path: str, word_colword, freq_colfreq) - dict: 读取csv词频文件 :param csv_path: csv路径 :param word_col: 词汇列名 :param freq_col: 频次列名 :return: {词汇:频次} df pd.read_csv(csv_path, encodingutf-8) df df.dropna(subset[word_col, freq_col]) word_freq {} for _, row in df.iterrows(): word str(row[word_col]).strip() freq int(row[freq_col]) if not _is_useless_single_char(word): word_freq[word] freq return word_freq # 配色函数 def _get_palette_color_func(palette_name: str, random_state): import palettable parts palette_name.split(.) obj palettable for part in parts: obj getattr(obj, part) colors_rgb obj.colors def color_func(word, font_size, position, orientation, random_staterandom_state, **kwargs): idx random_state.randint(len(colors_rgb)) r, g, b colors_rgb[idx] return frgb({r},{g},{b}) return color_func # 文本预处理 def _process_text( text: str None, text_path: str None, word_freq: dict None, csv_path: str None, stopwords: set None, is_chinese: bool True ) - str | dict: # 优先读取CSV词频 if csv_path is not None: word_freq load_wordfreq_from_csv(csv_path) if stopwords: word_freq {k: v for k, v in word_freq.items() if k not in stopwords} return word_freq if word_freq is not None: if stopwords: word_freq {k: v for k, v in word_freq.items() if k not in stopwords} return word_freq if text_path and os.path.exists(text_path): with open(text_path, r, encodingutf-8) as f: raw f.read() elif text: raw text else: raise ValueError(text / text_path / word_freq / csv_path 必须传入其一) if is_chinese: words jieba.lcut(raw) else: words raw.split() if stopwords: words _filter_stopwords(words, stopwords) return .join(words) # 核心API gen_stylecloud def gen_stylecloud( text: str None, text_path: str None, word_freq: dict None, csv_path: str None, # 新增csv词频文件 icon_name: str None, mask_img: np.ndarray None, palette: str None, background_color: str white, transparent_bg: bool False, # 新增开启透明背景PNG font_path: str DEFAULT_FONT_PATH, output_name: str stylecloud.png, size: tuple (512, 512), max_font_size: int 200, scale: float 2, prefer_horizontal: float 0.7, random_state: int 42, contour_width: float 0, contour_color: str #333333, is_chinese: bool True, stopwords_path: str None, ): rng np.random.RandomState(random_state) stopwords _load_stopwords(stopwords_path) if stopwords_path else None mask mask_img if mask is None and icon_name is not None: mask _fa_icon_to_mask(icon_name, sizesize[0]) processed_data _process_text( texttext, text_pathtext_path, word_freqword_freq, csv_pathcsv_path, stopwordsstopwords, is_chineseis_chinese ) # 透明背景时强制背景为None bg_color None if transparent_bg else background_color wc WordCloud( widthsize[0], heightsize[1], font_pathfont_path, background_colorbg_color, maskmask, max_font_sizemax_font_size, scalescale, prefer_horizontalprefer_horizontal, contour_widthcontour_width, contour_colorcontour_color, random_staterng ) if isinstance(processed_data, dict): wc.generate_from_frequencies(processed_data) else: wc.generate(processed_data) if palette is not None: color_func _get_palette_color_func(palette, rng) wc.recolor(color_funccolor_func, random_staterng) # 保存 wc.to_file(output_name) print(f✅ 生成完成: {output_name}) return wc # 【批量生成脚本】主入口 if __name__ __main__: # 配置区域 FONT rC:\Windows\Fonts\STXIHEI.TTF OUTPUT_DIR ./batch_output os.makedirs(OUTPUT_DIR, exist_okTrue) test_text 人工智能 大模型 Python 数据分析 词云 机器学习 深度学习 NLP 计算机视觉 向量数据库 Agent RAG 云计算 大数据 算法 开发 编程 架构 # 批量循环配置 # 1. 多种FontAwesome图标 icon_list [ fas fa-heart, fas fa-code, fas fa-star, fas fa-globe, fas fa-lightbulb ] # 2. 多种配色方案 palette_list [ cartocolors.diverging.TealRose_7, colorbrewer.qualitative.Set2_8, colorbrewer.qualitative.Dark2_8, matplotlib.Viridis_10 ] # 批量循环生成 idx 1 for icon in icon_list: for palette in palette_list: out_file os.path.join(OUTPUT_DIR, fcloud_{idx}_{icon.split()[-1]}_{palette.split(.)[-1]}.png) gen_stylecloud( texttest_text, font_pathFONT, icon_nameicon, palettepalette, background_colorblack, transparent_bgFalse, output_nameout_file, is_chineseTrue, prefer_horizontal0.6 ) idx 1 # 独立测试示例 # 示例1CSV词频文件读取 # gen_stylecloud( # csv_pathword_freq.csv, # font_pathFONT, # icon_namefas fa-star, # transparent_bgTrue, # output_nametransparent_cloud.png # ) # 示例2透明背景PNG # gen_stylecloud( # texttest_text, # font_pathFONT, # icon_namefas fa-heart, # transparent_bgTrue, # palettecolorbrewer.qualitative.Set2_8, # output_nametransparent_heart.png # )# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/7/28 23:19 # User : geovindu # Product : PyCharm # Project : Pysimple # File : wordcloudchinesemask.py from os import path from PIL import Image import numpy as np import matplotlib.pyplot as plt import os import jieba # 新增中文分词库 from wordcloud import WordCloud, STOPWORDS from matplotlib import font_manager def list_all_fonts(): font_dir rC:\Windows\Fonts ext (.ttf, .ttc) for filename in os.listdir(font_dir): if filename.lower().endswith(ext): full_path os.path.join(font_dir, filename) print(f{filename:20} {full_path}) # list_all_fonts() # get data directory d path.dirname(__file__) if __file__ in locals() else os.getcwd() # 1.读取中文文本 # 把 alice.txt 替换成你的中文文本文件 text_raw open(path.join(d, alice2.txt), encodingutf-8).read() # 2.中文分词拼接空格wordcloud要求词语用空格隔开 word_list jieba.lcut(text_raw) text .join(word_list) # 3.蒙版图片不变依然可以使用alice_mask.png alice_mask np.array(Image.open(path.join(d, alice_mask.png))) # 停用词中英文都可以加 stopwords set(STOPWORDS) stopwords.update([工作, 就是, 个人, 没有, 村民委员会, said]) # 4.关键增加 font_path 指定中文字体 # Windows 黑体rC:\Windows\Fonts\simhei.ttf # Windows 宋体rC:\Windows\Fonts\simsun.ttc # Mac/System/Library/Fonts/PingFang.ttc # Linux/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc wc WordCloud( background_colorwhite, max_words2000, maskalice_mask, stopwordsstopwords, contour_width3, contour_colorsteelblue, font_pathrC:\Users\geovindu\AppData\Local\Microsoft\Windows\Fonts\方正小篆体.ttf # 必须配置中文路径 方 STXIHEI.TTF FZSTK FZYTK ) # generate word cloud wc.generate(text) # store to file wc.to_file(path.join(d, chinese_wordcloud2.png)) # show plt.imshow(wc, interpolationbilinear) plt.axis(off) plt.figure() plt.imshow(alice_mask, cmapplt.cm.gray, interpolationbilinear) plt.axis(off) plt.show()

相关新闻

外卖CPS高佣金结算场景:Java基于Disruptor实现百万级返利订单的异步处理

外卖CPS高佣金结算场景:Java基于Disruptor实现百万级返利订单的异步处理

外卖CPS高佣金结算场景:Java基于Disruptor实现百万级返利订单的异步处理 在外卖CPS(Cost Per Sale)返利业务中,尤其是在“霸王餐”等高佣金结算场景下,系统常常面临瞬时流量洪峰的考验。例如,在大型促销活动…

2026/10/24 4:09:24 阅读更多 →
美团开放平台API接口深度适配:Java后端处理外卖回调通知的幂等性设计方案

美团开放平台API接口深度适配:Java后端处理外卖回调通知的幂等性设计方案

美团开放平台API接口深度适配:Java后端处理外卖回调通知的幂等性设计方案 在对接美团开放平台API构建外卖返利或霸王餐系统时,处理来自美团的异步回调通知是核心环节。无论是订单状态更新、用户授权成功还是退款通知,美团服务器都可能在网络不…

2026/10/19 23:35:39 阅读更多 →
网络安全事件响应实战:从入侵检测到溯源取证

网络安全事件响应实战:从入侵检测到溯源取证

1. 网络安全事件响应实战解析:中职组Server2215攻防演练去年带队参加省级职业院校网络安全竞赛时,我们抽到的Server2215靶机至今让我记忆犹新。这台被植入木马的数据库服务器,完整呈现了从攻击痕迹识别到溯源取证的典型事件响应流程。现在把当…

2026/10/25 11:13:31 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →