Python读取文本文件生成词云并去除停用词

听雨眠
听雨眠
发布时间:2026-10-29| 7人浏览过
原创

使用Python读取本地文本文件、通过jieba分词、构建停用词集合过滤无意义词元,并配置中文字体生成高质量词云图的完整操作指南与代码实现。

在中文自然语言处理与数据可视化中,制作一张高质量词云图的核心链路包含三个关键环节:读取本地文本并规范文件编码、通过分词工具将连续汉字切分成独立词元、以及加载停用词表剔除“的、了、在、我们”等无实质语义的虚词。掌握这套完整流程,可以快速提炼大篇幅文本中的核心关键词并直观呈现其权重分布。

词云图能够通过字体大小直观展示词语在文本中出现的频次。然而,中文书写并不像英文那样使用天然的空格进行分词,且任何普通文本中都充斥着大量虚词、连词和辅助词。如果不做预处理就直接生成词云,生成的图表往往会被“因为”、“所以”、“我们”等无意义词汇占据最大版面,导致有价值的行业术语或主题词被严重挤压。

Python读取文本文件生成词云并去除停用词
图 1:Python 文本读取、切词、停用词过滤与词云生成四步流水线架构

一、环境准备与依赖安装

执行本任务需要安装两个基础第三方库:中文分词引擎 jieba 和词云渲染库 wordcloud。如果需要自定义图表形状,还可以补充安装 numpy 和图像处理库 Pillow。

# 在终端或虚拟环境中安装必需的第三方库
pip install jieba wordcloud

安装完成后,我们需要在项目根目录下准备好两个基础文本文件:

  1. article.txt:需要分析的目标中文文本(如新闻、论文摘要、小说或日志)。
  2. stopwords.txt:停用词表文本文件,每行包含一个不需要展示的词或符号。

二、步骤一:读取文本文件与解决编码问题

在 Python 中读取文本文件通常使用内置的 open() 函数。处理中文文本时,最常见的错误是 UnicodeDecodeError。这通常是因为文件的实际保存编码(如 UTF-8 或 GBK)与 Python 运行时的默认解码器不一致所导致的。

因此,打开文件时必须显式指定 encoding='utf-8'。若在 Windows 系统下读取部分老旧文件报错,可尝试 encoding='gbk'。

def load_text(file_path):
    """
    安全读取指定路径的文本文件,并返回全文字符串
    """
    with open(file_path, 'r', encoding='utf-8') as f:
        text_content = f.read()
    return text_content

# 调用示例
raw_text = load_text("article.txt")
print(f"成功读取文本,总字符数:{len(raw_text)}")

三、步骤二:中文分词与停用词过滤机制

英文词云可以直接根据西文字符之间的自然空格切分单词,但现代汉语没有空格,连续字串若不分词,WordCloud 会直接将整句话当成一个“词”,导致图表彻底失效。因此,我们需要使用 jieba.lcut() 将长文本切分为词语列表。

分词之后,列表中会出现诸如“在”、“我们”、“以及”、“虽然”等虚词,甚至还包含标点符号和单字。这些高频但低语义权重的词就是停用词(Stop Words)。我们必须将它们剔除。

Python读取文本文件生成词云并去除停用词
图 2:停用词匹配与单字过滤决策分支原理图

为了提升匹配效率,加载停用词表时务必将其转为 Python 的 set(集合)。集合底层基于哈希表实现,检索一个词是否在停用词中的时间复杂度为 O(1),而普通列表的检索复杂度为 O(n)。当面对几万字的长篇文本时,使用 set 能够带来数十倍的性能差异。

import jieba

def load_stopwords(filepath):
    """
    加载停用词文件,返回清洗后的 set 集合
    """
    stopwords = set()
    with open(filepath, 'r', encoding='utf-8') as f:
        for line in f:
            word = line.strip()
            if word:  # 排除纯空白行
                stopwords.add(word)
    return stopwords

def seg_and_filter(text, stopwords):
    """
    中文分词并去除停用词与单字
    """
    raw_words = jieba.lcut(text)
    
    # 过滤条件:不在停用词表中,且长度大于1(剔除标点与孤立单字)
    clean_words = [
        word for word in raw_words 
        if word not in stopwords and len(word.strip()) > 1
    ]
    
    # WordCloud 接收以空格分隔的长字符串
    return " ".join(clean_words)

