ENGINEER BLOG

ENGINEER BLOG

Word2Vecを試す (1)

こんにちは。コンサルティングサービス本部 芳賀です。

弊社は出版流通業界のITに長く関わっており、従来より自然言語処理を扱うシステム開発に携わって参りました。

昨今流行の機械学習の自然言語処理の応用のひとつである、Word2Vecを数回にわたり紹介いたします。初回の今回は、Word2Vecの紹介記事です。

 

Word2Vecとは


word2vec は、当時 Google の研究者だった Tomas Mikolov らよって提案された、単語をベクトル化するための機械学習の実装です。
コーパスに含まれる数十万の単語を200次元(デフォルト設定時)のベクトルに変換することができ、また、そのベクトル同士で意味のある演算することができます。

従来の手法とくらべて精度が高いのが特徴で、単語ベクトル同士の加算、減算が興味深い結果を産みだすレベルに達しています。

このブログでも次回以降、弊社の実際のデータも交えて、いくつかの興味深い結果を紹介したいと思います。

 

w2v

word2vecは、コーパスを入力として受け、単語のベクトルをモデルとして出力します。
コーパスとしては、Wikipediaの抜粋などを用いるのが一般的ですが、ある程度の規模があればどのような文章でもコーパスにできます。実際にモデルを作成するにあたって必要なデータはコーパスのみで、事前に語義を定義した辞書などは一切不要です。(日本語の場合、形態素解析して分かち書きする必要があるので、形態素解析には辞書が要るといえば要りますが)

一度モデルが完成するとコーパスに含まれる単語同士のコサイン類似度を計算することができようになり、たとえば、「’france’との類似度が高い単語のリスト」などを得ることができます。

単語 距離
spain 0.678515
belgium 0.665923
netherlands 0.652428
italy 0.633130
switzerland 0.622323
luxembourg 0.610033
portugal 0.577154
russia 0.571507
germany 0.563291
catalonia 0.534176

上記の表は、Wikipedia英語版の抜粋から作成しています。他のコーパスを使用するとこれとは違った単語が違った類似度でリストに登場することになります。

また、単語同士の距離だけにとどまらず、いくつか単語を加減算した結果と別の単語の距離を求めることができます。したがって、以下のような計算が可能です。

vector(‘paris’) – vector(‘france’) + vector(‘italy’) にもっとも近いのは vector(‘rome’)
vector(‘king) – vector(‘man’) + vector(‘woman’) にもっとも近いのは vector(‘queen’)

「パリ」のベクトルから「フランス」のベクトルを引いたベクトルを「イタリア」のベクトルに足したベクトルともっとも近いのは「ローマ」のベクトルということですが、 もっと簡単に、「フランスにとってのパリは、イタリアにとって何か?」を尋ねると「ローマ」が得られると読めます。同様に「男にとっての王は、女にとって何か」を尋ねると「女王」が得られます。

 

人間が単語とその意味を記述した辞書からルールベースで答えを得るのではなく、コーパス内の単語の出現頻度と出現位置からこれだけの精度が得られることは驚きです。

 

Word2VecとGenSim


gensimはトピックモデリングに特化したpythonのライブラリです。
多くの機能がありますが、このブログでは今回は、そのうちword2vecのみを利用します。
gensimを利用することで、word2vecをpythonから呼び出すことができ、既存のpython資産を活用することができます。

次回は、jupyter経由でgensimを使う環境を準備します。