はじめに
単語の埋め込みは 各単語 を表します。しかし実際には、文 または ドキュメント を相互に比較する必要があります。文の埋め込みにより、各文が一意のベクトルに変換され、意味検索、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-v2 | 384 | 速い | 良い | 汎用 |
| すべての MPNET ベース v2 | 768 | 平均 | とても良い | 高品質が必要な場合 |
| intfloat/e5-large-v2 | 1024 | 遅い | 素晴らしい | 生産検索 |
| BAAI/bge-m3 | 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 | 低い | 速い | いいえ | いいえ |
| ドク2ベック | 平均 | 速い | いいえ | いいえ |
| 文-BERT | 曹操 | 平均 | はい | モデルによる |
| E5/BGE | 非常に高い | 遅い | はい | はい |
次の記事
レッスン 7: RNN と LSTM — NLP の深層学習の世界に入りましょう: リカレント ニューラル ネットワークによる逐次処理。