【NLP 入门必看】文本预处理全流程详解:从分词到词向量,一篇打通任督二脉!

关键词:NLP、文本预处理、jieba分词、Word2Vec、Word Embedding、one-hot、数据增强
阅读建议:建议收藏+关注,适合 NLP 初学者、转行者、面试准备者系统学习!


前言:为什么文本预处理如此重要?

在自然语言处理(NLP)的世界里,“垃圾进,垃圾出”(Garbage in, Garbage out) 是铁律。

无论你用多么复杂的模型(BERT、Transformer),如果输入的文本“脏乱差”,模型也难以发挥真正实力。而文本预处理,正是让原始文本变得“干净、规整、可计算”的第一步。

一句话总结:文本预处理 = 把人类语言变成机器能吃的“数字饭”

本文将带你从零开始,系统掌握 NLP 文本预处理的六大核心模块

  1. 文本处理基本方法(分词、NER、词性标注)
  2. 文本张量表示(one-hot、Word2Vec、Word Embedding)
  3. 文本数据分析(标签分布、句子长度、词云)
  4. 文本特征处理(n-gram、长度规范)
  5. 数据增强方法(回译)
  6. 实战代码 + 可视化

Let’s go!


一、文本处理基本方法

1. 分词(Tokenization)—— 理解语言的最小单元

分词是将连续的字符序列切分成有意义的“词”序列的过程。

  • 英文:天然以空格分隔,相对简单。
  • 中文:无明显分隔符,必须依赖分词工具。
推荐工具:jieba(结巴分词)
import jieba

text = "故事的小黄花,从出生那天就飘着。"

# 精确模式(默认)
print(jieba.lcut(text))  

# 全模式(所有可能组合)
print(jieba.lcut(text, cut_all=True))

# 搜索引擎模式(长词再切分)
print(list(jieba.cut_for_search(text)))
高级功能:
  • 支持繁体中文
  • 支持用户自定义词典(如:防止“小黄花”被切开)
jieba.load_userdict("../data/user_dict.txt")  # 自定义词表

注意:分词质量直接影响后续任务,建议结合业务场景优化词典。


2. 命名实体识别(NER)—— 找出关键信息

NER(Named Entity Recognition)用于识别文本中的人名、地名、机构名等实体。

import jieba.posseg as pseg

text = "鲁迅是浙江绍兴人,五四新文化运动的重要参与者"
words = pseg.lcut(text)

for word, flag in words:
    print(f"{word} -> {flag}")
# 鲁迅 -> nr, 浙江 -> ns, 绍兴 -> ns, 五四新文化运动 -> nz ...

常见实体类型:

  • nr:人名
  • ns:地名
  • nt:机构名
  • t:时间
  • m:数量
  • mq:数量词

应用场景:知识图谱、信息抽取、智能客服。


3. 词性标注(POS)—— 理解语法结构

词性标注为每个词打上语法标签,帮助模型理解句子结构。

words = pseg.lcut("我爱自然语言处理")
# [('我', 'r'), ('爱', 'v'), ('自然语言', 'n'), ('处理', 'vn')]

常用词性:

  • v:动词
  • n:名词
  • r:代词
  • a:形容词
  • d:副词

提示:可结合词性过滤停用词或提取关键词(如只保留名词和形容词)。


二、文本张量表示方法(让文本变“数字”)

机器无法直接理解“爱”、“自然语言”这些词,必须将其转换为向量。

1. One-Hot 编码 —— 最基础但最“浪费”

将每个词表示为一个稀疏向量,词典大小为 V,则每个词是 V 维向量,仅一位为1。

["周杰伦", "陈奕迅", "王力宏"]
# 周杰伦 -> [1, 0, 0]
# 陈奕迅 -> [0, 1, 0]
# 王力宏 -> [0, 0, 1]
缺点:
  • 向量维度巨大(词典越大越糟)
  • 无法表达词义相似性(“猫”和“狗”距离 = “猫”和“石头”)

优点:简单直观,适合教学理解。


2. Word2Vec —— 让词有“语义”

Word2Vec 是 Google 提出的无监督词向量训练方法,核心思想:上下文相似的词,向量也相似

两种训练模式:
模式 原理 适用场景
CBOW 用上下文预测当前词 训练快,适合高频词
Skip-gram 用当前词预测上下文 效果好,适合低频词

cbow:
cbow
Skip-gram:
skipgram

使用 fasttext 训练词向量:
import fasttext

# 训练模型
model = fasttext.train_unsupervised("../data/fil9", model='skipgram', dim=100)

