Word2Vec

Word2Vec
  1. gutenberg.sents() — NLTKのGutenbergコーパス(古典文学18作品、約200万語)から文のリスト取得
  2. Word2Vec(…) — その文を使って Word2Vec モデル を学習。各単語を100次元のベクトルに変換する
  3. model.wv[“music”] — “music” という単語のベクトル表現(100個の数値)を取得
  4. most_similar(“music”, topn=3) — “music” とベクトル空間上で最も近い単語を3つ返す → bells, landscape, procession 要するに、古典文学テキストから「単語の意味の近さ」を数値化するAIモデルを作って、”music” に意味が近い単語を探しているというデモです。Word2Vec
    は「似た文脈で使われる単語は似た意味を持つ」という仮説に基づいています。
import gensim
import nltk
from nltk.corpus import gutenberg
model = gensim.models.Word2Vec(gutenberg.sents(), vector_size=100, seed=0)

- Step by Step Confirmation : 
$ python
Python 3.10.12 (main, Feb  4 2025, 14:57:36) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import gensim
>>> import nltk
>>> nltk.download('gutenberg')
[nltk_data] Downloading package gutenberg to
[nltk_data]     /home/shinyajp/nltk_data...
[nltk_data]   Unzipping corpora/gutenberg.zip.
True
>>> nltk.download('punkt')
[nltk_data] Downloading package punkt to /home/shinya/nltk_data...
[nltk_data]   Unzipping tokenizers/punkt.zip.
True
>>> from nltk.corpus import gutenberg
>>> model = gensim.models.Word2Vec(gutenberg.sents(), vector_size=100, seed=0)
>>> model.wv["music"]
array([ 0.14232978,  0.03886762,  0.16314076, -0.24910036,  0.37368938,
       -0.30030632,  0.34333456, -0.2974525 ,  0.04806216, -0.24845712,
       -0.18664545,  0.28214747, -0.32634118,  0.33135796, -0.16838518,
       -0.10140307,  0.36823002,  0.02706584, -0.3220343 ,  0.16663781,
       -0.34735122,  0.03911976,  0.04387085, -0.1853062 ,  0.09571295,
       -0.22781484, -0.14164163,  0.09745421,  0.43577138,  0.24198052,
       -0.02831895,  0.04982164, -0.08931613,  0.25829127, -0.74116373,
       -0.08258606,  0.12500556, -0.14492099,  0.13096344,  0.11432717,
       -0.09480673, -0.27930635, -0.35665122, -0.46026987,  0.2045553 ,
       -0.11128157,  0.09884034, -0.1016247 ,  0.09909046,  0.42312914,
        0.12576517,  0.22759219,  0.10997105,  0.05675024,  0.18537909,
       -0.59243965,  0.03309   , -0.2526536 ,  0.2408802 , -0.03218367,
        0.01004087,  0.25067785,  0.49151078, -0.20744099,  0.4757528 ,
        0.13851584, -0.14233755, -0.20644136,  0.17365962,  0.05364598,
       -0.24799967, -0.11836515,  0.01071915, -0.08112123, -0.2531703 ,
        0.39694604, -0.29170558, -0.45008484, -0.17079729,  0.15515907,
        0.00424392, -0.18567231, -0.07966135, -0.1554637 ,  0.27788934,
       -0.31105545,  0.00598265,  0.20016843, -0.09866753,  0.20993762,
        0.15276311, -0.0991338 ,  0.28595993, -0.02622987,  0.33360302,
        0.21588698, -0.04776664, -0.02465237,  0.10587581,  0.30101416],
      dtype=float32)

model.wv.most_similar(“music”, topn=3) は、学習済みの単語ベクトル空間の中で “music” と最もコサイン類似度が高い単語を上位3件返す メソッドです。

>>> model.wv.most_similar("music", topn=3)
[('bells', 0.8469684720039368), ('landscape', 0.8350399732589722), ('procession', 0.8310693502426147)]
>>>

結果:

[(‘bells’, 0.847), (‘landscape’, 0.835), (‘procession’, 0.831)]

  • bells — “music” と 84.7% 類似
  • landscape — 83.5% 類似
  • procession — 83.1% 類似 Gutenbergコーパス(古典文学)の中で、これらの単語が “music”
    と似た文脈(前後の単語パターン)で使われていた、ということを意味します。芸術・儀式・情景描写に関連する単語が近いのは直感的にも納得できます。

Word2Vec の有名な ベクトル演算(アナロジー推論)

king – man + woman = ?
「king から “男性” の意味を引いて “女性” の意味を足すと何になる?」

→ 結果: daughter, queen, son, prince など王族・家族関係の単語が上位に。queen が4位に来ているのは「king : man = queen : woman」という関係をモデルが捉えている証拠です。

>>> model.wv.most_similar(positive=['king', 'woman'], negative=['man'])
[('daughter', 0.6052757501602173), ('prophet', 0.5770168304443359), ('messengers', 0.5768935680389404), ('queen', 0.5750294923782349), ('Joseph', 0.563137948513031), ('son', 0.558447539806366), ('Solomon', 0.5579952597618103), ('Paul', 0.5579680800437927), ('captain', 0.5569276809692383), ('prince', 0.5442970395088196)]
>>>

moon - midnight + noon = ?
  「moon から "夜" の意味を引いて "昼" の意味を足すと何になる?」

  → 結果: sun が1位。見事に「夜空の天体(moon) → 昼空の天体(sun)」という対応関係を導き出しています。sky, light, clouds など昼間の情景語が続くのも自然です。

>>> model.wv.most_similar(positive=['moon', 'noon'], negative=['midnight'])
[('sun', 0.8212375640869141), ('sky', 0.7952385544776917), ('dew', 0.773698091506958), ('light', 0.7676761746406555), ('clouds', 0.7505801916122437), ('snow', 0.7409420609474182), ('stars', 0.7384997010231018), ('star', 0.7362468242645264), ('sunset', 0.7236921787261963), ('windows', 0.7204263210296631)]
>>>

仕組み

ベクトル空間上で文字通り足し算・引き算をしているだけ:
vec(“king”) – vec(“man”) + vec(“woman”) → このベクトルに最も近い単語を検索
単語の「意味の方向」が加減算できるのが Word2Vec の面白さです。


参考 :
Gutenberg 0.8.2
Embedding Projector

カテゴリー:

タグ: