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

レッスン 5: Word の埋め込み — Word2Vec、GloVe、FastText

ワンホットベクトルから高密度ベクトルまで。 Word2Vec: CBOW とスキップグラム、ネガティブ サンプリング。 GloVe: 共起行列因数分解。 FastText: サブワード埋め込み。 t-SNE/UMAPで可視化します。ベトナム語用に事前トレーニングされた埋め込み。 Gensim を実際に使ってみましょう。

🧠 AI と ML — レッスン 4 レッスン 5: 単語の埋め込み — Word2Vec、GloVe、 ファストテキスト

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

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

xdev.asia

はじめに

「あなたは、それが維持する会社によって言葉を知るでしょう」 — 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 埋め込み76864Kvinai/phobert-base-v2
fastText ベトナム語3002Mcc.vi.300.bin
フォウ2V100/300500Kgithub.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、およびセマンティック検索アプリケーション。