# 获取词向量
vec = model.get_word_vector("人工智能")
print(vec.shape)  # (100,)

优点:捕捉语义关系(如 king - man + woman ≈ queen


3. Word Embedding —— 深度学习中的动态词向量

在神经网络中,nn.Embedding 层会自动学习词向量,且权重可更新。

import torch
import torch.nn as nn

embedding = nn.Embedding(num_embeddings=1000, embedding_dim=128)
input_ids = torch.tensor([1, 2, 3])  # 词ID
embeds = embedding(input_ids)  # 输出 (3, 128)
与 Word2Vec 对比:
对比项 Word2Vec Word Embedding
是否静态 是(训练完固定) 否(随模型更新)
是否需预训练 否(可随机初始化)
是否易集成 需两步(查表+输入) 一步嵌入网络
是否属于广义 Embedding

总结:Word2Vec 是“预训练词向量”,Word Embedding 是“可训练的嵌入层”


三、文本语料数据分析(EDA for NLP)

在建模前,必须对数据有充分了解。

1. 标签数量分布(检查数据均衡性)

import seaborn as sns
import matplotlib.pyplot as plt

train_df = pd.read_csv("train.tsv", sep='\t')
sns.countplot(data=train_df, x='label')
plt.title("Label Distribution")
plt.show()

若正负样本严重不均衡(如 9:1),需考虑过采样、欠采样或 focal loss


2. 句子长度分布(决定 padding 长度)

train_df['sentence_length'] = train_df['sentence'].apply(len)
sns.histplot(train_df['sentence_length'], bins=50)
plt.title("Sentence Length Distribution")
plt.show()

建议:选择覆盖 95% 以上样本的长度作为 maxlen


3. 关键词词云(可视化高频词)

from wordcloud import WordCloud
import jieba

# 提取形容词(情感分析常用)
def get_adj(text):
    return [word for word, flag in pseg.lcut(text) if flag == 'a']

pos_words = ' '.join(train_df[train_df['label']==1]['sentence'].apply(get_adj))
wordcloud = WordCloud(font_path='SimHei.ttf', background_color='white').generate(pos_words)
plt.imshow(wordcloud)
plt.axis('off')
plt.show()

用途:检查数据噪声、发现领域关键词。


四、文本特征处理

1. 添加 n-gram 特征

n-gram 表示连续的 n 个词共现,能捕捉局部语义。

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

tokens = ['我', '爱', '自然语言', '处理']
print(get_ngram(tokens, 2))
# [('我', '爱'), ('爱', '自然语言'), ('自然语言', '处理')]

应用:文本分类、情感分析中提升效果显著。


2. 文本长度规范(Padding & Truncating)

模型输入需固定长度,使用 Keras 工具:

from keras.preprocessing.sequence import pad_sequences

sequences = [[1, 2, 3], [1, 2]]
padded = pad_sequences(sequences, maxlen=5, padding='post', truncating='post')
# [[1, 2, 3, 0, 0], [1, 2, 0, 0, 0]]

post:在末尾填充/截断;pre:在开头。


五、数据增强方法:回译(Back Translation)

当数据少时,可用回译增强数据多样性。

原理:中文 → 英文 → 中文,语义不变,表达变化。

# 使用有道翻译API(需申请KEY)
import requests

def back_translate(text, from_lang='zh-CHS', to_lang='en'):
    # 先翻译成英文
    en_text = youdao_translate(text, from_lang, to_lang)
    # 再翻译回中文
    zh_text = youdao_translate(en_text, to_lang, from_lang)
    return zh_text

# 示例
original = "烦恼即菩提,我暂且不提"
augmented = back_translate(original)
print(augmented)  # "Trouble is Bodhi, I'll leave it for now"
# 回译后可能变为:"烦恼即是觉悟,我先放一放"

效果:提升模型泛化能力,防止过拟合。


总结:NLP 文本预处理全流程图

原始文本
分词
NER/POS
文本表示
数据分析
特征处理
数据增强
输入模型

写在最后

文本预处理看似“简单”,实则是 NLP 项目的基石。一个优秀的 NLP 工程师,往往能在预处理阶段就拉开差距。

本文核心要点回顾:

  • 分词是基础,jieba 是中文首选
  • Word2Vec 学语义,Embedding 可更新
  • 数据分析决定模型上限
  • n-gram 和回译是提分利器

参考资料 & 工具推荐


如果你觉得这篇博客对你有帮助,欢迎点赞、收藏、关注!

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