【AI总结】Python BERT 向量化入门指南

#『AI先锋杯·14天征文挑战第5期』#

Python BERT 向量化入门指南


一、流程图一览(30 秒看懂)

数据准备
是否安装依赖?
安装依赖
加载BERT模型
批量处理文本
向量化文本
输出向量

Tips:照着流程图一步一步敲,零深度学习背景也能跑通!


二、Step-0 环境准备(1 分钟)

# 创建虚拟环境(可选,强烈建议)
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

验证安装:

import torch, transformers
print(torch.__version__, transformers.__version__)
# 2.1.2 4.40.0

三、Step-1 数据准备(10 秒)

# 任意中文文本即可
texts = ["你好",
         "今天的天气怎么样", 
         "BERT 是一种很厉害的模型"]

生产环境直接替换成 df['comment'].tolist() 即可,无需分词、去停用词


四、Step-2 加载 BERT 中文模型(20 秒)

from transformers import BertTokenizer, BertModel

tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertModel.from_pretrained('bert-base-chinese')

国内下载慢?

export HF_ENDPOINT=https://hf-mirror.com

再跑代码,速度×10!


五、Step-3 批量分词(Attention Mask 一并生成)

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 行)

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] 放在句首,它的向量 = 整句语义!

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)

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

十一、下一步能干嘛?(进阶路线图)

  1. 相似度cosine_similarity(vec1, vec2)
  2. 聚类KMeans(n_clusters=10).fit(cls_embeddings)
  3. 检索faiss.IndexFlatIP(768) 毫秒级搜百万向量
  4. 分类:把 cls_embeddings 喂给 sklearnLogisticRegression

十二、总结(一句话记住)

“tokenizer 先分词,BERT 再编码,切片 [:,0,:] 拿句向量!”

全文代码 ≤ 30 行,复制即可跑通。


🏷 标签

#BERT #向量化 #CLS #transformers #PyTorch #中文 #入门 #保姆级

### BERT实现词向量化与文本向量化的方法 #### 方法概述 BERT(Bidirectional Encoder Representations from Transformers)是一种强大的预训练语言模型,能够生成高质量的词向量和文本向量。通过微调或直接使用其隐藏层输出,可以有效捕捉语义信息并用于各种自然语言处理任务。 #### 词向量化过程 在BERT中,每个输入token会被映射为其对应的嵌入表示。具体来说,BERT会将输入序列转换为一系列固定维度的向量[^1]。这些向量可以通过以下方式获得: - **Token Embeddings**: 输入中的每一个单词都会被转化为一个固定的embedding。 - **Positional Encodings**: 添加位置编码以保留顺序信息。 - **Segment Embeddings**: 如果存在多个句子,则标记它们属于哪个部分。 最终得到的是每一层Transformer后的隐状态矩阵 \( H \in R^{T \times D} \),其中\( T \) 是tokens数量,而\( D \) 则是hidden size大小。通常可以选择最后一层作为词语级别的特征表示[^2]。 ```python from transformers import BertTokenizer, BertModel import torch tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') model = BertModel.from_pretrained('bert-base-chinese') text = "我喜欢学习人工智能" encoded_input = tokenizer(text, return_tensors='pt', padding=True, truncation=True) with torch.no_grad(): output = model(**encoded_input) word_embeddings = output.last_hidden_state # 获取最后一个隐藏层的状态 print(word_embeddings.shape) # 输出形状应类似于(batch_size, sequence_length, hidden_dim) ``` 上述代码展示了如何加载预训练好的`bert-base-chinese`模型,并提取给定中文字符串各token的最后一层隐藏态作为词向量。 #### 文本向量化过程 对于整个文档或者较长片段而言,可以直接取特殊分类符 `[CLS]` 对应的位置处的向量当作整体文本表征;然而这种方法可能不够精确因为仅依赖单个点不足以概括全文含义。另一种更优的方式是对所有token的结果求平均值得到全局描述子: \[ \text{Text Vector} = mean(H_{i}) , i=0,...,N-1\] 这里 N 表示实际有效的 token 数目(不包括填充的部分). 另外还有专门针对句间关系建模优化过的版本如Sentence-BERT(SBERT), 它通过对偶样本对比学习调整原始BERT内部机制从而更适合做短文本匹配类工作. ```python sentence_embedding = word_embeddings.mean(dim=1).squeeze() print(sentence_embedding.shape) # 应该返回(hidden_dim,) ``` 以上脚本演示了怎样计算一段话的整体表达形式. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝吻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值