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

レッスン 6: 文とドキュメントの埋め込み — Doc2Vec から Sentence-BERT まで

Doc2Vec と段落ベクトル。文の埋め込み: 平均プーリング、文 BERT、E5、BGE。意味的類似性とコサイン距離。アプリケーション: セマンティック検索、クラスタリング、重複排除。 Sentence-Transformers ライブラリを使用したデモ。

🧠 AI と ML — レッスン 5 レッスン 6: 文とドキュメントの埋め込み — 単語 Doc2Vec から BERT への文

NLP の基礎から上級まで: 自然言語処理をマスターする

パート 2: 言語表現 — BoW から Word 埋め込みまで

xdev.asia

はじめに

単語の埋め込みは 各単語 を表します。しかし実際には、文 または ドキュメント を相互に比較する必要があります。文の埋め込みにより、各文が一意のベクトルに変換され、意味検索、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

人気モデル

モデル寸法スピード品質使用例
all-MiniLM-L6-v2384速い良い汎用
すべての MPNET ベース v2768平均とても良い高品質が必要な場合
intfloat/e5-large-v21024遅い素晴らしい生産検索
BAAI/bge-m31024遅い素晴らしい多言語(ベトナム語)

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低い速いいいえいいえ
ドク2ベック平均速いいいえいいえ
文-BERT曹操平均はいモデルによる
E5/BGE非常に高い遅いはいはい

次の記事

レッスン 7: RNN と LSTM — NLP の深層学習の世界に入りましょう: リカレント ニューラル ネットワークによる逐次処理。