はじめに
「あなたは、それが維持する会社によって言葉を知るでしょう」 — J.R. ファース、1957
単語埋め込みは、各単語を 密なベクトル (通常は 100 ~ 300 次元) で表現するため、同様の意味を持つ単語がベクトル空間内で 互いに近くなります。これは NLP 史上最大の進歩の 1 つです。
1. ワンホットベクトルから高密度ベクトルへ
ワンホット: 問題
# Vocab: ["king", "queen", "man", "woman", "apple"]
king = [1, 0, 0, 0, 0]
queen = [0, 1, 0, 0, 0]
man = [0, 0, 1, 0, 0]
# cosine_similarity(king, queen) = 0 ← Không biểu diễn quan hệ nghĩa!
# Mỗi từ cách đều nhau trong không gian
高密度埋め込み: 解決策
# Word2Vec embeddings (ví dụ 4 chiều, thực tế 100-300)
king = [0.8, 0.6, -0.2, 0.9]
queen = [0.7, 0.7, 0.8, 0.8]
man = [0.9, 0.5, -0.3, 0.1]
woman = [0.8, 0.6, 0.7, 0.1]
# king - man + woman ≈ queen ← "Phép toán" trên nghĩa từ!
2. Word2Vec
2.1 CBOW 対 スキップグラム
CBOW (Continuous Bag of Words):
Context → Target word
["the", "cat", "on", "the"] → "sat"
Skip-gram:
Target word → Context
"sat" → ["the", "cat", "on", "the"]
| 特長 | CBOW | スキップグラム |
|---|---|---|
| 入力 | 文脈上の単語 | 対象の単語 |
| 出力 | 対象の単語 | 文脈上の単語 |
| スピード | より速く | 遅い |
| 珍しい言葉 | 劣る | より良い |
| 小規模なデータセット | より良い | — |
2.2 Gensim の実践
from gensim.models import Word2Vec
# Corpus (list of tokenized sentences)
sentences = [
["xử", "lý", "ngôn", "ngữ", "tự", "nhiên"],
["machine", "learning", "và", "deep", "learning"],
["trí", "tuệ", "nhân", "tạo", "phát", "triển"],
# ... thêm data
]
# Train Word2Vec
model = Word2Vec(
sentences,
vector_size=100, # Số chiều embedding
window=5, # Context window
min_count=1, # Bỏ qua từ xuất hiện < min_count
sg=1, # 0=CBOW, 1=Skip-gram
epochs=10,
)
# Tìm từ tương tự
print(model.wv.most_similar("ngôn", topn=5))
# Phép toán vector
result = model.wv.most_similar(
positive=["queen", "man"],
negative=["woman"],
topn=1
)
print(result) # [('king', 0.85)]
# Lưu và load
model.save("word2vec_vi.model")
loaded = Word2Vec.load("word2vec_vi.model")
3. GloVe (グローバル ベクター)
アイデア
GloVe はコーパス全体から 共起行列を構築し、次のように因数分解します。
$$J = \sum_{i,j=1}^{V} f(X_{ij})(w_i^T \tilde{w}_j + b_i + \tilde{b}j - \log X{ij})^2$$
# Sử dụng pre-trained GloVe
import gensim.downloader as api
glove = api.load("glove-wiki-gigaword-100") # 100d vectors
# Tìm từ tương tự
print(glove.most_similar("computer", topn=5))
# [('computers', 0.87), ('software', 0.81), ('technology', 0.78), ...]
# Analogy: king - man + woman = ?
print(glove.most_similar(positive=["king", "woman"], negative=["man"], topn=1))
# [('queen', 0.77)]
4. ファストテキスト
利点: サブワードの埋め込み
FastText は単語を 文字の n グラムの合計として表します。OOV 単語を処理します。
from gensim.models import FastText
model = FastText(
sentences,
vector_size=100,
window=5,
min_count=1,
sg=1, # Skip-gram
)
# Có thể lấy vector cho từ CHƯA THẤY BÃO GIỜ
vector = model.wv["từmớichưabaogiờthấy"] # Vẫn work!
# Word2Vec sẽ báo KeyError
5. Word2Vec、GloVe、FastText の比較
| 特長 | Word2Vec | グローブ | ファストテキスト |
|---|---|---|---|
| 方法 | 予測 (ローカルコンテキスト) | カウント (グローバル統計) | 予測 + サブワード |
| OOV の処理 | いいえ | いいえ | はい (サブワード N グラム) |
| 形態学 | いいえ | いいえ | はい |
| トレーニング速度 | 速い | 速い | 遅い |
| 品質 | 良い | 良い | 形態素が豊富な言語に最適 |
6. 埋め込みを視覚化する
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import numpy as np
words = ["king", "queen", "man", "woman", "prince", "princess",
"dog", "cat", "fish", "bird",
"python", "java", "code", "programming"]
vectors = np.array([glove[w] for w in words])
# t-SNE giảm chiều xuống 2D
tsne = TSNE(n_components=2, random_state=42, perplexity=5)
vectors_2d = tsne.fit_transform(vectors)
plt.figure(figsize=(12, 8))
for i, word in enumerate(words):
plt.scatter(vectors_2d[i, 0], vectors_2d[i, 1])
plt.annotate(word, xy=(vectors_2d[i, 0], vectors_2d[i, 1]),
fontsize=12, ha='center', va='bottom')
plt.title("Word Embeddings Visualization (t-SNE)")
plt.show()
7. ベトナム語用の事前トレーニングされた埋め込み
| リソース | 寸法 | 語彙 | リンク |
|---|---|---|---|
| PhoBERT 埋め込み | 768 | 64K | vinai/phobert-base-v2 |
| fastText ベトナム語 | 300 | 2M | cc.vi.300.bin |
| フォウ2V | 100/300 | 500K | github.com/datquocnguyen/PhoW2V |
import fasttext
import fasttext.util
# Download pre-trained Vietnamese FastText
fasttext.util.download_model('vi', if_exists='ignore')
ft = fasttext.load_model('cc.vi.300.bin')
# Sử dụng
vector = ft.get_word_vector("trí_tuệ_nhân_tạo")
similar = ft.get_nearest_neighbors("lập_trình", k=5)
print(similar)
概要
| コンセプト | 重要なポイント |
|---|---|
| ワンホット | まばら、意味を表現しない |
| Word2Vec | 密ベクトル、CBOW/スキップグラム、セマンティック操作 |
| グローブ | 大域的共起 + 因数分解 |
| ファストテキスト | サブワード N グラム、OOV 処理 |
| ベトナム語 | PhoW2V、fastText ベトナム語、PhoBERT |
次の記事
レッスン 6: 文とドキュメントの埋め込み — 単語レベルから文レベルへの拡張: Sentence-BERT、E5、およびセマンティック検索アプリケーション。