sentence-transformers
是一個非常流行的 Python 庫,專門用于將文本(句子、段落、文檔)轉換為高質量的語義向量(嵌入)。它基于 Transformer 架構(如 BERT、RoBERTa、DistilBERT 等) 的預訓練模型,并在大量語義相似性數據上進行了微調,能夠捕捉句子之間的深層語義關系。
📦 什么是 sentence-transformers
?
- 項目地址:https://www.sbert.net/
- 作者:Nils Reimers 和 Iryna Gurevych(德國達姆施塔特工業大學)
- 主要功能:
- 將文本轉化為稠密向量(sentence embeddings)
- 支持多種語言
- 支持多任務學習和跨語言檢索
- 底層依賴:基于 PyTorch 和 HuggingFace Transformers
🧠 主要用途
場景 | 描述 |
---|---|
文本相似度計算 | 判斷兩個句子是否語義相似(例如問答系統中的答案匹配) |
聚類 | 對大量文本進行自動聚類(如新聞分類、評論分組) |
信息檢索 | 基于語義的搜索,而非關鍵詞匹配 |
語義搜索 / 向量數據庫 | 結合 FAISS、Annoy 等庫構建高效的語義搜索引擎 |
無監督/弱監督學習 | 在沒有標簽的情況下提取語義特征進行下游任務 |
🚀 安裝方式
pip install sentence-transformers
?? 注意:安裝前確保你已經安裝了 PyTorch,否則可以使用
torch
extra:
pip install sentence-transformers[torch]
🧪 使用示例
示例1:加載模型并編碼句子
from sentence_transformers import SentenceTransformer# 加載預訓練模型(首次運行會自動下載)
model = SentenceTransformer('all-MiniLM-L6-v2')# 待編碼的句子
sentences = ["這是一個示例句子。","另一個句子用來測試。","這兩句話看起來不太一樣。"
]# 編碼成向量(每個句子變成一個固定維度的向量,如 384 維)
embeddings = model.encode(sentences)print(embeddings.shape) # (3, 384)
示例2:計算兩個句子之間的余弦相似度
from sklearn.metrics.pairwise import cosine_similarity# 計算相似度矩陣
similarity_matrix = cosine_similarity(embeddings)print(similarity_matrix)
輸出是一個 3x3 的矩陣,顯示每對句子之間的語義相似度(值范圍在 [0, 1] 之間)。
示例3:使用 GPU 加速推理
import torchdevice = 'cuda' if torch.cuda.is_available() else 'cpu'
model.to(device)embeddings = model.encode(sentences, device=device)
🌐 支持的模型(推薦)
你可以從 HuggingFace Model Hub 上選擇不同類型的模型,以下是幾個常用的:
模型名稱 | 特點 |
---|---|
all-MiniLM-L6-v2 | 輕量級,速度快,適合大多數通用任務 |
paraphrase-MiniLM-L3-v2 | 更小,適合資源受限環境 |
all-mpnet-base-v2 | 高性能版本,效果更好但稍慢 |
multi-qa-mpnet-base-dot-v1 | 適用于問答、檢索任務 |
distiluse-base-multilingual-cased-v1 | 支持 50+ 種語言,適合多語言場景 |
LaBSE | 支持 109 種語言,適合跨語言檢索 |
🛠? 自定義訓練模型(進階)
如果你有自己的語義匹配任務(如問答、對話理解),可以使用 sentence-transformers
提供的訓練框架進行 fine-tune:
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader# 構建訓練樣本
train_examples = [InputExample(texts=["春天來了", "天氣變暖了"], label=0.8),InputExample(texts=["我愛中國", "我是中國人"], label=0.9),...
]# 創建數據加載器
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)# 加載模型
model = SentenceTransformer('bert-base-chinese')# 使用余弦相似度損失函數
train_loss = losses.CosineSimilarityLoss(model)# 開始訓練
model.fit(train_objectives=[(train_dataloader, train_loss)],epochs=3,output_path='./my_model/'
)
🔍 常見結合使用的庫
庫名 | 作用 |
---|---|
faiss | 快速構建高維向量索引,用于語義搜索 |
annoy | 近似最近鄰搜索,適合內存有限的設備 |
pandas | 處理大規模文本數據 |
transformers | 獲取原始 Transformer 模型 |
scikit-learn | 聚類、降維等后處理 |
? 總結
功能 | 描述 |
---|---|
中文支持 | ??(需使用中文預訓練模型) |
多語言支持 | ??(部分模型支持 50~109 種語言) |
易用性 | ??(API 簡潔清晰) |
可擴展性 | ??(可自定義訓練、結合其他庫) |
推薦應用場景 | 語義搜索、文本聚類、相似度判斷、信息檢索 |
如果你正在做以下工作,建議使用 sentence-transformers
:
- 想要做語義級別的文本匹配
- 不想手動寫特征工程
- 想快速部署一個語義搜索引擎
- 想要在無標簽情況下做文本聚類分析