word2vec
概要
分散表現 (distributed representation) とは単語の意味を数値化してベクトル空間に表すことである。単語をベクトル空間に埋め込むことから単語埋め込み (word embedding) とも呼ばれる。一般に分散表現によって一つの単語は数十~数百次元のベクトルに変換される。
word2vec [1] は分散表現を生成するためのアルゴリズムの一つである。このアルゴリズムは「単語の意味はその周辺の要素によって形成される」という分布仮説 (distributional hypothesis) に基づき、与えられた単語シーケンスの単語の位置関係から良好な分散表現を作成する。
Table of Contents
word2vec によって得られた単語ごとの数値は特徴空間上の点、つまり特徴ベクトルと見なすことができる。近接する点が意味的に類似し、その距離と方向も意味的な差異を表していることを示唆している。
word2vec のアルゴリズムは自然言語処理のみならず遺伝子、コード、プレイリスト、ソーシャルグラフ、パターンとして認識可能なその他の言語または記号的系列にも同様に適用することができる。
アルゴリズム
word2vec は入力層、隠れ層、出力層の 3 層のニューラルネットワークで構成されている。入出力はともに単語であり、ある単語とその近傍の単語の生起確率が最適となるように学習させることで、その隠れ層を生成する重みが単語ごとの特徴ベクトルとなる。3 層の word2vec は深層ニューラルネットワーク (DNN) ではないが、テキストを DNN が解釈できる数値形式に変換するための前処理として使用されることが多い。
word2vec のアルゴリズムには CBoW (continuous bag of words) と Skip-gram の 2 種類がある。一連の単語シーケンスが与えられたとき、CBoW は単語の近傍 (文脈) から単語を予測するように学習する。Skip-gram は逆に単語からその近傍の単語を予測するように学習する。大規模なデータセットに対しては Skip-gram の方が正確な結果が得られる傾向にあることから Skip-gram がよく使用されている。
Fig 3 における Skip-gram の例では、事後確率
word2vec のニューラルネットワークには、位置
直感的には、例えば「レストラン」という単語の近傍には「ステーキ」や「スパゲティ」といった単語が含まれる可能性が高く、それらを特徴空間上の近い位置に配置することで料理という潜在的なクラスタを構成することができる。また逆に料理を表す単語の近傍に存在する「レストラン」「ダイナー」「バル」といった単語は飲食店という潜在的なクラスタとなる。
文を超える近傍は意味の関連が薄いため、文頭の前や句点の後には単語が存在しないものとして、文単位でデータセットを構築する。
入力層
大きさ
学習データセットの入力単語と出力単語のペア
隠れ層
Skip-gram のケースではまず第一重み行列
出力層
次に第二重み行列
バックプロパゲーション
モデルの重み
結論
結果的に Skip-gram を適用した word2vec のニューラルネットワークの機能は Fig 5 のように表すことができる。
論文 [1] では
word2vec の利用
word2vec の簡単な試行は Python ライブラリの Gensim を利用することができる。
text8 データセット
text8 は Wikipedia から抽出しクレンジングしたデータの最初の 100MB を使用した試用目的のデータセットである。以下の例は text8 データセットを用いて 'king'-'man'+'woman'≃'queen' の例を演算している。
$ pip3 install gensimCollecting gensim Downloading gensim-4.3.1-cp310-cp310-win_amd64.whl (24.0 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 24.0/24.0 MB 11.5 MB/s eta 0:00:00 Collecting scipy>=1.7.0 Downloading scipy-1.11.2-cp310-cp310-win_amd64.whl (44.0 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 44.0/44.0 MB 9.9 MB/s eta 0:00:00 Collecting smart-open>=1.8.1 Downloading smart_open-6.3.0-py3-none-any.whl (56 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 56.8/56.8 kB 3.1 MB/s eta 0:00:00 Collecting numpy>=1.18.5 Downloading numpy-1.25.2-cp310-cp310-win_amd64.whl (15.6 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 15.6/15.6 MB 12.3 MB/s eta 0:00:00 Installing collected packages: smart-open, numpy, scipy, gensim Successfully installed gensim-4.3.1 numpy-1.25.2 scipy-1.11.2 smart-open-6.3.0$ cat w2v_text8.pyimport os import gensim.downloader as api from gensim.models import Word2Vec filename = "word2vec-text8.model" if os.path.exists(filename): model = Word2Vec.load(filename) else: dataset = api.load("text8") model = Word2Vec(dataset) model.save(filename) print(model.wv.most_similar(positive=["king", "woman"], negative=["man"], topn=3)) print(model.wv.most_similar(positive=["washington", "japan"], negative=["us"], topn=3))$ python3 w2v_text8.py[==================================================] 100.0% 31.6/31.6MB downloaded [('queen', 0.7043117880821228), ('throne', 0.6485360264778137), ('prince', 0.6437445878982544)] [('shanghai', 0.6013388633728027), ('tokyo', 0.5882682800292969), ('china', 0.5333846807479858)]
上記のプログラムでは起動ごとのデータセットのダウンロードや学習時間を省略するために学習済みの word2vec モデルをローカルに保存している。
text8 より大きなデータセットとしては標準で wiki-english-20171001, patent-2017, quora-duplicate-question などを利用できる (利用可能な識別子は python -m gensim.downloader --info コマンド実行結果の corpora で確認できる)。
独自のデータセット
Gensim の Word2Vec を使用してユーザの保有する自然文データから word2vec モデルを構築することもできる。小規模な学習セットであれば構築時の sentences パラメータで指定できる。また一度にメモリ上にロードすることが現実的ではない大規模な学習セットに対しては、構築後のモデルに対して train() を使用して追加的に学習できる。
参照
- Tomas Mikolov, Kai Chen, Greg Corrado, Jeffrey Dean. Efficient Estimation of Word Representations in Vector Space (日本語). arXiv preprint arXiv:1301.3781, 2013.
- Word2vec (Wikipedia)




