Python读取文本文件生成词云并去除停用词
使用Python读取本地文本文件、通过jieba分词、构建停用词集合过滤无意义词元,并配置中文字体生成高质量词云图的完整操作指南与代码实现。
在中文自然语言处理与数据可视化中,制作一张高质量词云图的核心链路包含三个关键环节:读取本地文本并规范文件编码、通过分词工具将连续汉字切分成独立词元、以及加载停用词表剔除“的、了、在、我们”等无实质语义的虚词。掌握这套完整流程,可以快速提炼大篇幅文本中的核心关键词并直观呈现其权重分布。
词云图能够通过字体大小直观展示词语在文本中出现的频次。然而,中文书写并不像英文那样使用天然的空格进行分词,且任何普通文本中都充斥着大量虚词、连词和辅助词。如果不做预处理就直接生成词云,生成的图表往往会被“因为”、“所以”、“我们”等无意义词汇占据最大版面,导致有价值的行业术语或主题词被严重挤压。
一、环境准备与依赖安装
执行本任务需要安装两个基础第三方库:中文分词引擎 jieba 和词云渲染库 wordcloud。如果需要自定义图表形状,还可以补充安装 numpy 和图像处理库 Pillow。
# 在终端或虚拟环境中安装必需的第三方库
pip install jieba wordcloud
安装完成后,我们需要在项目根目录下准备好两个基础文本文件:
article.txt:需要分析的目标中文文本(如新闻、论文摘要、小说或日志)。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 的 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。
五、完整可运行代码示例
将上述所有模块串联起来,形成一个可以直接运行的完整脚本。该脚本读取本地的 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.generate() 之前,先在 Python 层面用 jieba + set 显式完成精确清洗,这样逻辑更清晰、过滤更彻底,并且支持轻松增加“字长大于1”等自定义规则。
六、关键配置与避坑速查
在实际工程使用中,读者常会遇到诸如特定专业名词被切碎、字体缺失报错或特定标点漏过滤等问题。下表列出了常见排查项与规范解决方案:
通过清晰的文本读取、中文分词、哈希集合去重过滤以及正确的字体路径配置,Python 能够高效准确地将大容量非结构化文本转化为重点突出、层级鲜明的词云图像。对于后续的进阶场景,还可以结合 numpy.array(Image.open("mask.png")) 参数设定遮罩图像,让词云按企业标志或特定轮廓呈现,实现更具表现力的视觉呈现。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













