直接用jieba.lcut()效果差因仅基础分词,未过滤停用词、未筛选词性、未评估重要性;需结合posseg.cut()筛选名词等、加载停用词表,并对短文本优先用textrank。

为什么直接用 jieba.lcut() 提取中文关键词效果差?
因为 jieba.lcut() 只做基础分词,不区分词性、不过滤停用词、也不评估重要性。比如“的”“了”“在”这类高频虚词会大量混入,而真正有信息量的名词(如“机器学习”“神经网络”)可能被切碎或权重偏低。
- 分词后必须做词性筛选(优先保留
ns(地名)、nz(其他专名)、n(名词)、v(动词)等) - 必须加载自定义停用词表,不能只依赖
jieba.analyse.set_stop_words()的默认行为 - 如果文本较短(如微博、摘要),建议用
jieba.analyse.textrank()替代tfidf,它对小文本的关键词排序更稳定
怎么让 wordcloud.WordCloud 正确显示中文?
核心是字体路径必须显式指定,且该字体文件需同时支持中文字符和 TrueType 格式(.ttf)。系统自带字体(如 macOS 的 Helvetica、Windows 的 Arial)大多不包含中文字形,直接使用会导致方块或空白。
- 推荐用开源字体:Linux 下可用
/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc;Windows 建议复制simhei.ttf或msyh.ttc到项目目录 - 初始化时必须传参:
font_path="simhei.ttf",否则即使设置了matplotlib.rcParams['font.sans-serif']也无效 - 避免用
wordcloud自带的font_path=None默认值——它不会自动 fallback 到中文字体
生成词云前,词频字典该怎么准备?
WordCloud.generate_from_frequencies() 要求输入是 {'关键词': 频次} 形式的 dict,但直接统计 jieba.lcut() 结果会包含单字、停用词、过短词(如长度
- 先用
jieba.lcut()分词,再用jieba.posseg.cut()获取词性,只保留len(word) >= 2 and flag in ['n', 'nz', 'ns', 'v'] - 用
collections.Counter统计,但要提前过滤掉停用词(推荐用哈工大停用词表,而非简单写['的','了']) - 不建议直接喂给
WordCloud.generate()——它内部调用的分词器不支持词性标注,无法替代人工清洗
import jieba.posseg as pseg words = [(w.word, w.flag) for w in pseg.cut(text) if len(w.word) >= 2] filtered = [w for w, f in words if f in ['n', 'nz', 'ns', 'v'] and w not in stop_words] freq_dict = Counter(filtered)
为什么词云图里有些词没出现,或者大小完全不符合预期?
常见原因不是代码报错,而是词频归一化和最大词数限制隐式生效:
max_words=200是默认值,如果高频词超过 200 个,低频词会被直接丢弃(哪怕你只想要前 10 个)relative_scaling=0.5控制词大小与频率的非线性关系,设为0会强制按线性缩放,但可能让小词太小看不清如果某词在
freq_dict中频次为1,而min_font_size=12(默认),它可能因尺寸不足被跳过检查前先打印
sorted(freq_dict.items(), key=lambda x: -x[1])[:10],确认目标词是否真在字典里临时把
max_words设为None、min_font_size降到6,排除渲染阈值干扰注意:词云不支持繁体字自动转换,如果原文含繁体,得先用
opencc转简体,否则可能被当未知字符过滤
实际跑通的关键不在某一行代码,而在三处手动干预:分词后的词性过滤、字体文件的物理存在与路径正确性、以及词频字典是否真的包含了你想看到的词——其余参数都是微调。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











