python:wordcloud

📅 2026/7/29 0:18:40
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()