単語ベクトルchiVeを使った類似度計算―RNNで文章生成〈6〉

はじめに

前回の記事↓

日本語単語ベクトルchiVeを使ってみた―RNNで文章生成〈5〉

今回は前回作成したプログラムを使って、日本語単語ベクトルchiVeを使った類似単語の計算をやってみようと思います。ソースコードなどの詳細は前回の記事を参照してください。

類似単語テストの方法

前回のコード通り、まず類似単語を調べたい単語を並べてwordsというリストにします。今回のテストでは品詞などで分類してテストすることにしました。それらの単語それぞれについてコサイン類似度を計算して、5万個の単語の中から最も類似度が高いものを出力します。類似単語の出力数は上位5単語にします。

では早速やっていきます。

人称代名詞

words = ['私', '僕', 'あなた', '彼女', '彼']
for word in words:
    most_similar(word)  # 以下、メソッド部分は省略

>>
--------------------------------------------------
私 is the most similar to...
(笑): 0.7753655314445496
わたし: 0.7574976682662964
けれど: 0.7549194097518921
好き: 0.7439374923706055
けど: 0.7354499101638794
--------------------------------------------------
僕 is the most similar to...
俺: 0.7884751558303833
俺の: 0.721551239490509
僕たち: 0.7121518850326538
私: 0.6968599557876587
ボク: 0.6861722469329834
--------------------------------------------------
あなた is the most similar to...
あなたに: 0.8302236795425415
なた: 0.7633165121078491
貴方: 0.7073031663894653
あなたと: 0.6963496208190918
アナタ: 0.6096932291984558
--------------------------------------------------
彼女 is the most similar to...
彼: 0.8077929019927979
彼女たち: 0.7566914558410645
彼氏: 0.7378867268562317
恋人: 0.6836779117584229
女友達: 0.6596165895462036
--------------------------------------------------
彼 is the most similar to...
彼自身: 0.810998797416687
彼女: 0.8077929019927979
僕: 0.6257629990577698
人々: 0.6256709098815918
自身: 0.6152623295783997
--------------------------------------------------

「私」以外はおおむね満足できる結果ですね。「私」にもっとも類似している単語が「(笑)」というのはどういうことなんだろう。。。

一般的な名詞

words = ['自動車', '小説', '朝', '布団']

>>
--------------------------------------------------
自動車 is the most similar to...
自動車メーカー: 0.7976056337356567
乗用車: 0.7331822514533997
電気自動車: 0.7207772731781006
トヨタ: 0.716439962387085
ハイブリッド車: 0.695855438709259
--------------------------------------------------
小説 is the most similar to...
小説家: 0.7358052730560303
短編: 0.703233003616333
漫画: 0.6974751949310303
長編: 0.6784626841545105
原作: 0.6698649525642395
--------------------------------------------------
朝 is the most similar to...
夕方: 0.7640117406845093
早朝: 0.747015655040741
昼: 0.7336598038673401
時半: 0.7210299968719482
朝ご飯: 0.7143831253051758
--------------------------------------------------
布団 is the most similar to...
毛布: 0.8209689259529114
ふとん: 0.8151081204414368
タオルケット: 0.7701529860496521
座布団: 0.727290153503418
寝具: 0.7213496565818787
--------------------------------------------------

結構いい感じですね。「朝」の類似語に「夕方」や「昼」が入っているのは僕らの感覚にも一致しているんじゃないでしょうか。「自動車」ときて「自動車メーカー」、「小説」ときて「小説家」と返すのは少し単純すぎる気がしないでもないですが。

固有名詞

words = ['太宰', '東京', 'パリ']

>>
--------------------------------------------------
太宰 is the most similar to...
芥川: 0.611027181148529
漱石: 0.5609039068222046
遼太郎: 0.535614550113678
文豪: 0.5294544696807861
龍之介: 0.5129048824310303
--------------------------------------------------
東京 is the most similar to...
都内: 0.6588858366012573
新宿: 0.6483195424079895
大阪: 0.6323230862617493
渋谷: 0.6272332072257996
名古屋: 0.624707818031311
--------------------------------------------------
パリ is the most similar to...
フランス: 0.7643319368362427
ブリュッセル: 0.673491358757019
ロンドン: 0.6680781841278076
ニース: 0.6452892422676086
ミラノ: 0.6345404386520386
--------------------------------------------------

