杰瑞科技汇

Python wordcloud为何出现乱码?

问题根源:为什么会出现乱码?

wordcloud 库在绘制文字时,本身并不包含字体文件,它依赖于你系统中的字体文件来渲染文字,当你处理中文时,如果你的 Python 环境找不到一个包含中文字符的字体文件,它就会默认使用一个不包含中文字符的英文字体(如 Arial, Times New Roman),结果就是方框、问号或者完全无法显示,也就是我们常说的“乱码”。

Python wordcloud为何出现乱码?-图1
(图片来源网络,侵删)

解决方案

核心思路是:提供一个支持中文的字体文件给 WordCloud 使用

使用系统中自带的字体(最常用、推荐)

这是最简单直接的方法,因为不需要额外下载文件,绝大多数 Windows 和 macOS 系统都自带了支持中文的字体。

找到一个中文字体文件的路径

你需要知道你系统中某个中文字体(如“微软雅黑”、“SimHei”、“宋体”)的 .ttf 文件存放位置。

Python wordcloud为何出现乱码?-图2
(图片来源网络,侵删)
  • Windows 系统:

    • “微软雅黑” (Microsoft YaHei): C:\Windows\Fonts\msyh.ttcC:\Windows\Fonts\msyh.ttf
    • “黑体” (SimHei): C:\Windows\Fonts\simhei.ttf
    • 你可以通过在文件资源管理器地址栏输入 C:\Windows\Fonts 来查看所有字体。
  • macOS 系统:

    • “黑体” (Heiti SC): /System/Library/Fonts/STHeiti Medium.ttc
    • “苹方” (PingFang SC): /System/Library/Fonts/Supplemental/PingFang.ttc
    • 可以使用 Finder -> 前往 -> 文件夹,然后输入上述路径来访问。
  • Linux 系统 (如 Ubuntu):

    • 通常需要先安装中文字体包,sudo apt-get install fonts-wqy-microheisudo apt-get install fonts-wqy-zenhei
    • 安装后,字体文件通常在 /usr/share/fonts/ 目录下,/usr/share/fonts/truetype/wqy/wqy-microhei.ttc

在代码中指定字体路径

Python wordcloud为何出现乱码?-图3
(图片来源网络,侵删)

找到字体路径后,在创建 WordCloud 对象时,通过 font_path 参数传入。

import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 1. 准备文本(这里用一段示例中文文本)
text = """
Python是一种广泛使用的解释型、高级和通用的编程语言。
Python的设计哲学强调代码的可读性,其语法清晰明了。
它支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。
Python的标准库非常庞大,被称为“自带电池”。
"""
# 2. 使用 jieba 进行中文分词
# wordcloud 本身不支持直接分词,需要先处理好
words = jieba.lcut(text)
text_processed = " ".join(words)
# 3. 创建 WordCloud 对象,并指定中文字体路径
# !!! 这是关键步骤 !!!
# 将下面的路径替换为你自己电脑上的中文字体路径
font_path = "C:/Windows/Fonts/msyh.ttf"  # Windows 微软雅黑
# font_path = "/System/Library/Fonts/STHeiti Medium.ttc" # macOS 黑体
# font_path = "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc" # Linux 文泉驿微米黑
wc = WordCloud(
    font_path=font_path,  # 指定中文字体
    width=800,
    height=600,
    background_color="white"
)
# 4. 生成词云
wc.generate(text_processed)
# 5. 显示词云
plt.figure(figsize=(10, 8))
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")  # 关闭坐标轴
plt.show()

运行这段代码,如果字体路径正确,就能正常显示中文词云了。


下载并使用自定义字体(推荐给需要特定风格的情况)

如果你对系统自带的字体不满意,或者你的系统(如某些 Linux 发行版或 Docker 容器)没有中文字体,你可以从网上下载一个。

下载字体文件

从可靠的网站下载一个 .ttf.ttc 格式的中文字体文件。

将字体文件放在你的项目目录下

为了方便管理,建议将下载的字体文件(SourceHanSansSC-Regular.otf)和你的 Python 脚本放在同一个文件夹里。

在代码中指定相对路径

import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# ... (文本准备和分词代码同上) ...
# 假设你下载的字体文件 'SourceHanSansSC-Regular.otf' 和脚本在同一目录
font_path = "SourceHanSansSC-Regular.otf" 
wc = WordCloud(
    font_path=font_path,
    width=800,
    height=600,
    background_color="white"
)
# ... (生成和显示词云代码同上) ...

排查其他可能导致乱码的问题

如果指定了字体路径仍然乱码,可以检查以下几点:

确保分词后的文本是字符串

WordCloud.generate() 方法需要一个字符串作为输入,如果你分词后得到的是列表,必须先用 " ".join() 将其合并成字符串。

# 错误示范
words = jieba.lcut("我爱北京天安门")
wc.generate(words) # words 是列表,会报错或乱码
# 正确示范
text_str = " ".join(words)
wc.generate(text_str)

检查文本编码

虽然 Python 3 默认使用 UTF-8 编码,但在读取外部文件(如 txt, csv)时,如果文件编码不是 UTF-8,也可能出现问题,建议在读取文件时明确指定编码。

# 从文件读取文本时
with open("my_text.txt", "r", encoding="utf-8") as f:
    text = f.read()

确保字体文件确实包含你需要显示的字符

有些字体可能只包含简体中文,不包含繁体中文或某些生僻字,如果你的文本里有这些字符,即使字体路径正确,也可能显示为方框。


总结与快速排查清单

遇到 wordcloud 中文乱码,请按以下步骤操作:

  1. 首要任务:在代码中找到 WordCloud(...) 的创建部分,添加或修改 font_path 参数。
  2. 找到字体:从你的系统中找到一个中文字体(如微软雅黑、SimHei)的完整路径。
    • Windows: C:\Windows\Fonts\
    • macOS: /System/Library/Fonts/
  3. 填入路径:将找到的路径(C:/Windows/Fonts/msyh.ttf)赋值给 font_path
  4. 检查分词:确保 wc.generate() 的输入是一个用空格连接好的长字符串。
  5. 运行:重新运行你的 Python 脚本。

对于 95% 以上的情况,方案一就能解决问题,祝你编码顺利!

分享:
扫描分享到社交APP
上一篇
下一篇