Python实战:从零构建中文词频分析器——jieba分词、停用词过滤与结果可视化
1. 为什么需要中文词频分析器
在日常工作中,我们经常需要从大量中文文本中提取关键信息。比如内容运营要分析用户评论的热点话题,数据分析师要总结市场调研报告的核心观点,学术研究者要梳理文献的研究方向。这时候,一个能自动统计词频的工具就能帮上大忙。
中文词频分析的核心思路很简单:一篇文章中反复出现的词语,往往就是文章的重点。但实际操作中会遇到几个难题:中文没有自然分隔符,需要先分词;很多无意义的虚词会影响统计结果,需要过滤;最终结果最好能直观展示。
我去年帮一个电商客户分析过10万条商品评论,手动统计根本不现实。当时用Python写了个词频分析脚本,效率提升了20倍。下面就把这套方法拆解给大家,即使你是Python新手也能快速上手。
2. 环境准备与工具安装
2.1 Python环境配置
建议使用Python 3.6及以上版本,我实测过3.6到3.10都能完美运行。如果你还没有安装Python,可以去官网下载安装包,记得勾选"Add Python to PATH"选项。
验证安装是否成功:
python --version
2.2 安装必要库
我们需要三个核心库:
- jieba:中文分词工具
- matplotlib:数据可视化
- wordcloud:词云生成
安装命令:
pip install jieba matplotlib wordcloud
如果下载速度慢,可以加上国内镜像源:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jieba matplotlib wordcloud
2.3 准备测试文本
新建一个demo.txt文件,内容可以是任意中文文章。我这里用了一段科技新闻:
人工智能正在深刻改变各行各业。机器学习、深度学习等技术在图像识别、自然语言处理领域取得突破性进展。专家预测,未来五年AI将重塑传统产业格局。
3. 中文分词实战
3.1 jieba分词的三种模式
jieba支持三种分词模式,适合不同场景:
- 精确模式:最常用,适合文本分析
import jieba
words = jieba.cut("我爱自然语言处理", cut_all=False)
print("精确模式:" + "/".join(words))
- 全模式:扫描所有可能成词的词语
words = jieba.cut("我爱自然语言处理", cut_all=True)
print("全模式:" + "/".join(words))
- 搜索引擎模式:对长词再次切分
words = jieba.cut_for_search("我爱自然语言处理")
print("搜索引擎模式:" + "/".join(words))
3.2 实际文件分词处理
读取文件并分词的完整代码:
import jieba
with open('demo.txt', 'r', encoding='utf-8') as f:
text = f.read()
words = jieba.lcut(text) # lcut直接返回列表
print(words[:10]) # 打印前10个分词结果
这里有个实用技巧:jieba默认会加载自带的词典,但遇到专业术语可能切分不准。比如"机器学习"可能被切成"机器/学习"。解决方法是用 jieba.add_word() 添加自定义词:
jieba.add_word("机器学习")
jieba.add_word("深度学习")
4. 停用词过滤技巧
4.1 什么是停用词
停用词(stop words)是指在文本中频繁出现但意义不大的词,比如"的"、"了"、"在"等。过滤掉这些词能让分析结果更有价值。
4.2 常用停用词表
中文常用的停用词表有:
- 哈工大停用词表
- 百度停用词表
- 四川大学停用词表
这里我准备了一个精简版的停用词表stopwords.txt:
的 了 在 是 我 有 和 就 人 都 一个 也 说 要 这
4.3 实现停用词过滤
def load_stopwords(filepath):
with open(filepath, 'r', encoding='utf-8') as f:
stopwords = [line.strip() for line in f.readlines()]
return set(stopwords)
stopwords = load_stopwords('stopwords.txt')
filtered_words = [word for word in words if word not in stopwords and len(word) > 1]
print(filtered_words[:10])
注意这里加了 len(word)>1 的条件,是为了同时过滤掉单字词。在实际项目中,你可能还需要处理标点符号和数字。
5. 词频统计与分析
5.1 基础统计方法
最简单的词频统计方法是用Python自带的Counter:
from collections import Counter
word_counts = Counter(filtered_words)
top10 = word_counts.most_common(10)
print(top10)
5.2 处理标点符号
有时候标点符号会被错误地统计进来。我们可以用正则表达式提前清理文本:
import re
def clean_text(text):
text = re.sub(r'[^\w\s]', '', text) # 移除非字母数字下划线的字符
text = re.sub(r'\d+', '', text) # 移除数字
return text
clean_text = clean_text(text)
5.3 词频结果优化
统计结果可能还会包含一些无意义的词,这时候可以:
- 手动添加特殊停用词
- 设置最小词频阈值
- 按词性过滤(需要jieba.posseg模块)
# 添加特殊停用词
extra_stopwords = ['nbsp', '表示', '可能']
stopwords.update(extra_stopwords)
# 设置最小词频
min_freq = 2
word_counts = {k:v for k,v in word_counts.items() if v >= min_freq}
6. 结果可视化呈现
6.1 使用Matplotlib生成柱状图
import matplotlib.pyplot as plt
top20 = word_counts.most_common(20)
words = [w[0] for w in top20]
counts = [w[1] for w in top20]
plt.figure(figsize=(10,6))
plt.barh(words, counts)
plt.title('词频统计TOP20')
plt.xlabel('出现次数')
plt.tight_layout()
plt.savefig('word_freq.png', dpi=300)
6.2 生成词云图
词云能更直观地展示关键词:
from wordcloud import WordCloud
text_for_cloud = ' '.join(filtered_words)
wc = WordCloud(font_path='simhei.ttf', # 指定中文字体
background_color='white',
max_words=100,
width=800,
height=600)
wc.generate(text_for_cloud)
wc.to_file('wordcloud.png')
6.3 可视化优化技巧
- 使用自定义形状:
from PIL import Image
import numpy as np
mask = np.array(Image.open('china.png')) # 中国地图形状
wc = WordCloud(mask=mask, background_color='white')
- 调整颜色方案:
wc = WordCloud(colormap='viridis') # 使用matplotlib配色方案
- 排除特定词语:
wc = WordCloud(stopwords={'某些', '不想显示'})
7. 完整代码示例
下面是一个整合了所有功能的完整脚本:
import jieba
import re
from collections import Counter
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 1. 读取文件
def read_file(filepath):
with open(filepath, 'r', encoding='utf-8') as f:
return f.read()
# 2. 文本清洗
def clean_text(text):
text = re.sub(r'[^\w\s]', '', text)
text = re.sub(r'\d+', '', text)
return text
# 3. 加载停用词
def load_stopwords(filepath):
with open(filepath, 'r', encoding='utf-8') as f:
return set([line.strip() for line in f])
# 4. 主函数
def analyze_text(input_file, stopwords_file, output_image):
# 读取和预处理
text = read_file(input_file)
text = clean_text(text)
# 分词
jieba.add_word('机器学习')
words = jieba.lcut(text)
# 停用词过滤
stopwords = load_stopwords(stopwords_file)
words = [w for w in words if w not in stopwords and len(w) > 1]
# 词频统计
word_counts = Counter(words)
top20 = word_counts.most_common(20)
# 可视化
plt.figure(figsize=(10,6))
plt.barh([w[0] for w in top20], [w[1] for w in top20])
plt.title('词频统计TOP20')
plt.tight_layout()
plt.savefig(output_image)
# 生成词云
wc = WordCloud(font_path='simhei.ttf', width=800, height=600)
wc.generate(' '.join(words))
wc.to_file('wordcloud.png')
return word_counts
# 运行分析
word_counts = analyze_text('demo.txt', 'stopwords.txt', 'word_freq.png')
8. 实际应用中的经验分享
在电商评论分析项目中,我发现几个实用技巧:
- 处理新词:jieba对新出现的网络用语识别不准,比如"绝绝子"。解决方法是定期更新自定义词典:
jieba.load_userdict('new_words.txt')
- 性能优化:处理大文件时,可以使用jieba的并行分词模式:
jieba.enable_parallel(4) # 开启4进程
-
结果验证:重要的分析任务应该人工抽查结果。我曾经遇到因为停用词表不全,导致"不好"这样的负面词被漏掉的情况。
-
自动化部署:可以把脚本封装成函数,配合Flask做成简单的Web服务,方便非技术人员使用。
中文词频分析看似简单,但要得到有意义的结果需要不断调整参数和词表。建议先从小的文本样本开始,逐步优化分析流程,再应用到大规模数据上。
更多推荐



所有评论(0)