Python BERT 向量化入门指南
一、流程图一览(30 秒看懂)
否 是 数据准备 是否安装依赖? 安装依赖 加载BERT模型 批量处理文本 向量化文本 输出向量
Tips :照着流程图一步一步敲,零深度学习背景也能跑通!
二、Step-0 环境准备(1 分钟)
bash
# 创建虚拟环境(可选,强烈建议)
conda create -n bert_py38 python=3.8 -y
conda activate bert_py38
# 安装依赖(清华镜像加速)
pip install -U transformers torch -i https://pypi.tuna.tsinghua.edu.cn/simple
验证安装:
python
import torch, transformers
print(torch.__version__, transformers.__version__)
# 2.1.2 4.40.0
三、Step-1 数据准备(10 秒)
python
# 任意中文文本即可
texts = ["你好",
"今天的天气怎么样",
"BERT 是一种很厉害的模型"]
生产环境直接替换成
df['comment'].tolist()
即可,无需分词、去停用词!
四、Step-2 加载 BERT 中文模型(20 秒)
python
from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertModel.from_pretrained('bert-base-chinese')
国内下载慢?
bash
export HF_ENDPOINT=https://hf-mirror.com
再跑代码,速度×10!
五、Step-3 批量分词(Attention Mask 一并生成)
python
import torch
# padding=True → 自动补零
# truncation=True → 超长截断
# return_tensors='pt' → 返回 PyTorch 张量
inputs = tokenizer(texts,
padding=True,
truncation=True,
return_tensors='pt')
print(inputs.keys())
# dict_keys(['input_ids', 'token_type_ids', 'attention_mask'])
字段 | 形状 | 含义 |
---|---|---|
input_ids | (batch_size, seq_len) | 每个 token 的编号 |
attention_mask | (batch_size, seq_len) | 1 表示真 token,0 表示 pad |
六、Step-4 向量化(核心 3 行)
python
with torch.no_grad(): # 推理模式,节省内存
outputs = model(**inputs) # 前向传播
last_hidden_state = outputs.last_hidden_state # 所有 token 向量
print(last_hidden_state.shape) # torch.Size([3, 11, 768])
# 3 条文本,11 是最大长度,768 是向量维度
七、Step-5 提取句向量(拿 [CLS] token)
BERT 在预训练时把分类任务 的符号 [CLS]
放在句首,它的向量 = 整句语义!
python
cls_embeddings = last_hidden_state[:, 0, :] # 第 0 列就是 [CLS]
print(cls_embeddings.shape) # torch.Size([3, 768])
print(cls_embeddings)
输出示例:
tensor([[-0.2314, 0.1921, ..., 0.1245],
[-0.2819, 0.2103, ..., -0.0754],
[-0.2547, 0.1938, ..., 0.0827]])
八、关系图(变量之间到底啥关系?)
graph LR
TEXTS -->|tokenizer| INPUT_IDS
INPUT_IDS -->|BERT_MODEL| LAST_HIDDEN
LAST_HIDDEN -->|切片 [:,0,:]| CLS_EMB
一句话记忆:TEXTS → INPUT_IDS → BERT → 切片 → 句向量
九、一键封装函数(以后直接 import)
python
def bert_encode(texts, model, tokenizer):
inputs = tokenizer(texts, padding=True, truncation=True,
return_tensors='pt')
with torch.no_grad():
outputs = model(**inputs)
return outputs.last_hidden_state[:, 0, :] # [CLS] 向量
# 调用
vec = bert_encode(["明天会下雨吗"], model, tokenizer)
print(vec.shape) # torch.Size([1, 768])
十、常见报错急救包
报错 | 原因 | 解决 |
---|---|---|
CUDA out of memory |
批太大 | 加 device='cpu' 或降 batch |
403 Client Error |
镜像失效 | export HF_ENDPOINT=https://hf-mirror.com |
维度看不懂 | 打印 shape | 记住 (batch, seq_len, 768) |
中文乱码 | Windows 终端 | 换 VSCode / Jupyter |
十一、下一步能干嘛?(进阶路线图)
- 相似度 :
cosine_similarity(vec1, vec2)
- 聚类 :
KMeans(n_clusters=10).fit(cls_embeddings)
- 检索 :
faiss.IndexFlatIP(768)
毫秒级搜百万向量 - 分类 :把
cls_embeddings
喂给sklearn
的LogisticRegression
十二、总结(一句话记住)
"tokenizer 先分词,BERT 再编码,切片 [:,0,:] 拿句向量!"
全文代码 ≤ 30 行,复制即可跑通。
🏷 标签
#BERT #向量化 #CLS #transformers #PyTorch #中文 #入门 #保姆级