簡介
詞嵌入代表每個詞,但實際上,我們需要相互比較句子或文檔。句子嵌入將每個句子變成一個唯一的向量,允許計算語義相似度——語義搜尋、RAG 和許多現代 NLP 應用的基礎。
1. 從單字到句子的嵌入
簡單方法:平均池化
import numpy as np
def average_embedding(words, model):
"""Trung bình vector của các từ trong câu."""
vectors = [model[w] for w in words if w in model]
if not vectors:
return np.zeros(model.vector_size)
return np.mean(vectors, axis=0)
sentence = ["xử", "lý", "ngôn", "ngữ", "tự", "nhiên"]
sent_vec = average_embedding(sentence, word2vec_model)
# Shape: (100,) — một vector duy nhất cho cả câu
⚠️平均池化失去訂單資訊和上下文—「不好」會更接近「好」!
2. 句子-BERT (SBERT)
想法
使用 Siamese 網路 微調 BERT 以創建高品質的句子嵌入。
from sentence_transformers import SentenceTransformer, util
# Load pre-trained model
model = SentenceTransformer('all-MiniLM-L6-v2')
# Encode sentences
sentences = [
"NLP là lĩnh vực xử lý ngôn ngữ tự nhiên",
"Xử lý ngôn ngữ tự nhiên thuộc về AI",
"Hôm nay thời tiết đẹp quá",
]
embeddings = model.encode(sentences)
print(embeddings.shape) # (3, 384)
# Tính cosine similarity
similarities = util.cos_sim(embeddings, embeddings)
print(similarities)
# tensor([[1.0000, 0.8234, 0.0512], ← câu 1 & 2 rất giống
# [0.8234, 1.0000, 0.0389],
# [0.0512, 0.0389, 1.0000]]) ← câu 3 rất khác
熱門車型
| 型號 | 尺寸 | 速度 | 品質 | 使用案例 |
|---|---|---|---|---|
| 全MiniLM-L6-v2 | 384 | 384快 | 好 | 通用 |
| 所有 mpnet 基礎 v2 | 768 | 768平均 | 很好 | 當您需要高品質時 |
| intfloat/e5-large-v2 | 1024 | 1024慢 | 優 | 生產搜尋 |
| BAAI/bge-m3 | 1024 | 1024慢 | 優 | 多語言(越南語) |
3. 應用:語意搜尋
from sentence_transformers import SentenceTransformer, util
import torch
model = SentenceTransformer('all-MiniLM-L6-v2')
# "Database" tài liệu
documents = [
"Python là ngôn ngữ lập trình phổ biến nhất cho AI",
"JavaScript thống trị lĩnh vực web development",
"Docker giúp đóng gói ứng dụng thành containers",
"Kubernetes orchestrate containers trên production",
"NLP giúp máy tính hiểu ngôn ngữ con người",
"Computer Vision xử lý hình ảnh và video",
]
doc_embeddings = model.encode(documents, convert_to_tensor=True)
# Search
query = "làm sao để deploy ứng dụng?"
query_embedding = model.encode(query, convert_to_tensor=True)
# Tìm top-3 tài liệu liên quan nhất
scores = util.cos_sim(query_embedding, doc_embeddings)[0]
top_results = torch.topk(scores, k=3)
print("Query:", query)
for score, idx in zip(top_results.values, top_results.indices):
print(f" [{score:.4f}] {documents[idx]}")
# [0.6234] Docker giúp đóng gói ứng dụng thành containers
# [0.5891] Kubernetes orchestrate containers trên production
# [0.1234] JavaScript thống trị lĩnh vực web development
4. 應用:文件聚類
from sklearn.cluster import KMeans
import numpy as np
# Encode documents
embeddings = model.encode(documents)
# K-Means clustering
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(embeddings)
for i, (doc, cluster) in enumerate(zip(documents, clusters)):
print(f" Cluster {cluster}: {doc}")
5.應用程式:重複資料刪除
from sentence_transformers import util
texts = [
"NLP xử lý ngôn ngữ tự nhiên",
"Xử lý ngôn ngữ tự nhiên bằng NLP",
"Machine learning rất thú vị",
"ML là một lĩnh vực hấp dẫn",
"Hôm nay trời đẹp",
]
embeddings = model.encode(texts)
cosine_scores = util.cos_sim(embeddings, embeddings)
# Tìm cặp trùng lặp (similarity > 0.8)
threshold = 0.8
duplicates = []
for i in range(len(texts)):
for j in range(i + 1, len(texts)):
if cosine_scores[i][j] > threshold:
duplicates.append((i, j, cosine_scores[i][j].item()))
print(f" Duplicate: [{cosine_scores[i][j]:.4f}]")
print(f" A: {texts[i]}")
print(f" B: {texts[j]}")
總結
|方法|品質 |速度| OOV |多語言 | |------------|---------|--------|-----|------------|| |平均 Word2Vec |低|快|沒有 |沒有 | | Doc2Vec |平均 |快|沒有 |沒有 | |句子-BERT |曹 |平均 |是的 |取決於型號 | | E5/BGE |非常高|慢一點 |是的 |是的 |
下一篇文章
第 7 課:RNN 和 LSTM — 進入 NLP 深度學習的世界:使用循環神經網路進行順序處理。