文本预处理全攻略:数据分析 + 特征工程 + 数据增强(NLP必看)

本文是文本预处理完整版总结,从数据探索、特征处理到数据增强,覆盖NLP建模前所有必须步骤,代码可直接运行,小白也能轻松上手。


一、文本预处理到底在做什么?

文本预处理 = 让文本从“人话”变成“机器能读懂的数据”
完整流程:
原始文本 → 数据分析(看懂数据)→ 清洗/特征处理 → 数据增强 → 模型训练


二、第一部分:文本数据分析(探索数据、发现问题)

1. 数据分析的作用

  • 理解语料整体情况
  • 检查脏数据、异常长度、错误标签
  • 判断正负样本是否均衡
  • 指导模型超参数设置(句子长度、批次、词表大小)

2. 数据集说明

使用:中文酒店评论二分类语料

  • 句子:用户评价
  • 标签:0=消极 / 1=积极
  • 文件:train.tsv、dev.tsv

3. 标签数量分布

目标:看正负样本比例是否接近 1:1
工具:sns.countplot()

import seaborn as sns
import pandas as pd

train_data = pd.read_csv('./cn_data/train.tsv', sep='\t')
sns.countplot(x='label', data=train_data)

结论:

  • 样本基本均衡,无需大规模增强

4. 句子长度分布

目标:确定模型输入长度(padding / truncate)
工具:sns.displot()

train_data['sentence_length'] = list(map(len, train_data['sentence']))
sns.displot(x='sentence_length', data=train_data)

结论:

  • 大部分句子长度:20 ~ 250
  • 建议模型最大长度:100~150

5. 正负样本长度散点图

目标:快速定位超长异常句子
工具:sns.stripplot()

sns.stripplot(x='label', y='sentence_length', data=train_data)

6. 词汇总数统计

统计去重后总词量:

from itertools import chain
import jieba

vocab = set(chain(*map(jieba.lcut, train_data['sentence'])))
print('总词汇量:', len(vocab))

结果:

  • 训练集词汇:12162
  • 验证集词汇:6857

7. 形容词词云(情感关键词可视化)

分别提取正负样本的形容词,绘制词云:

  • 正样本:干净、舒服、方便、豪华
  • 负样本:脏、差、糟糕、慢、不足

三、第二部分:文本特征处理(让数据更适合模型)

1. n-gram 特征(捕捉词语搭配)

概念

连续 n 个词相邻共现 当作一个特征:

  • 2-gram:两个词一组
  • 3-gram:三个词一组

例:是谁 敲动 我心
2-gram:(是谁,敲动)、(敲动,我心)

实现

def get_ngram(input_list, n=2):
    return set(zip(*[input_list[i:] for i in range(n)]))

作用:

  • 增强语序特征
  • 提升模型语义理解能力

2. 文本长度规范(统一长度)

模型要求:同一个批次长度必须相同
操作:

  • 长句子:截断
  • 短句子:补0(padding)

工具:pad_sequences

from tensorflow.keras.preprocessing import sequence

res = sequence.pad_sequences(x_train, maxlen=100)

四、第三部分:文本数据增强(回译增强法)

1. 什么是回译增强

流程:
中文 → 外文 → 中文
得到语义相同、表述不同的新句子。

2. 优点

  • 最简单、最稳定、效果最好
  • 语义保留完整
  • 适合小样本场景

3. 缺点

  • 短文本容易重复
  • 多次翻译会失真
    优化:最多翻译 3 轮(中→英→日→中)

4. 代码实现(有道翻译API)

import requests

def back_translate(text):
    url = 'https://fanyi.youdao.com/translate'
    # 中 → 英
    data1 = {'from':'zh-CHS','to':'en','i':text,'doctype':'json'}
    res1 = requests.post(url,data=data1).json()
    tgt = res1['translateResult'][0][0]['tgt']
    # 英 → 中
    data2 = {'from':'en','to':'zh-CHS','i':tgt,'doctype':'json'}
    res2 = requests.post(url,data=data2).json()
    return res2['translateResult'][0][0]['tgt']

五、全文核心总结(最精简干货版)

文本预处理三步骤

  1. 数据分析

    • 标签分布 → 看均衡
    • 长度分布 → 定padding
    • 词频/词云 → 查情感关键词
  2. 特征工程

    • n-gram → 增强词语搭配特征
    • 长度规范 → 统一模型输入
  3. 数据增强

    • 回译法:中→外→中
    • 最简单、最高效、工业界标配

六、NLP预处理万能流程

读数据 → 分词 → 建词表 → 转索引 → 数据分析 → 长度规范 → n-gram增强 → 回译扩充 → 模型训练
posted @ 2026-05-25 16:51  Petula  阅读(24)  评论(0)    收藏  举报