四、步骤三:WordCloud 核心配置与词云生成

WordCloud 类提供了丰富的排版参数。对于中文词云,最重要的参数是 font_path。WordCloud 默认使用的是英文 DroidSans 字体,无法渲染中文字符。如果不设置 font_path,生成的词云图中所有中文都会显示为乱码矩形方块(□□□)。

常见系统中的中文字体路径:

  • Windows:C:/Windows/Fonts/simhei.ttf(黑体)或 msyh.ttc(微软雅黑)。
  • macOS:/System/Library/Fonts/PingFang.ttc 或 /System/Library/Fonts/STHeiti Light.ttc。
  • Linux (Ubuntu/Debian):/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc。
Python读取文本文件生成词云并去除停用词
图 3:停用词过滤前后词频分布与视觉语义对比示意

五、完整可运行代码示例

将上述所有模块串联起来,形成一个可以直接运行的完整脚本。该脚本读取本地的 article.txt 和 stopwords.txt,完成中文切词与停用词过滤,并最终将词云保存为 wordcloud_result.png:

import os
import jieba
from wordcloud import WordCloud

def generate_clean_wordcloud():
    # 1. 确定文件路径
    text_path = "article.txt"
    stopwords_path = "stopwords.txt"
    output_image_path = "wordcloud_result.png"
    
    # 检查输入文件是否存在
    if not os.path.exists(text_path):
        print(f"错误:未找到目标文本文件 {text_path}")
        return
        
    # 2. 读取文本内容
    with open(text_path, "r", encoding="utf-8") as f:
        content = f.read()
        
    # 3. 加载停用词表到 set 集合
    stopwords = set()
    if os.path.exists(stopwords_path):
        with open(stopwords_path, "r", encoding="utf-8") as f:
            for line in f:
                word = line.strip()
                if word:
                    stopwords.add(word)
    else:
        print(f"提示:未找到 {stopwords_path},将仅剔除单字。")

    # 4. 使用 jieba 分词并滤除停用词与单字
    raw_tokens = jieba.lcut(content)
    filtered_tokens = [
        token for token in raw_tokens 
        if token not in stopwords and len(token.strip()) > 1
    ]
    
    # 拼接为空格隔开的长字符串
    clean_text = " ".join(filtered_tokens)
    
    if not clean_text.strip():
        print("警告:过滤后无有效词汇,无法生成词云。")
        return

    # 5. 配置词云参数并生成图像
    # 注意:需根据实际系统环境指定可用的中文字体绝对路径
    font = "simhei.ttf"  # Windows 环境;macOS 可设为 "/System/Library/Fonts/PingFang.ttc"
    
    wc = WordCloud(
        font_path=font,              # 必须配置中文字体
        width=1000,                  # 画布宽度
        height=600,                  # 画布高度
        background_color="white",    # 画布背景色
        max_words=150,               # 最大显示词数
        collocations=False,          # 避免词云内部重复组合词
        margin=2
    )
    
    # 生成词云
    wc.generate(clean_text)
    
    # 保存结果到本地文件
    wc.to_file(output_image_path)
    print(f"词云生成完毕,已保存至:{output_image_path}")

if __name__ == "__main__":
    generate_clean_wordcloud()
常见技术疑问:为什么在外部手动过滤了停用词,还要关注 WordCloud 的 stopwords?

WordCloud 本身自带一个 stopwords 参数,但它默认内置的是英文停用词列表,对中文几乎不起作用。推荐像上面代码那样:在调用 WordCloud.generate() 之前,先在 Python 层面用 jieba + set 显式完成精确清洗,这样逻辑更清晰、过滤更彻底,并且支持轻松增加“字长大于1”等自定义规则。

六、关键配置与避坑速查

在实际工程使用中,读者常会遇到诸如特定专业名词被切碎、字体缺失报错或特定标点漏过滤等问题。下表列出了常见排查项与规范解决方案:

Python读取文本文件生成词云并去除停用词
图 4:词云生成全链路核心配置与异常自查卡

通过清晰的文本读取、中文分词、哈希集合去重过滤以及正确的字体路径配置,Python 能够高效准确地将大容量非结构化文本转化为重点突出、层级鲜明的词云图像。对于后续的进阶场景,还可以结合 numpy.array(Image.open("mask.png")) 参数设定遮罩图像,让词云按企业标志或特定轮廓呈现,实现更具表现力的视觉呈现。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。