tokenizer.encode_plus,BERT类模型 和 Sentence-BERT 他们之间的区别与联系
🌱 一句话总结
tokenizer.encode_plus
:是预处理器,把句子变成模型能读的数字。- BERT 类模型:是语义理解机器,输入这些数字,输出每个词或整句话的“理解结果”(向量)。
- Sentence-BERT(SBERT):是用 BERT 改造的句子级向量提取器,能把整句话变成一个语义向量,适合“语义相似度”“检索”类任务。
🧱 分别是什么?怎么联系在一起的?
工具 | 是什么 | 输入 | 输出 | 用来干嘛 |
---|---|---|---|---|
tokenizer.encode_plus | 把文字 → 编码(token id)+ 掩码(mask) | 文本句子 | input_ids , attention_mask | 给模型准备输入 |
BERT | 语言模型本体(不懂语义→懂语义) | 编码后的 input_ids + attention_mask | 每个 token 的向量 | 常用于分类、NER、问答等 |
Sentence-BERT | 用 BERT 改造的“句子向量”模型 | 原始句子 | 一个句子向量(通常是768维或384维) | 相似度计算、语义检索、聚类 |
📌 联系流程示意图(简化版):
一般 BERT 流程:
tokens = tokenizer.encode_plus("我喜欢吃苹果")
outputs = model(**tokens)
print(outputs.last_hidden_state.shape) # [1, seq_len, 768]
➤ 输出的是每个词的向量(比如“我”、“喜欢”、“吃”、“苹果”都有一个向量)
Sentence-BERT 流程:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")sentence_vec = model.encode("我喜欢吃苹果")
print(sentence_vec.shape) # (384,)
➤ 输出的是整句话的语义向量
🍎 举个例子
任务:找“我想吃水果”和“我喜欢苹果”是不是一个意思?
如果你用 BERT:
- 你要写很多额外代码来对比两个句子向量(比如平均池化、CLS提取、再计算余弦相似度)
- 不方便、不准
如果你用 Sentence-BERT:
- 直接两个
.encode()
出句子向量 - 然后
.cosine_similarity(vec1, vec2)
就能判断相似度 - 高效、准确!
✅ 总结对比:
方面 | tokenizer.encode_plus | BERT | Sentence-BERT |
---|---|---|---|
类型 | 预处理器 | 模型架构 | 特化模型 |
输出 | Token id + mask | 每个 token 的向量 | 整句的向量 |
用途 | 模型输入准备 | 分类/问答/NER等 | 相似度/检索/聚类 |
是否理解整句语义 | ❌ | 部分 | ✅ 强化了整句理解 |