人名や地名でもうまくいきました。「太宰」にもっとも類似した単語は「芥川」だそうです。まあ納得ですね。

動詞

words = ['走る', '書か', '行け']

>>
--------------------------------------------------
走る is the most similar to...
走っ: 0.9104568362236023
走り: 0.8686908483505249
走れ: 0.8055600523948669
走れる: 0.7770537734031677
走ら: 0.7614123225212097
--------------------------------------------------
書か is the most similar to...
書い: 0.8425343632698059
書き: 0.7286102175712585
記さ: 0.7031238079071045
書く: 0.6991522312164307
書け: 0.6841012835502625
--------------------------------------------------
行け is the most similar to...
行ける: 0.8682917952537537
行か: 0.8474656939506531
行く: 0.8005155324935913
行き: 0.7837083339691162
行けれ: 0.7438424229621887
--------------------------------------------------

動詞の場合は活用形が類似単語として出力されました。動詞の終止形だけでなく、未然形や仮定形でもうまくいっています。「書く」の未然形「書か」の類似単語として「記す」の未然形「記さ」が出力されているのは動詞の意味もしっかり学習している証拠でしょう。

形容詞

words = ['熱い', '苦しい', 'かわいい']

>>
--------------------------------------------------
熱い is the most similar to...
熱く: 0.807945191860199
熱かっ: 0.7816293835639954
熱き: 0.6699779033660889
アツい: 0.6555631160736084
アツイ: 0.6495425701141357
--------------------------------------------------
苦しい is the most similar to...
苦しく: 0.8676941990852356
苦しかっ: 0.8440812230110168
苦し: 0.7183281183242798
苦しん: 0.6959505677223206
つらい: 0.6732522249221802
--------------------------------------------------
かわいい is the most similar to...
可愛い: 0.9083812832832336
かわいく: 0.8721160888671875
かわゆい: 0.8519564270973206
カワイイ: 0.8466671705245972
かわいらしい: 0.8227367401123047
--------------------------------------------------

形容詞も動詞と同じく活用形が類似単語として出力されました。「苦しい」と「つらい」は類似しているそうです。たしかに苦しいときはつらいし、つらいときは苦しいですからね。苦しいけどつらくなかったらドM、つらいけど苦しくなかったら社畜です。

抽象的な単語

words = ['愛', '世界', '死', '人間']

>>
--------------------------------------------------
愛 is the most similar to...
愛情: 0.7334759831428528
愛し: 0.7024587988853455
愛してる: 0.660988986492157
想い: 0.6435930132865906
愛する: 0.6419695019721985
--------------------------------------------------
世界 is the most similar to...
世界中: 0.6901383996009827
世界的: 0.6286531090736389
日本: 0.6111257672309875
現実世界: 0.6100674271583557
世界各国: 0.6078328490257263
--------------------------------------------------
死 is the most similar to...
死ぬ: 0.6804389357566833
死ん: 0.6698418259620667
死に: 0.6668407320976257
死後: 0.642350435256958
死な: 0.5999743342399597
--------------------------------------------------
人間 is the most similar to...
生き物: 0.6483938694000244
人類: 0.6219210028648376
生き: 0.6131380796432495
生命体: 0.6108377575874329
存在: 0.5967896580696106
--------------------------------------------------

抽象的な単語も試してみましたが特に代り映えの無い普通の答えでした。word2vecを含むニューラルネットワークを使った機械学習は、既に存在するデータを使って学習するのでそれ以上のことは教えてくれないんですよね(たぶん)。結局「愛」とは何か、「死」とは何かという込み入った問題は僕ら自身で考えるしかないようです。いまのところは。

おわりに

いろいろな単語で試してみましたがおおむね満足する結果となりました。動詞や形容詞の活用形も十分あるので語彙数は5万で今後も進めようと思います。次回は前処理の後半段階として前々回で整形したテキストを単語IDの配列に変換していきます。ではまた。

次回の記事↓

テキストを単語IDの配列に変換する―RNNで文章生成〈7〉