中文文本清洗、分词和高频词提取必须用jieba等专用工具链,因其支持前缀词典+HMM混合策略、自定义词典及中英混排处理,配合正则清洗、停用词过滤(分词后)和Counter高效统计,才能避免切词错误与词频失真。

中文文本清洗、分词和高频词提取不能靠 str.split() 或正则硬切,必须用专为中文设计的工具链,否则会把“北京大学”切成“北京”“大学”,或把数字、标点、空白混进词频统计里。
为什么 jieba 是最稳妥的分词起点
中文没有天然空格分隔,jieba 内置了基于前缀词典 + HMM 的混合分词策略,对人名、地名、新词有基本识别能力,且支持自定义词典和调整词性。相比 pkuseg(模型大、加载慢)或 hanlp(Java 依赖重),jieba 零依赖、轻量、API 直观。
实操建议:
- 用
jieba.lcut()而非jieba.cut(),前者返回 list,避免迭代器多次消费问题 - 加载自定义词典前先调用
jieba.initialize(),防止热加载失败 - 对“iOS”“iPhone15”这类中英混排词,提前用正则替换成占位符(如
__ios__),再分词后还原,否则jieba会拆成单字
清洗阶段必须干掉的四类干扰项
清洗不是简单去空格,而是按语义层级过滤:原始噪声 → 格式残留 → 无意义符号 → 低信息量词。漏掉任何一层,后续词频都会失真。
立即学习“Python免费学习笔记(深入)”;
常见错误现象:“【回复@张三】今天天气不错!#晴天#” 直接分词会得到 ['【', '回复', '@', '张三', '】', '今天', '天气', '不错', '!', '#', '晴天', '#'] —— 这些符号全进了词频表。
实操建议:
- 用
re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9\s]', '', text)先粗筛,保留中英文、数字、空格 - 用
re.sub(r'\s+', ' ', text).strip()合并多余空白,避免“ 今天 天气 ”变成三个词 - 单独移除微信/微博常见噪声:
re.sub(r'(回复@|//|【.*?】|#.*?#|http\S+|@\w+)', '', text) - 停用词过滤必须在分词后做,不能在清洗阶段删“的”“了”,否则会误伤“美丽的花园”中的“美丽”
高频词提取时 count() 和 Counter 的关键区别
list.count() 在循环里反复遍历列表,时间复杂度 O(n²),万级文本直接卡死;而 collections.Counter 一次遍历建哈希表,O(n) 且自带 most_common() 接口。
使用场景:当你要 Top 20 高频词,且需排除停用词、长度<2 的词、纯数字词时,顺序很重要。
实操建议:
- 停用词用集合(
set)存,查询是 O(1);别用 list,否则if word not in stop_words是 O(n) - 过滤条件写成链式判断:
if len(word) > 1 and word not in stop_words and not word.isdigit() - 注意
Counter不自动去重,如果分词结果含空字符串(如连续空格导致),要先words = [w for w in words if w.strip()]
真正容易被忽略的是「词性归一化」:比如“运行”“运行中”“正在运行”在业务上是同一语义,但分词后算三个词。这时候不能只靠高频词统计,得上 pyltp 或 hanlp 做词性标注+动词原形还原——但那已是语义分析层,不属于基础清洗分词范畴。


















