文本预处理:数据清洗、分词技术、停用词过滤、文本标准化

好,咱们直接进入正题。文本预处理这事儿,说白了就是给原始文本「洗澡」。我做了这么多年社交媒体分析,可以负责任地告诉你——这一步做不好,后面所有模型都是白搭。垃圾进,垃圾出,这是铁律。

数据清洗——先把脏东西筛掉

原始社交媒体文本有多乱?我举个例子。你抓到的微博评论里,可能有「http://xxx.com」、「@张三」、「#今日话题#」,还有一堆表情符号。这些东西对情绪分析来说,基本是噪音。

我个人习惯,清洗分三步走:

  1. 去URL:用正则表达式把http/https链接全干掉。正则写法很简单:r'http\S+'
  2. 去@提及r'@\w+',把@用户名的部分移除。注意,有些场景下@名人可能带有情绪倾向,但基础清洗阶段我建议先去掉。
  3. 去特殊符号:保留中文、英文、数字和基本标点即可。表情符号可以用emoji库转成文字描述,或者直接删掉。

核心原则:清洗不是越狠越好。保留对情绪判断有用的信息,比如感叹号「!」往往代表强烈情绪,别一刀切。

我在项目中遇到过一件事。有个客户做品牌舆情监控,清洗时把「#我爱XX#」这种话题标签全删了。结果呢?正面情绪被严重低估。后来我们改成保留话题标签,准确率直接提升了12%。

分词技术——中文的痛与解

英文分词简单,按空格切就行。中文?嗯,这里要注意了。「武汉市长江大桥」——到底是「武汉/市长/江大桥」还是「武汉市/长江大桥」?

目前主流的分词工具,我推荐这几个:

工具 特点 我的评价
jieba 轻量、速度快、支持自定义词典 个人项目首选,够用
HanLP 功能全面、支持多种模型 工业级,但稍重
pkuseg 北大出品,领域分词效果好 学术场景推荐
LAC 百度开源,词性标注一体 适合需要词性的场景

用jieba举个例子:

import jieba

text = "这家餐厅的菜品真难吃,服务态度也差劲"
words = jieba.lcut(text)
print(words)
# 输出:['这家', '餐厅', '的', '菜品', '真', '难吃', ',', '服务态度', '也', '差劲']

你看,「难吃」和「差劲」都被正确切出来了。但jieba默认词典对网络新词支持不好。比如「绝绝子」、「yyds」这种,它可能切得乱七八糟。

我的小技巧:遇到领域专有词或网络热词,建一个自定义词典。一行一个词,优先级最高。比如:绝绝子 5 n,告诉jieba这是个名词,权重5。

停用词过滤——别让「的」「了」干扰判断

「我今天去了超市,买了苹果和香蕉。」——去掉停用词后变成「今天去超市,买苹果香蕉」。信息量没变,但数据量少了30%。

停用词包括三类:

  • 高频虚词:的、了、在、是、有、和、就、都、而
  • 语气词:啊、吧、呢、吗、哦、哈
  • 标点符号:,。!?、:;「」

但注意,有些词不能一刀切。比如「不」——「我不喜欢」去掉「不」就变成「我喜欢」,情绪完全反了。还有「太」、「很」、「非常」这些程度副词,对情绪强度判断很重要。

避坑指南:我曾经在做一个情感分析项目时,用了网上随便下载的停用词表。结果「好」「坏」「高」「低」全被过滤了。模型训练出来,准确率只有55%。后来我手动检查停用词表,把情绪相关词全部移除,准确率才回到正常水平。

我的建议是:先准备一个基础停用词表,然后根据你的业务场景手动调整。别偷懒,这一步值得花时间。

文本标准化——把「变形金刚」变回原形

社交媒体上,用户写东西太随意了。同一个意思,可能有十几种写法:

  • 大小写:「HAPPY」和「happy」
  • 重复字母:「好开心啊啊啊啊啊」
  • 网络缩写:「u」代替「you」,「4」代替「for」
  • 错别字:「在」和「再」混用

标准化就是把这些变体统一起来。我常用的方法:

  1. 统一小写:英文部分全部转小写
  2. 去重字符:连续重复字符压缩到2个以内。「啊啊啊啊啊」→「啊啊」
  3. 缩写还原:维护一个映射表,比如「u」→「you」,「gr8」→「great」
  4. 繁体转简体:用opencc库,一行代码搞定
import re

def normalize_text(text):
    # 统一小写
    text = text.lower()
    # 去重字符(保留2个)
    text = re.sub(r'(.)\1{2,}', r'\1\1', text)
    # 缩写还原(示例)
    abbr_map = {'u': 'you', 'r': 'are', '4': 'for'}
    for abbr, full in abbr_map.items():
        text = text.replace(abbr, full)
    return text

你想想看,如果不做标准化,「HAPPY」和「happy」在词袋模型里会被当成两个不同的词。这会导致特征维度膨胀,模型也学不到「它们其实是一回事」这个规律。

知识体系总览

下面这张图,是我梳理的文本预处理全流程。你可以把它当作操作手册来用。

文本预处理知识体系 原始社交媒体文本 数据清洗 去URL | 去@提及 | 去特殊符号 分词技术 jieba | HanLP | pkuseg | LAC 停用词过滤 高频虚词 | 语气词 | 标点符号 文本标准化 统一大小写 | 去重字符 | 缩写还原 ⚠️ 常见坑点 • 清洗过度丢失情绪词 • 停用词表包含否定词 • 未处理网络新词 • 大小写未统一 • 重复字符未压缩 • 缩写未还原 • 繁体简体混用 💡 记住: 预处理不是流水线 每一步都要 根据业务调整

说白了,文本预处理就是一场「去伪存真」的过程。把噪音去掉,把变形还原,把无意义的词过滤掉,留下真正能反映情绪的核心内容。

我个人习惯,每次做完预处理都会随机抽100条数据人工检查。看看有没有误删、误切、误过滤的情况。这一步虽然费时间,但能帮你发现很多自动化流程发现不了的问题。

最后说一句:预处理没有标准答案。你的业务场景、数据来源、分析目标,决定了每一步该怎么做。多试、多调、多验证,这才是正道。

专注资料整理