序論
GensimのWord2Vecで大量の文章を解析してなるべく平均的な(世の中の平均に近い)ベクトルを抽出したかったので、とりあえずWikipediaの全文章を食わせた。食わせたらメモリ不足で死んだ(半日かけたのに、解析終了後にモデルを保存するところで死んだ…)。
なのでWikipediaの全文章のうちの半分を食わせて学習させた。それで単語の関係から人間の使命とか、人間とは何か、みたいな問いの答えを推測させようとした。
テスト
男に対する王、では女に対する単語は?
In [30]: model.most_similar(positive=['女', '王'], negative=['男']) Out[30]: [('女王', 0.696621298789978), ('王妃', 0.6558860540390015), ('皇帝', 0.6432796716690063), ('国王', 0.6378647089004517), ('霊王', 0.6022188663482666), ('王女', 0.6019116640090942), ('淩', 0.601294994354248), ('帝', 0.5978249907493591), ('モンクット', 0.5973988771438599), ('ビンビサーラ', 0.5967077016830444)]
こんな感じ。
女王、王妃、王女などといった単語が並んでいます。うん。それなりに正しく学習できてるみたいだ。
じゃあまずは、「物」と、それの「使命」を列挙して単語間の差分の平均をとる。
pairs = [ ('プリンター', 'プリント'), ('トラック', '運送'), ('貨物列車', '運ぶ'), ('自転車', '走る'), ('自動車', '運転'), ('発電所', '発電'), ('企業', '利益'), ('組織', '運営') ]
これで人に対する使命を推測させてみよう。どやっ!
In [35]: model.similar_by_vector(model['人'] - avg) Out[35]: [('人', 0.9164718389511108), ('人々', 0.6219279766082764), ('人たち', 0.6162048578262329), ('万人', 0.5566036701202393), ('人達', 0.5561781525611877), ('人間', 0.5540094375610352), ('自分', 0.5348547697067261), ('皆', 0.5339369773864746), ('他人', 0.5331916213035583), ('老人', 0.5151956677436829)]
うーん。もうちょっと簡単な例を挙げたほうがいいのかな?あと動詞にしたほうが分かり易そうだ。
In [26]: model.most_similar(positive=['人間', '運ぶ'], negative=['トラック']) Out[26]: [('分け与える', 0.6251673698425293), ('植え付ける', 0.5930650234222412), ('引き寄せる', 0.5830397009849548), ('探し求める', 0.5816649198532104), ('吸い取る', 0.5749282836914062), ('縛り付ける', 0.5739188194274902), ('見つける', 0.5699186325073242), ('洗う', 0.565520167350769), ('視る', 0.5636563897132874), ('みつめる', 0.5634658932685852)]
おおっ!いきなりそれっぽい答えがでました。
人間とは、分け与え、植え付け、引き寄せ、探し求めるものだそうです。うーん、哲学的だ。でも縛り付けるって何なんですかね。SMプレイかな?
次はもっと役割が明確なものを挙げてみましょう。
In [39]: model.most_similar(positive=['人間', '飛ぶ'], negative=['飛行機']) Out[39]: [('操れる', 0.5524789094924927), ('喰らう', 0.542494535446167), ('宿る', 0.5421377420425415), ('生きる', 0.5421087145805359), ('操る', 0.5415694713592529), ('狩る', 0.540559709072113), ('悪魔', 0.5403273701667786), ('呑み込む', 0.5380153656005859), ('動く', 0.5374261140823364), ('剥く', 0.5351983904838562)]
人間は食い、狩り、飲み込んで生きるものですか。まあそのとおりですね。
次はなんとなくアンパンマンを使ってみましょう。アンパンマンは困っている人に自分の顔の一部を分け与えます。なので、アンマンマン、あげるという関連から近い単語を調べてみます。
In [42]: model.most_similar(positive=['人間', 'あげる'], negative=['アンパンマン']) Out[42]: [('自分', 0.5407493114471436), ('自分自身', 0.5179587602615356), ('殺す', 0.5131946802139282), ('得る', 0.5126399397850037), ('続ける', 0.5106273889541626), ('捨てる', 0.5075640678405762), ('呪う', 0.5064151287078857), ('生きること', 0.5032200813293457), ('他人', 0.4992121160030365), ('犯す', 0.4976778030395508)]
「殺す」
「捨てる」
「呪う」
「犯す」
うーん、子供には見せられないダークさですね。
結論
人間とは・・・・分け与え、植え付け、引き寄せ、探し求める生き物であり、時に殺し、捨て、呪い、犯す生き物だそうです。
なんか普通だな。人間とは三八式歩兵銃である、とか、人間とはカンプフグルッペであるとか無茶苦茶な理論が見たかったぞ。