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
垂域: 医疗/法律/金融垂直大模型

学习路线建议

  1. 掌握 Python + 基础 ML(线性回归/分类)
  2. 练习传统 NLP(分词、TF-IDF、分类)
  3. 学习 PyTorch 与 Transformer 原理
  4. 用 HuggingFace 微调模型完成任务
  5. 深入大模型(提示工程、微调、RAG)

实践建议

做项目: 情感分析、聊天机器人、RAG 问答
打比赛: Kaggle NLP 竞赛
读论文: 关注 ACL/EMNLP 顶会
开源社区: HuggingFace、GitHub 学习优秀代码

NLP 技术日新月异,但基础原理持久不变。扎实掌握表示学习与 Transformer,就能快速跟上任何新模型。

第 1 / 22 节