Chuyển đến nội dung chính

第 6 課:句子和文件嵌入 — 從 Doc2Vec 到 Sentence-BERT

Doc2Vec 和段落向量。句子嵌入:平均池化、Sentence-BERT、E5、BGE。語意相似度和餘弦距離。應用:語意搜尋、聚類、重複資料刪除。使用 Sentence-Transformers 庫進行演示。

🧠 人工智慧與機器學習 — 第 5 課 第 6 課:句子與文件嵌入 — 單字 Doc2Vec 到句子-BERT

NLP 從基礎到進階:掌握自然語言處理

第 2 部分:語言表示-從 BoW 到詞嵌入

亞洲開發網

簡介

詞嵌入代表每個詞,但實際上,我們需要相互比較句子或文檔。句子嵌入將每個句子變成一個唯一的向量,允許計算語義相似度——語義搜尋、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-v2384384快好通用
所有 mpnet 基礎 v2768768平均很好當您需要高品質時
intfloat/e5-large-v210241024慢優生產搜尋
BAAI/bge-m310241024慢優多語言(越南語)

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 深度學習的世界:使用循環神經網路進行順序處理。