NLP 教程
NLP 教程
自然语言处理(Natural Language Processing,NLP)是人工智能的重要分支,让计算机理解、生成和处理人类语言,是 ChatGPT 等大模型的核心技术。
本教程包含
- 基础篇:NLP 简介、语言学基础、文本预处理、文本表示
- 任务篇:文本分类、情感分析、命名实体识别、关系抽取、相似度
- 模型篇:RNN、注意力机制、Transformer、Seq2Seq、预训练模型、BERT、GPT
- 工程篇:Python NLP 生态、深度学习框架、数据处理工具
NLP 的应用
机器翻译 Google 翻译
智能客服 对话机器人
搜索引擎 Query 理解
语音助手 语音转文字+理解
舆情分析 情感分析
文本生成 ChatGPT / 新闻写作NLP 简介
NLP 简介
NLP 研究如何让计算机理解人类语言,融合语言学、计算机科学与机器学习。
NLP 的核心任务
词法分析: 分词、词性标注
句法分析: 依存分析、成分分析
语义理解: 语义角色、意图识别
信息抽取: 实体识别、关系抽取
文本生成: 摘要、翻译、对话
问答系统: 阅读理解、知识问答
发展历程
1950s-1980s 规则方法(人工编写规则)
1990s-2010s 统计方法(HMM、CRF、朴素贝叶斯)
2013-2018 深度学习(Word2Vec、LSTM)
2018-2023 Transformer 时代(BERT、GPT)
2023-now 大语言模型(ChatGPT、多模态)
NLP 的挑战
歧义: 一词多义、句法歧义
上下文: 指代消解、省略
口语化: 语法不规范
多语言: 低资源语言
常识: 缺乏世界知识
为什么重要
文本数据占人类信息量的 80%+,NLP 是连接人类知识与人工智能的桥梁。
语言学基础
语言学基础
理解语言学的基本层次,是学习 NLP 的重要铺垫。
语言学的层次
音系学 语音单位与发音
形态学 词的形成(词根/词缀)
词汇学 词汇系统
句法学 句子结构规则
语义学 意义
语用学 语境中的使用
词法单位
语素: 最小的意义单位
自由语素: 可独立成词(book)
粘着语素: 需附着(books 的 -s)
词: 最小的独立运用单位
词组: 词的有意义组合
句法结构
主语 + 谓语 + 宾语(中文基本结构)
"小明 吃 苹果"
名词短语(NP): 小明
动词短语(VP): 吃苹果
依存关系:
吃 → 主语: 小明
吃 → 宾语: 苹果
语义关系
同义词: 高兴/开心
反义词: 大/小
上下位: 动物 ⊃ 狗
多义词: 苹果(水果/公司)
语义角色: 施事/受事/工具
与 NLP 的对应
形态学 → 词干提取、词形还原
句法学 → 句法分析器
语义学 → 语义角色标注
语用学 → 对话系统、意图识别文本预处理
文本预处理
文本预处理把原始文本清洗成模型可用的形式,是 NLP 流程的第一步。
预处理流程
原始文本 → 清洗 → 分词 → 去除停用词 → 规范化 → 表示
文本清洗
import re
def clean_text(text):
text = text.lower() # 小写
text = re.sub(r"<[^>]+>", "", text) # 去HTML标签
text = re.sub(r"[^\w\s一-鿿]", "", text) # 去标点
text = re.sub(r"\s+", " ", text) # 合并空白
return text.strip()
分词
# 英文: 空格分词即可
tokens = text.split()
# 中文: 需要专门分词工具
import jieba
words = jieba.cut("我爱自然语言处理")
print(list(words)) # ['我', '爱', '自然语言', '处理']
# jieba 精确模式
list(jieba.cut("小明毕业于清华大学", cut_all=False))
# ['小明', '毕业', '于', '清华大学']
去除停用词
STOP_WORDS = {"的", "了", "和", "是", "在", "the", "a", "is"}
filtered = [w for w in words if w not in STOP_WORDS and w.strip()]
词形还原与词干提取
# 词形还原(英文,还原到原形)
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
lemmatizer.lemmatize("running") # run
# 词干提取(粗粒度)
from nltk.stem import PorterStemmer
PorterStemmer().stem("running") # run
中文专用处理
# 全角转半角、繁简转换(opencc)
# 新词发现、专有名词词典
# 中文编码统一 UTF-8文本表示方法
文本表示方法
把文本转换为数值向量,是机器学习模型处理文本的前提。
One-Hot 编码
词表: [苹果, 香蕉, 橘子]
苹果 → [1, 0, 0]
香蕉 → [0, 1, 0]
问题: 维度爆炸、无语义关系
词袋模型(Bag of Words)
from sklearn.feature_extraction.text import CountVectorizer
texts = ["我爱编程", "我爱学习"]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(texts) # 词频矩阵
TF-IDF(加权词频)
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
X = tfidf.fit_transform(texts)
# 思想: 词在文档中频繁(TF)但在全语料少见(IDF)则重要
# 应用: 关键词提取、文档检索
词嵌入(Word Embedding)
# Word2Vec: 分布式表示,捕获语义
# 国王 - 男人 + 女人 ≈ 女王
from gensim.models import Word2Vec
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1)
model.wv.most_similar("苹果") # 语义相近词
上下文表示(现代)
ELMo / BERT: 根据上下文动态生成词向量
同一词在不同句子中向量不同
"苹果"在"吃苹果"和"苹果公司"中表示不同
句子表示
词向量平均/池化
TF-IDF 加权平均
现代: CLS 向量(BERT)、句子嵌入(SimCSE)文本分类
文本分类
文本分类是 NLP 最基础的任务:给文本打标签(主题、意图、类别)。
任务定义
输入: 一段文本
输出: 类别标签
示例: 新闻分类、垃圾邮件检测、意图识别
传统方法流程
1. 预处理: 清洗、分词
2. 特征: TF-IDF 向量
3. 模型: 朴素贝叶斯 / SVM / 逻辑回归
from sklearn.pipeline import Pipeline
from sklearn.naive_bayes import MultinomialNB
model = Pipeline([
("tfidf", TfidfVectorizer()),
("clf", MultinomialNB()),
])
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
深度学习方法
# 简单 CNN/RNN 分类
# 现代: 预训练模型微调
from transformers import pipeline
classifier = pipeline("text-classification",
model="distilbert-base-uncased")
result = classifier("This movie is great!")
# [{'label': 'POSITIVE', 'score': 0.99}]
评估指标
准确率 accuracy 整体正确率
精确率 precision 预测为正的准确性
召回率 recall 正类被找出的比例
F1 精确率与召回率的调和平均
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))
类别不平衡处理
过采样(SMOTE)/ 欠采样
类别权重(class_weight="balanced")
使用 F1 宏平均而非 accuracy情感分析
情感分析
情感分析判断文本的情绪倾向(正面/负面/中性),是 NLP 商业应用最广的任务。
任务类型
二分类: 正面/负面
三分类: 正面/中性/负面
细粒度: 1-5 星评分
方面级: "屏幕好但电池差"(针对不同方面)
基于词典的方法
# 情感词典: 词 → 情感分值
SENTIMENT = {"好": 1, "棒": 1, "差": -1, "烂": -1, "还行": 0.5}
def rule_score(text):
total = sum(SENTIMENT.get(w, 0) for w in text.split())
return "正面" if total > 0 else ("负面" if total < 0 else "中性")
# 工具: SnowNLP(中文简单情感)、知网情感词典
机器学习方法
# 特征 + 分类器(与文本分类相同)
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
# 训练数据: 带标签评论
深度学习方法
# LSTM / BERT 微调
# transformers 现成管线
sentiment = pipeline("sentiment-analysis")
print(sentiment("这部电影太精彩了!"))
# SnowNLP(中文)
from snownlp import SnowNLP
s = SnowNLP("这家店服务态度很好")
print(s.sentiments) # 0.98(接近1为正面)
应用场景
电商评价分析
舆情监控
客服满意度
金融新闻情绪(量化交易)
社交平台口碑
挑战
讽刺与反语、网络新词
多语言情感
细粒度方面级情感
领域差异(同一词在不同领域情感不同)命名实体识别(NER)
命名实体识别(NER)
NER 从文本中识别出具有特定意义的实体(人名、地名、组织等)。
任务定义
输入: "小王在清华大学学习计算机"
输出: [小王](人名) 在 [清华大学](组织) 学习计算机
常见实体类型:
PER 人名 LOC 地点 ORG 组织
GPE 国家/城市 DATE 日期 MONEY 金额
标注格式(BIO)
小 B-PER
王 I-PER
在 O
清 B-ORG
华 I-ORG
大 I-ORG
学 I-ORG
B-实体开始 I-实体内部 O-非实体
传统方法(CRF)
# 特征工程 + 条件随机场
# sklearn-crfsuite / 汉语言工具
import sklearn_crfsuite
crf = sklearn_crfsuite.CRF()
crf.fit(X_train, y_train) # X为特征序列
深度学习方法
# BiLSTM-CRF 经典结构
# 现代: BERT + CRF 微调
import spacy
nlp = spacy.load("zh_core_web_sm")
doc = nlp("比尔·盖茨创立了微软公司")
for ent in doc.ents:
print(ent.text, ent.label_) # 比尔·盖茨 PERSON, 微软 ORG
HuggingFace 管线
from transformers import pipeline
ner = pipeline("token-classification",
model="dbmdz/bert-large-cased-finetuned-conll03-english")
result = ner("Apple Inc. is based in Cupertino.")
# 识别 Apple、Cupertino
应用
信息抽取、知识图谱构建
搜索引擎实体链接
金融/医疗文本结构化
日志/合同智能解析
挑战
实体嵌套、跨行实体
中文无空格边界
领域实体(药品名、代码名)
低资源语言关系抽取
关系抽取
关系抽取识别实体之间的语义关系,是知识图谱构建的核心。
任务定义
输入: "乔布斯创立了苹果公司"
输出: (乔布斯, 创立, 苹果公司)
即: (实体1, 关系, 实体2)
常见关系: 创立、任职、位于、出生于、属于...
流水线方法
1. NER 识别实体
2. 对实体对进行关系分类
# 规则模板
PATTERNS = [
(r"(.*)创立了(.*)", "创始人"),
(r"(.*)位于(.*)", "地理位置"),
]
def extract_relations(text):
for pattern, rel in PATTERNS:
m = re.match(pattern, text)
if m:
return [(m.group(1), rel, m.group(2))]
return []
监督学习方法
# 特征: 实体间词、依赖路径、实体类型
# 模型: 分类器判断关系类别
# 数据: 标注的实体对+关系(如 SemEval 数据集)
深度学习方法
# 端到端: 抽取实体+关系(联合模型)
# 现代: 生成式方法(用 T5/GPT 生成三元组)
from transformers import pipeline
# 如 UniRE、CasRel 等模型
# 提示词方法: 让大模型输出关系
远程监督(远监督)
利用知识库(如 Wikidata)自动标注
对齐文本与知识库三元组生成训练数据
噪声大,需去噪处理
应用
知识图谱构建
搜索引擎知识卡
金融风险关联分析
医疗药物相互作用发现
与大模型结合(现代主流)
# 用 LLM 抽取
prompt = """从文本中抽取关系三元组:
文本: 特斯拉CEO马斯克出生于南非
输出: (马斯克, 担任CEO, 特斯拉)"""
# 少样本即可工作,成为当前主流方案文本相似度计算
文本相似度计算
文本相似度衡量两段文本的语义接近程度,应用广泛(检索、去重、推荐)。
常见场景
搜索引擎: 查询与文档相关度
论文查重: 文档去重
问答系统: 问题匹配
推荐系统: 内容相似推荐
基于词重叠(传统)
# Jaccard 相似度
def jaccard(a, b):
set_a, set_b = set(a), set(b)
return len(set_a & set_b) / len(set_a | set_b)
# 余弦相似度(TF-IDF 向量)
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer()
X = vec.fit_transform(["我喜欢猫", "我喜爱猫"])
print(cosine_similarity(X[0], X[1]))
编辑距离
# Levenshtein 距离: 最少编辑次数
import Levenshtein
print(Levenshtein.distance("kitten", "sitting")) # 3
基于向量(深度学习)
# 句向量 + 余弦相似度
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")
emb1 = model.encode("今天天气很好")
emb2 = model.encode("今天阳光明媚")
# 计算余弦相似度
# 中文可用: text2vec、BGE 等模型
Jaccard / 余弦 / 向量对比
Jaccard: 词集重叠,忽略语义
TF-IDF余弦: 词频加权,稍好
句向量: 捕获语义,处理同义改写(最优)
评估
与人工标注相关度对比(皮尔逊相关系数)
STS(语义文本相似度)基准数据集循环神经网络(RNN)
循环神经网络(RNN)
RNN 是处理序列数据的经典神经网络,专为文本、时间序列等顺序数据设计。
RNN 核心思想
隐藏状态随时间步传递:
h(t) = f(W_h * h(t-1) + W_x * x(t) + b)
每个时刻的输出依赖前面的信息(记忆)
简单 RNN 实现
import torch
import torch.nn as nn
rnn = nn.RNN(input_size=100, hidden_size=64, batch_first=True)
x = torch.randn(32, 10, 100) # (batch, 序列长度, 特征)
output, h_n = rnn(x)
# output: 每个时刻输出 (32, 10, 64)
# h_n: 最终隐藏状态 (1, 32, 64)
LSTM(长短期记忆)
# 解决 RNN 长序列梯度消失问题
# 引入遗忘门、输入门、输出门、细胞状态
lstm = nn.LSTM(input_size=100, hidden_size=64, batch_first=True)
output, (h_n, c_n) = lstm(x)
GRU(门控循环单元)
# LSTM 简化版,参数更少,效果相当
gru = nn.GRU(input_size=100, hidden_size=64, batch_first=True)
双向 RNN
# 同时考虑前文和后文(全文信息)
bidirectional = nn.LSTM(input_size=100, hidden_size=64,
bidirectional=True, batch_first=True)
# 输出维度翻倍: hidden_size * 2
RNN 应用
文本分类: 取最终状态/池化
序列标注: 每个时刻输出(NER/词性)
生成: 语言模型、翻译
时间序列: 预测
RNN 的局限
长距离依赖困难(仍有限制)
无法并行(串行计算,慢)
现代方案: Transformer(见后续章节)注意力机制
注意力机制
注意力机制让模型动态聚焦输入中的重要部分,是 Transformer 的核心组件。
核心思想
人类阅读时会关注重点词
注意力: 对输入各部分加权求和
权重 = 当前状态与各部分的相关度
"我喜欢编程" 查询"爱好"时:
我:0.1 喜欢:0.3 编程:0.6(重点)
注意力计算流程
1. 查询(Query)与每个键(Key)计算相关度
2. softmax 归一化为权重
3. 权重与值(Value)加权求和
Attention(Q, K, V) = softmax(QK^T / √d) V
自注意力(Self-Attention)
# Q=K=V=句子本身,计算词与词的关系
import torch
import torch.nn.functional as F
def self_attention(x):
d = x.shape[-1]
scores = torch.matmul(x, x.transpose(-2, -1)) / (d ** 0.5)
weights = F.softmax(scores, dim=-1)
return torch.matmul(weights, x)
多头注意力(Multi-Head)
# 多个注意力头,各自关注不同关系
# 语法关系、指代关系、语义关系...
multihead = nn.MultiheadAttention(embed_dim=64, num_heads=8)
注意力可视化
"The animal didn't cross the street because it was too tired"
"it" 与 "animal" 的注意力权重很高
(指代消解的经典例子)
作用
长距离依赖: 直接计算任意两词关系
并行计算: 不受序列顺序限制
可解释性: 权重可视化Transformer 架构
Transformer 架构
Transformer(2017, Attention Is All You Need)是当前 NLP 的基石,所有大模型的基础。
架构总览
Encoder(编码器):
输入嵌入 + 位置编码
→ 多头自注意力
→ 前馈网络(FFN)
→ 残差连接 + 层归一化
(重复 N 层)
Decoder(解码器):
类似 Encoder + 掩码自注意力 + 交叉注意力
核心组件
1. 多头注意力: 捕获词间关系
2. 位置编码: 注入顺序信息(正弦编码/学习嵌入)
3. 前馈网络: 逐位置的非线性变换(MLP)
4. 残差连接: 缓解梯度消失
5. LayerNorm: 稳定训练
为什么 Transformer 胜出
并行计算(RNN 无法并行)
全局依赖(任意距离直接关联)
可扩展(堆叠更多层、更大数据)
self-attention 复杂度 O(n²),长文本受限
PyTorch 实现
import torch.nn as nn
transformer = nn.Transformer(
d_model=512,
nhead=8,
num_encoder_layers=6,
num_decoder_layers=6,
)
变体
BERT: 仅 Encoder(理解类任务)
GPT: 仅 Decoder(生成类任务)
T5: Encoder-Decoder(统一任务)
高效注意力(大模型时代)
FlashAttention(显存优化)
稀疏注意力(Longformer)
线性注意力(Linear Attention)
KV-Cache(推理加速)序列到序列模型
序列到序列模型(Seq2Seq)
Seq2Seq 把输入序列映射为输出序列,是翻译、摘要、对话的基础架构。
任务定义
输入: "Hello world" → 输出: "你好世界"
架构: Encoder 编码输入 → Decoder 生成输出
典型任务:
机器翻译、文本摘要、对话生成
语音识别、代码生成
经典架构(Encoder-Decoder)
Encoder: 把输入序列编码为上下文向量
Decoder: 基于上下文逐步生成输出
RNN 时代: Encoder LSTM → Decoder LSTM
现代: Transformer 全架构
PyTorch 实现骨架
import torch.nn as nn
class Seq2Seq(nn.Module):
def __init__(self, encoder, decoder):
super().__init__()
self.encoder = encoder
self.decoder = decoder
def forward(self, src, tgt):
context = self.encoder(src)
output = self.decoder(tgt, context)
return output
解码策略(生成)
贪心解码: 每步取概率最大词
束搜索(Beam Search): 保留 Top-k 候选
采样: 按概率随机(增加多样性)
# HuggingFace 使用
from transformers import pipeline
translator = pipeline("translation", model="Helsinki-NLP/opus-mt-zh-en")
print(translator("今天天气真好"))
# [{'translation_text': 'The weather is really nice today.'}]
注意力在 Seq2Seq 中
解码每一步关注源序列相关部分
解决长句子信息瓶颈
Attention 机制正是源于 Seq2Seq 翻译任务
评估
翻译: BLEU 分数(与参考译文 n-gram 重合)
摘要: ROUGE 分数(召回率导向)
对话: 人工评估/多样性指标预训练模型
预训练模型
预训练模型在海量文本上训练通用语言能力,下游任务只需微调,彻底改变了 NLP 范式。
范式转变
传统: 每个任务从头训练(需要大量标注)
现代: 预训练(通用) + 微调(任务)
预训练: 在数十亿网页文本上学习语言
微调: 少量任务数据调整参数
预训练任务
掩码语言模型(MLM): 遮盖部分词让模型预测(BERT)
下一句预测(NSP): 判断两句是否相邻(BERT)
自回归: 预测下一个词(GPT)
对比学习: 相似句对靠近(SimCSE)
HuggingFace 生态
from transformers import AutoModel, AutoTokenizer
model_name = "bert-base-chinese"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
texts = ["我爱自然语言处理", "AI 改变世界"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
outputs = model(**inputs)
embeddings = outputs.last_hidden_state
微调流程
1. 加载预训练模型
2. 加任务头(分类层等)
3. 用任务数据训练(小学习率)
4. 评估与部署
# Trainer API(transformers)
from transformers import Trainer, TrainingArguments
training_args = TrainingArguments(output_dir="./results")
trainer = Trainer(model=model, args=training_args,
train_dataset=train_ds)
trainer.train()
为什么有效
海量数据学到通用语言知识
知识可迁移到各任务
少样本也能取得好效果
局限
算力与存储成本高
领域差异仍需领域数据
偏见与安全问题BERT 系列模型
BERT 系列模型
BERT(2018, Google)是双向 Transformer 编码器,开启了预训练+微调时代。
核心设计
架构: 多层双向 Transformer Encoder
预训练任务:
MLM(掩码语言模型): 15% 词被掩码预测
NSP(下一句预测): 判断句子关系
特点: 双向上下文(理解能力强)
使用示例
from transformers import BertTokenizer, BertForSequenceClassification
model_name = "bert-base-chinese"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)
inputs = tokenizer("这部电影真好看", return_tensors="pt")
outputs = model(**inputs)
logits = outputs.logits
主流变体
BERT-base: 12 层, 1.1 亿参数
BERT-large: 24 层, 3.4 亿参数
RoBERTa: 更大数据,去掉NSP,更强
ALBERT: 参数共享,更轻量
DistilBERT: 蒸馏,速度快
中文:
bert-base-chinese
RoBERTa-wwm-ext(哈工大)
ERNIE(百度,知识增强)
MacBERT(中文纠错)
应用任务
文本分类、NER、情感分析
问答(SQuAD)
句子对匹配(相似度、推理)
序列标注(分词、词性)
微调技巧
小学习率(2e-5 ~ 5e-5)
小 batch(防止 OOM)
冻结底层+微调顶层
多轮训练避免过拟合
梯度累积处理大模型
BERT 的局限
输入长度限制(通常 512)
生成任务弱(编码器架构)
推理较慢(与蒸馏/量化缓解)生成式预训练模型
生成式预训练模型(GPT)
GPT 系列是自回归生成模型,从 GPT-1 到 GPT-4,再到 ChatGPT,引领了生成式 AI 浪潮。
发展历程
GPT-1 (2018) 1.1 亿参数,预训练+微调
GPT-2 (2019) 15 亿参数,零样本生成
GPT-3 (2020) 1750 亿参数,少样本学习
InstructGPT (2022) 人类反馈强化学习(RLHF)
ChatGPT (2022) 对话优化,爆火全球
GPT-4 (2023) 多模态,更强推理
核心思想
架构: 仅 Decoder 的 Transformer(自回归)
任务: 预测下一个词(Next Token Prediction)
能力: 学习语言模式,涌现推理能力
"今天天气" → 预测 → "很好"
提示工程(Prompt)
from openai import OpenAI
client = OpenAI(api_key="sk-xxx")
resp = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "你是中文写作助手"},
{"role": "user", "content": "写一首关于秋天的诗"},
],
)
print(resp.choices[0].message.content)
RLHF(人类反馈强化学习)
1. 监督微调(SFT): 高质量指令数据训练
2. 奖励模型(RM): 学习人类偏好排序
3. 强化学习(PPO): 优化策略对齐人类
作用: 让模型有用、诚实、无害
应用
对话助手(ChatGPT)
代码生成(Copilot/Codex)
内容创作(写作、营销)
翻译摘要、知识问答
Agent 智能体
开源模型
LLaMA / LLaMA2/3 (Meta)
Qwen 通义千问(阿里)
DeepSeek(深度求索)
ChatGLM(智谱)
Mistral / Falcon / Yi
挑战
幻觉(编造事实)
安全与对齐
推理成本
上下文长度限制
评估与可控性多模态预训练模型
多模态预训练模型
多模态模型同时理解文本、图像、音频、视频,是 AI 的发展方向。
什么是多模态
单一模态: 只有文本(BERT)、只有图像(ResNet)
多模态: 文本+图像+音频+视频融合
输入图片 → 输出文字描述(图像字幕)
输入问题+图片 → 视觉问答(VQA)
代表模型
CLIP (OpenAI): 图文对比学习,零样本分类
BLIP / BLIP2: 图像理解与生成
Flamingo (DeepMind): 少样本多模态
GPT-4V / Gemini: 多模态大模型
Qwen-VL / CogVLM: 中文多模态
音频: Whisper(语音识别)、AudioLM
CLIP 原理
图像编码器 + 文本编码器
对比学习: 匹配的图文对靠近
零样本分类: "a photo of a dog" 与图像比对
from transformers import CLIPModel, CLIPProcessor
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
应用场景
图文检索: 以图搜文/以文搜图
图像字幕: 图片自动描述
视觉问答: 图片+问题→答案
文生图: 文本→图像(Stable Diffusion/DALL-E)
语音助手: 语音理解与生成
视频理解: 视频摘要与检索
文生图示例
# Stable Diffusion
# Prompt: "一只穿宇航服的猫, 油画风格"
# 扩散模型: 从噪声逐步去噪生成图像
# API 方式(如 DALL-E)
resp = client.images.generate(
prompt="a cat in space suit",
n=1, size="1024x1024",
)
挑战与方向
对齐(图文语义对齐)
数据(多模态配对数据)
计算(融合处理成本)
评估(多模态评测基准)Python NLP 生态
Python NLP 生态
Python 拥有最完整的 NLP 工具生态,覆盖从入门到生产全流程。
核心库总览
预处理: jieba(中文分词)、nltk、spaCy
文本表示: gensim(Word2Vec)、sklearn(TF-IDF)
深度学习: PyTorch、TensorFlow
预训练: transformers(HuggingFace)
中文工具: SnowNLP、LTP、HanLP
评估: scikit-learn metrics
jieba(中文分词)
import jieba
jieba.initialize()
words = jieba.cut("我爱自然语言处理", cut_all=False)
print("/".join(words)) # 我/爱/自然语言/处理
# 关键词提取
import jieba.analyse
tags = jieba.analyse.extract_tags("自然语言处理是人工智能的重要领域", topK=3)
print(tags)
spaCy(工业级)
import spacy
nlp = spacy.load("zh_core_web_sm")
doc = nlp("老王住在北京朝阳区")
for token in doc:
print(token.text, token.pos_) # 词形、词性
for ent in doc.ents:
print(ent.text, ent.label_) # 实体
HanLP(中文全面工具)
import hanlp
# 分词、词性、依存、NER 一站式
HanLP = hanlp.pipeline() .append(hanlp.utils.rules.split_sentence) .append(hanlp.load("COARSE_ELECTRA_SMALL_ZH"))
# 简化示例: 加载预训练模型
tokenizer = hanlp.load("PKU_NAME_MERGED_SIX_MONTHS_CONVSEG")
print(tokenizer("我爱自然语言处理"))
NLTK(经典教学库)
import nltk
nltk.download("punkt")
tokens = nltk.word_tokenize("Hello world!")
print(tokens) # ['Hello', 'world', '!']
选型建议
快速原型: jieba + sklearn
工业中文: HanLP / spaCy
深度学习: transformers + PyTorch
生产部署: FastAPI + ONNX/服务化深度学习框架
深度学习框架
NLP 深度模型主要基于 PyTorch 和 TensorFlow,配合 HuggingFace 生态。
PyTorch(推荐,科研主流)
import torch
import torch.nn as nn
# 文本分类模型
class TextClassifier(nn.Module):
def __init__(self, vocab_size, embed_dim, num_classes):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim)
self.lstm = nn.LSTM(embed_dim, 128, batch_first=True)
self.fc = nn.Linear(128, num_classes)
def forward(self, x):
emb = self.embedding(x)
out, _ = self.lstm(emb)
last = out[:, -1, :]
return self.fc(last)
model = TextClassifier(vocab_size=10000, embed_dim=128, num_classes=2)
训练循环
import torch.optim as optim
optimizer = optim.Adam(model.parameters(), lr=1e-3)
loss_fn = nn.CrossEntropyLoss()
for epoch in range(5):
for x, y in dataloader:
optimizer.zero_grad()
logits = model(x)
loss = loss_fn(logits, y)
loss.backward()
optimizer.step()
HuggingFace Transformers
# 统一接口加载 BERT/GPT 等数千模型
from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification
# 一行完成情感分析
classifier = pipeline("sentiment-analysis")
classifier("I love NLP!")
Trainer 高级 API
from transformers import Trainer, TrainingArguments
args = TrainingArguments(
output_dir="./out",
num_train_epochs=3,
per_device_train_batch_size=8,
learning_rate=2e-5,
fp16=True,
)
trainer = Trainer(
model=model,
args=args,
train_dataset=dataset,
)
trainer.train()
trainer.save_model("model/")
框架选型
PyTorch: 研究、灵活性(推荐)
TensorFlow: 生产部署生态
JAX: Google 研究(大模型)
ONNX: 跨框架推理标准
llama.cpp: 本地推理(量化)数据处理工具
数据处理工具
NLP 工程中数据处理占据大量时间,好工具事半功倍。
数据集加载(HuggingFace Datasets)
from datasets import load_dataset
# 加载公开数据集
ds = load_dataset("imdb")
print(ds["train"][0])
# 本地数据
ds = load_dataset("csv", data_files="data.csv")
# 处理(映射函数)
def preprocess(example):
example["tokens"] = tokenizer(example["text"])
return example
ds = ds.map(preprocess)
PyTorch DataLoader
from torch.utils.data import Dataset, DataLoader
class TextDataset(Dataset):
def __init__(self, texts, labels, tokenizer):
self.texts = texts
self.labels = labels
self.tokenizer = tokenizer
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
enc = self.tokenizer(
self.texts[idx],
padding="max_length",
truncation=True,
max_length=128,
return_tensors="pt",
)
return {k: v.squeeze(0) for k, v in enc.items()}, self.labels[idx]
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
Tokenizers 库
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
tokens = tokenizer("我爱NLP", add_special_tokens=True)
# {'input_ids': [101, 2769, 4263, 179, 102], 'attention_mask': [...]}
数据清洗与增强
# 增强技术
同义词替换: "很好"→"非常棒"
回译: 中→英→中
噪声注入: 随机删除/交换词
# 工具: nlpaug
import nlpaug.augmenter.word as naw
aug = naw.SynonymAug(aug_src="wordnet")
augmented = aug.augment("The weather is nice")
数据管理实践
1. 数据版本化(DVC)
2. 标注工具: Label Studio / doccano
3. 数据质量检查与去重
4. 训练/验证/测试划分保持分布一致NLP 总结与展望
NLP 总结与展望
恭喜你完成 NLP 教程!以下是知识回顾与未来方向。
知识体系回顾
- 基础:语言层次、文本预处理(清洗/分词/停用词)
- 表示:One-Hot → TF-IDF → Word2Vec → 上下文向量(BERT)
- 经典任务:分类、情感分析、NER、关系抽取、相似度
- 模型演进:RNN/LSTM → 注意力 → Transformer → 预训练 → 大模型
- 现代范式:预训练+微调、提示工程、RLHF
- 工程:HuggingFace 生态、PyTorch、数据工具
关键认知
1. 数据质量决定上限
2. 先简单方法后复杂模型(基线优先)
3. 预训练模型是当前默认选择
4. 评估指标要匹配业务目标
未来方向
大语言模型: 更大规模、更长上下文、更强推理
多模态: 文本+图像+音频+视频融合
Agent: LLM 驱动的自主智能体
效率: 模型压缩、量化、蒸馏
安全: 对齐、防滥用、可信 AI
垂域: 医疗/法律/金融垂直大模型
学习路线建议
- 掌握 Python + 基础 ML(线性回归/分类)
- 练习传统 NLP(分词、TF-IDF、分类)
- 学习 PyTorch 与 Transformer 原理
- 用 HuggingFace 微调模型完成任务
- 深入大模型(提示工程、微调、RAG)
实践建议
做项目: 情感分析、聊天机器人、RAG 问答
打比赛: Kaggle NLP 竞赛
读论文: 关注 ACL/EMNLP 顶会
开源社区: HuggingFace、GitHub 学习优秀代码
NLP 技术日新月异,但基础原理持久不变。扎实掌握表示学习与 Transformer,就能快速跟上任何新模型。