AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

文をベクトルで表現する

潜在的意味インデキシング(LSI)徹底入門 - あらびき日記

上記で紹介されていたサンプルを動かしてみました。
Rで書かれたスクリプトです。

d1: 会場には車で行きます。
d2: 会場には自動車で行きます。
d3: 会場には自転車で行きます。
d4: お店には自転車で行きます。

以上のような4つの文章から、単語を取り出して、

       d1 d2 d3 d4
会場    1  1  1  0
店      0  0  0  1
自動車  0  1  0  0
自転車  0  0  1  1
行く    1  1  1  1
車      1  0  0  0

と行列で表現する。単語の語順は考慮しない(bag of words)
このままでも自動車と車が類義語だと分かります。
単語の意味は、周囲の単語との関係で決まると考えると、
同じような言葉に囲まれているから、車と自動車は同一の意味だと推定できるみたいなニュアンスかな。
で、この行列を圧縮する
圧縮の仕組みはちょっとよくわからないですが、
次元の呪いも減るのでしょうし、圧縮することで、過学習が無くなって、類似度判定が向上するようです。

実際にRをインストールして動かしてみました。
はじめd1とd2の類似度は0.666667だったのが、次元圧縮すると1.0に向上しています。

# Rscript lsi_sample.R
to make data frame

単語・文書行列
       d1 d2 d3 d4
会場    1  1  1  0
店      0  0  0  1
自動車  0  1  0  0
自転車  0  0  1  1
行く    1  1  1  1
車      1  0  0  0

検索クエリq「会場 車」との類似度
元々の文書の類似度
          d1        d2        d3        d4
d2 0.6666667
d3 0.6666667 0.6666667
d4 0.3333333 0.3333333 0.6666667
q  0.8164966 0.4082483 0.4082483 0.0000000

ランク削減版の類似度
            d1          d2          d3          d4
d2 1.000000000
d3 0.837087619 0.837087619
d4 0.349599386 0.349599386 0.805193724
q  0.678298315 0.678298315 0.431130039 0.003082754

次元削減版の類似度
           d1         d2         d3         d4
d2 1.00000000
d3 0.83708762 0.83708762
d4 0.34959939 0.34959939 0.80519372
q  0.93838173 0.93838173 0.59644045 0.00426479

同じようなことを、googleのword2vecの記事でも見ましたが、
mecab - 米googleの研究者が開発したWord2Vecで自然言語処理(独自データ) - Qiita

あれは100次元などで単語をベクトル表現すると、
man,king→woman, ?
と尋ねるとqueenが判るとのことで、
これは幾何学的に、
man - king + woman = queen
と表現されているそうで(凄すぎる)
要するに、man-kingというベクトルは、差のベクトルを表してますから
その差をwomanに足してやると、その位置にはqueenがいる(100次元空間座標で)
さらに凄いのが、goodとbestの中間にbetterの座標がいるように学習されたそうです(驚き)
要はこういうことですよね。better = (good+best)/2
これが、bag of wordsを深層学習することで得られたとは本当に凄いと思う。

しかし、Rって凄いね。ちょっと演習してみますかね。あとpythonも演習してみますかね。
覚えることが多すぎる。数学力も全然無いから、統計学とか勉強したい。