NLP 自然语言处理基础
本页介绍自然语言处理(Natural Language Processing, NLP)的技术链路:让机器理解、生成和处理人类语言。NLP 是 AI 最具挑战的领域之一——语言是人类最复杂的认知产物。从分词到嵌入,从分类到翻译,本页覆盖 NLP 入门所需的核心概念。深度学习时代的架构演进见RNN 循环神经网络与Transformer 架构,大语言模型的深入解析见语言模型演进。
NLP 的本质问题是:计算机只懂数字,怎么把语言变成数字? 整个技术链路就是回答这个问题的过程。
- 分词 Tokenization = 把句子切成积木块:机器不能直接处理一整句话,得先切成小单元(词、子词或字符)。中文没有空格分隔词语,所以分词更难——“南京市长江大桥”可以切成”南京市/长江大桥”或”南京市长/江大桥”,歧义是中文 NLP 的经典难题。
- 词嵌入 Word Embedding = 给每个词一个”语义坐标”:把词映射成一组数字(向量),让语义相近的词在向量空间中距离也近。“国王”和”女王”的向量很近,“国王”和”苹果”很远——这就是让机器”理解”语义的关键一步。
- 文本分类 = 给文字贴标签:这段话是正面还是负面?是新闻还是广告?是垃圾邮件还是正常邮件?分类是 NLP 最常见的任务。
- 序列标注 = 逐词贴标签:不是给整句一个标签,而是给句子中每个词都打标签——哪些词是人名(NER)、哪些是动词哪些是名词(词性标注)。
- 机器翻译 = 跨语言搬运语义:从早期的人工规则,到统计翻译(算概率),再到神经网络翻译(编码-解码),翻译史浓缩了 NLP 的全部进步。
NLP 处理流程
Section titled “NLP 处理流程”从原始文本到最终输出,NLP 有一条标准的技术链路:
分词策略对比
Section titled “分词策略对比”不同的分词粒度,适用于不同场景:
OOV(Out-of-Vocabulary)问题:词级分词遇到训练时没见过的词(新词、错别字、罕见词)就无法处理。子词分词把未知词拆成已知的子词片段,从根本上解决了这个问题——这也是 BERT、GPT 等现代模型都用子词分词的原因。
BPE 子词分词算法详解
Section titled “BPE 子词分词算法详解”BPE(Byte-Pair Encoding,字节对编码)是现代大语言模型最核心的分词算法。它的训练过程是一个贪心合并的过程——从字符级开始,不断合并出现频率最高的相邻字符对:
=== BPE 训练过程示例 ===
初始词表(字符级)+ 频率统计: "low" 出现 5 次 → l, o, w "lower" 出现 2 次 → l, o, w, e, r "newest" 出现 6 次 → n, e, w, e, s, t "widest" 出现 3 次 → w, i, d, e, s, t
第 1 轮:统计所有相邻字符对频率,找到最高频对 (e, s) 出现 9 次 (newest 6 + widest 3) → 合并为 "es" 词表更新:"low" → l,o,w | "newest" → n,e,w,es,t | "widest" → w,i,d,es,t
第 2 轮:最高频对 (es, t) 出现 9 次 → 合并为 "est" "newest" → n,e,w,est | "widest" → w,i,d,est
第 3 轮:(l, o) 出现 7 次 → 合并为 "lo"第 4 轮:(lo, w) 出现 7 次 → 合并为 "low"
... 继续合并直到达到目标词表大小(如 30000)
=== 推理时(编码新词)=== "lowest" (训练时没见过) → 切分为 "low" + "est" 不是 OOV!因为子词 "low" 和 "est" 都在词表中WordPiece 与 BPE 的区别:WordPiece(BERT 使用)的合并标准不是频率最高,而是合并后能最大化语言模型似然(即
freq(pair) / (freq(first) * freq(second))最大的对优先合并)。SentencePiece 则是 Google 的工程框架,支持 BPE 和 Unigram 两种算法,且直接处理原始文本(不需要预先空格分词),因此特别适合中文、日文等无空格语言。
词嵌入的数学原理
Section titled “词嵌入的数学原理”word2vec:Skip-gram 模型
Section titled “word2vec:Skip-gram 模型”word2vec 的核心直觉:一个词的语义由它周围的词决定(distributional hypothesis,分布假说)。Skip-gram 模型用中心词预测上下文词:
Skip-gram 目标函数(最大化):
L = (1/T) * sum_{t=1}^{T} sum_{-c<=j<=c, j!=0} log P(w_{t+j} | w_t)
其中: T = 训练语料的总词数 c = 上下文窗口大小(如 5) w_t = 中心词, w_{t+j} = 上下文词 P(w_{t+j} | w_t) = exp(v_{w_{t+j}}' · v_{w_t}) / sum_{w} exp(v_w' · v_{w_t})
v_w = 词 w 作为中心词时的向量 v_w' = 词 w 作为上下文词时的向量 · 表示向量点积分母 sum_{w} exp(...) 需要遍历整个词表,计算量巨大。实践中用负采样(Negative Sampling)近似——随机采样少量”负例”词代替全词表:
负采样损失函数:
L_neg = log sigmoid(v_context' · v_center) + sum_{neg} log sigmoid(-v_neg' · v_center)
其中 sigmoid(x) = 1 / (1 + exp(-x))负例从词表中按频率的 3/4 次方采样(平滑高频词)注意力机制的公式
Section titled “注意力机制的公式”注意力机制(Attention)让模型在处理每个位置时”关注”输入中最相关的部分。缩放点积注意力(Scaled Dot-Product Attention,Transformer 的核心):
Attention(Q, K, V) = softmax(Q · K^T / sqrt(d_k)) · V
其中: Q (Query) = 查询矩阵,表示"我要找什么" K (Key) = 键矩阵,表示"我有什么可匹配的" V (Value) = 值矩阵,表示"匹配到后返回的内容" d_k = 键向量的维度 sqrt(d_k) = 缩放因子,防止点积过大导致 softmax 梯度消失 Q · K^T = 查询与所有键的点积,得到注意力分数 softmax = 归一化为概率分布,即注意力权重直觉理解:注意力就像图书馆找书——你有一个查询(Q),每本书有一个书名标签(K)和一个内容(V)。你的查询和所有书名做比较(Q · K^T),匹配度越高权重越大,最后把所有书的内容按权重加权求和,就得到了你需要的”综合答案”。
TF-IDF:经典文本表示
Section titled “TF-IDF:经典文本表示”在深度学习之前,TF-IDF 是最常用的文本向量化方法。它衡量一个词对一个文档的重要性:
TF(t, d) = 词 t 在文档 d 中出现的次数 / 文档 d 的总词数IDF(t) = log(文档总数 / 包含词 t 的文档数)TF-IDF = TF(t, d) * IDF(t)
直觉: 在所有文档中都出现的词(如"的"、"是")IDF 接近 0,权重低 只在少数文档中出现的词(如"区块链"、"量子")IDF 大,权重高用 Transformers 做情感分析
Section titled “用 Transformers 做情感分析”只需几行代码,就能调用预训练模型完成情感分析:
from transformers import pipeline
# 加载情感分析 pipeline(首次运行会自动下载模型)classifier = pipeline("sentiment-analysis", model="uer/roberta-base-finetuned-jd-binary-chinese")
# 对中文文本做情感分析texts = ["这家餐厅菜品很好吃,服务也很周到", "物流太慢了,等了一周才到"]results = classifier(texts)for text, result in zip(texts, results): print(f"'{text}' → {result['label']}, 置信度: {result['score']:.2%}")BPE 子词分词演示
Section titled “BPE 子词分词演示”BPE(Byte-Pair Encoding)是现代语言模型最常用的分词方法,它的原理是:从字符开始,不断合并出现频率最高的相邻字节对:
from transformers import AutoTokenizer
# 用 BERT 的中文分词器演示tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
text = "深度学习改变了自然语言处理"tokens = tokenizer.tokenize(text)ids = tokenizer.encode(text)
print(f"原文: {text}")print(f"分词: {tokens}") # 子词列表print(f"ID: {ids}") # 对应的数字 ID# 机器看到的不是文字,而是一串数字 ID
# 对比 GPT-2 的 BPE 分词器(英文示例)en_tokenizer = AutoTokenizer.from_pretrained("gpt2")en_text = "unhappiness"print(f"\n英文示例: {en_text}")print(f"GPT-2 分词: {en_tokenizer.tokenize(en_text)}")# 输出类似: ['un', 'h', 'app', 'iness'] —— BPE 把未见过的词拆成已知子词word2vec 词向量语义运算
Section titled “word2vec 词向量语义运算”from gensim.models import KeyedVectors
# 加载预训练中文词向量(需提前下载 .bin 文件)# model = KeyedVectors.load_word2vec_format("sgns.zhihu.bigram.bin", binary=True)
# 语义运算示例(假设已加载模型):# 国王 - 男人 + 女人 ≈ 女王# result = model.most_similar(positive=['国王', '女人'], negative=['男人'])# print(result) # [('女王', 0.78), ('王妃', 0.65), ...]
# 相似度计算# sim = model.similarity('北京', '上海') # 两个城市,相似度高# sim = model.similarity('北京', '苹果') # 城市 vs 水果,相似度低训练技巧与实践要点
Section titled “训练技巧与实践要点”- 中文分词需要专门工具:英文天然用空格分词,中文需要分词器(jieba、pkuseg、HanLP)。现代预训练模型(BERT/GPT)使用子词分词,不再依赖传统分词器——但理解分词原理仍是 NLP 基本功。
- BPE 是子词分词的核心算法:GPT 系列用 BPE,BERT 用 WordPiece(BPE 变体),SentencePiece 是 Google 的跨语言分词框架(支持 BPE 和 Unigram 两种算法)。
- 词嵌入选择:word2vec/GloVe 是静态嵌入(每个词一个固定向量);BERT/GPT 产生的是上下文嵌入(同一个词在不同句子中向量不同)——这是预训练模型革命性进步之一。例如”苹果”在”我吃了一个苹果”和”苹果公司发布新手机”中的向量完全不同。
- 文本分类入门路径:先用 TF-IDF + 朴素贝叶斯/SVM(见监督学习)做 baseline,再用预训练模型微调,通常后者准确率大幅领先。
- 处理中文的注意事项:注意全角/半角字符转换、繁简体统一、停用词过滤;社交媒体文本要处理 emoji、缩写、网络用语。
- 微调预训练模型的技巧:
- 学习率分层衰减:越靠近输入层的层用越小学习率(如 1e-5),越靠近输出的层用越大学习率(如 5e-5),因为底层特征更通用不需要大幅修改。
- 热身(Warmup):前 10% 的训练步用线性增长的极小学习率,防止微调初期破坏预训练权重。
- 最大序列长度:BERT 最大 512 token,长文本需要截断或用滑动窗口。处理长文档可考虑 Longformer 或 BigBird。
- 批次大小与梯度累积:显存不够时用梯度累积(gradient accumulation)模拟大批次——做 N 次前向/反向后再一步优化器更新。
- 数据增强策略:回译(中→英→中)、同义词替换、随机删除/交换词序。EDA(Easy Data Augmentation)在小数据集上效果显著。
最新进展(2024-2025)
Section titled “最新进展(2024-2025)”大语言模型的爆发从根本上重塑了 NLP 的技术格局:
- 子词分词的演进:GPT-4o 和 Claude 3 使用了基于 tiktoken 的高效 BPE 分词器,词表大小达到 10 万级别。2024 年的研究(如 Byte-level tokenization)探索直接在字节级别建模,彻底消除 OOV 问题——Meta 的 MegaByte 和 Google 的 ByT5 是代表。
- 上下文嵌入成为默认:word2vec/GloVe 等静态嵌入已基本退出主流。2024-2025 年的 NLP 应用几乎全部基于预训练 Transformer 的上下文嵌入。Sentence-BERT 和 E5/BGE 等句向量模型成为语义搜索、RAG(检索增强生成)的基础设施。
- 嵌入模型的维度革命:2024 年的最先进句向量模型(如 OpenAI text-embedding-3、BGE-M3)支持从 256 到 3072 维的灵活嵌入维度,并通过 Matryoshka 嵌入(俄罗斯套娃嵌入)技术让用户在精度和效率间自由权衡——低维截断就能用,全维精度最高。
- LLM 统一 NLP 任务:传统的分词→特征提取→分类的 pipeline 正在被 LLM 的 prompt-based 方式取代。命名实体识别、文本分类、情感分析等任务现在可以通过 GPT-4/Claude 的 zero-shot / few-shot 方式完成,无需专门训练。2025 年的趋势是 小模型 + 任务专用微调(如 Phi-3、Gemma 2)在边缘设备上完成传统 NLP 任务。
- 检索增强生成(RAG)成为新范式:RAG 将信息检索与生成结合——先从知识库中检索相关文本片段,再把检索结果作为上下文输入 LLM 生成回答。这重新定义了搜索、问答和知识管理的架构,向量数据库(Pinecone、Milvus、Qdrant)成为关键基础设施。
- 多语言与跨语言 NLP:XLM-R、mBART 等多语言预训练模型使得跨语言迁移更加容易。2024 年 Google 的 Gemini 1.5 和 Meta 的 SeamlessM4T 支持 100+ 语言的端到端翻译,质量大幅提升。
- 搜索引擎 → 关键词提取与语义匹配:Google/百度在用户输入查询后,先分词、再理解意图、最后从索引中召回相关网页——NLP 是搜索的核心引擎。现代搜索还用语义嵌入做”意思相近但措辞不同”的匹配。
- 情感分析 → 品牌口碑与舆情监控:自动分析微博、电商评论中的正负面情绪,品牌方实时掌握口碑走向;电影出品方用它评估观众反馈,调整宣发策略。
- 智能客服 → 意图识别与问答:用户说”我想改套餐”,系统先识别意图(套餐变更),再提取关键信息(哪个套餐),最后调用对应接口——整个流程都是 NLP 任务。
- 内容审核 → 违规文本过滤:社交平台自动识别辱骂、广告、暴力等违规内容,每天处理数十亿条文本——这是互联网平台合规运营的基础设施。
- 机器翻译 → 跨语言沟通:Google 翻译、DeepL 背后是强大的神经机器翻译模型(Transformer 架构),翻译质量已接近人工水平——从规则翻译到统计翻译再到神经翻译,翻译史就是 NLP 的进化史。
典型类库与工具
Section titled “典型类库与工具”| 类库 | 语言 | 说明 |
|---|---|---|
| Transformers (Hugging Face) | Python | NLP 生态核心库,提供数万预训练模型和 pipeline 接口 |
| jieba | Python | 最流行的中文分词库,支持精确/全/搜索引擎三种模式 |
| NLTK | Python | 经典 NLP 教学库,提供分词、词性标注、句法分析等 |
| spaCy | Python/Cython | 工业级 NLP 库,速度快,内置多语言模型 |
| HanLP | Java/Python | 中文 NLP 综合库,覆盖分词、命名实体识别、依存分析 |
| SentencePiece | C++/Python | Google 的跨语言子词分词框架,支持 BPE 和 Unigram |
| Flair | Python | 基于上下文嵌入的 NLP 库,擅长 NER 任务 |
| gensim | Python | word2vec/doc2vec 训练与加载,主题模型 LDA |
| tiktoken | Python | OpenAI 开源的高效 BPE 分词器,GPT 系列使用 |
| 术语 | 英文 | 解释 |
|---|---|---|
| 分词 | Tokenization | 将文本切分为词、子词或字符等基本处理单元 |
| 词嵌入 | Word Embedding | 将词语映射为稠密向量,使语义关系体现为向量空间距离 |
| 子词 | Subword | 介于词和字符之间的单元,BPE/WordPiece 的分词粒度 |
| OOV | Out-of-Vocabulary | 词表中不存在的词,是词级分词的主要痛点 |
| 负采样 | Negative Sampling | word2vec 中用少量随机负例近似全词表 softmax 的加速技巧 |
| 命名实体识别 | NER | 从文本中识别人名、地名、机构名等实体的序列标注任务 |
| 词性标注 | POS Tagging | 为文本中每个词标注词性(名词/动词/形容词等) |
| TF-IDF | Term Frequency-Inverse Document Frequency | 衡量词在文档中重要性的经典统计方法 |
| 注意力机制 | Attention | 让模型动态关注输入中最相关部分的核心机制 |
| 上下文嵌入 | Contextual Embedding | 同一个词在不同上下文中产生不同向量的嵌入方式 |
| 零样本 | Zero-shot | 模型在未经专门训练的任务上直接推理的能力 |
| 检索增强生成 | RAG (Retrieval-Augmented Generation) | 先检索相关文档再喂给 LLM 生成的架构范式 |
- 分词算法谱系:词级(空格/规则切分)→ BPE(Sennrich 2016,合并高频字节对)→ WordPiece(Schuster 2012,BERT 采用)→ SentencePiece(Kudo 2018,跨语言统一方案)。现代大语言模型几乎全部使用 BPE 或 SentencePiece。
- 词嵌入谱系:word2vec(Mikolov 2013,CBOW/Skip-gram)→ GloVe(Pennington 2014,全局矩阵分解)→ ELMo(Peters 2018,上下文嵌入)→ BERT(Devlin 2018,双向 Transformer 嵌入)。从静态到动态,是理解 NLP 进化的主线。
- 机器翻译谱系:规则翻译(1950s–1980s,人工编写翻译规则)→ 统计机器翻译 IBM Model 1–5(1990s,基于双语语料统计概率)→ 神经机器翻译 Seq2Seq+Attention(2014,Bahdanau)→ Transformer(2017,Vaswani),翻译质量逐代飞跃。深入解析见Transformer 架构。
- 深度学习语言模型:从 RNN/LSTM 到 Transformer 的架构演进见RNN 循环神经网络与Transformer 架构;大语言模型的训练、能力与应用见语言模型演进。