日本-(中国-北京)=東京 word2vecで自然言語処理

昨日は中国で受講している「PyTorchを使ったディープラーニング」セミナーの第7回がありました。今回のテーマは自然言語処理。単語や文章をどのようにコンピュータで扱うか学びます。

どのように単語を理解するか?

コンピュータで単語を処理する際に現在使用されている主な方法は、下記2種類あります。

  • One-hot Representation
  • Distributional Representation

One-hot Representation

One-hot Representationとは特定の列の値のみが1、それ以外の値は0で表現するベクトル表現の事です。

[青、赤、フルーツ、野菜、机]という辞書(単語の集合)があった場合に、

赤は

[0,1,0,0,0]

机は

[0,0,0,0,1]

で表します。上記サンプルでは辞書に5単語しか用意していないですが、実際に日常会話で使われる単語では2万語程度は必要になります。

One-hotの欠点

One-hotで単語を扱う場合の欠点は

  • ベクトルの次元数が非常に大きく、疎な行列となる
  • 単語の意味を扱えない

という問題があります。2万語の辞書を用意して1つの単語を表すと

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,・・・・]

のような形となり1列だけ1、残り全てが0というデータになります。

また、One-hotでは単語間での類似性・相関性を保持できないため「じゃがいも」と「馬鈴薯」という単語が全く別の値として扱われます。

 Distributional Representation

 Distributional Representationとは単語を少ない次元数のベクトルで表す方法です。

例えばトマトを表すイメージは下記のような形になります。

[青、赤、フルーツ、野菜、机]

[0.2 , 0.9 , 0.1 , 0.8 , 0]

トマトは赤い野菜なので、「赤」、「野菜」列の数値が高く、机とは全く関係ないので0となっています。

この方法であればOne-hotの欠点を解決することが出来ます。

word2vec

 word2vecとはその名の通り単語からベクトル(Distributional Representation)に変換する手法の1つで、2013年にgoogleの研究者によって発表されました。

今回の講義ではword2vecの中のSkip-Gramのモデルをpytorchで実装しました。

['he is a man','berlin is germany capital', 'she is a queen']等の単語からSkip-Gramモデルで訓練し最終的にpoland - warsawとgermany - berlinのコサイン類似度が1に近づくか確認します。

  • ポーランド(国名)を表すベクトルからワルシャワ(首都)のベクトルを引いた値
  • ドイツ(国名)を表すベクトルからベルリン(首都)のベクトルを引いた値

上記は平行になり、2つのベクトルのcos(コサイン)は1になるはずです。