はじめに
word2vec を知ったので、これを利用して謎かけできないかと考えました。
結論からいうと、面白いものはできませんでした m(._.)m
今回の Jupyter Notebook は以下です。
謎かけとは
謎かけとは、
「x とかけまして、y と解く。その心は・・・ z でございます。」
というもので、x と y の共通点を z という言葉遊び。
落語家が大喜利でお客さんから お題 x をもらって、それに対して洒落た答えを返す。
例えば、「眼鏡とかけまして、椅子と解く、その心はどちらもかけるものでございます」など。 あまり面白くないね。
自分は学生のとき落語研究会に入っていたので、学園祭のときに謎かけをよくやって恥をかいていた。
gensim を使う
gensim という python で NLP をするときによく使われるライブラリがあるが、 そこに word2vec が実装されてライブラリとして提供されている。
word2vec を使うと、ある単語に関係する単語を導くことができる。(most_similar)
これをつかって、謎かけめいたことができないか考えたのだった。
gemsin のインストール
Anaconda 環境で以下のコマンドで。cython をインストールすると計算が早くなるらしい。
conda install gensim
conda install cython
model の作成
text8 という 英語の Wikipedia のデータセットを使う。なぜかというと、用意が簡単だから。
$ wget https://mattmahoney.net/dc/text8.zip -P /tmp
$ unzip text8.zip
解凍した text8 ファイルには英単語が羅列されている。これを学習のインプットにする。
from gensim.models import word2vec
data = word2vec.Text8Corpus('/tmp/text8')
model = word2vec.Word2Vec(data, size=200)
model.save("sample.model")
これで sample.model というモデルができる。size=200 というのは 単語を表現するベクトルの長さ。
embeddings の 加算
単語を表すベクトル同士の足し算をしてみる。
model.most_similar(positive=['dog','cat'])
[('goat', 0.7966023683547974),
('bee', 0.7859479784965515),
('pig', 0.7830795645713806),
('bird', 0.7660524845123291),
('hound', 0.7580216526985168),
('panda', 0.7541525363922119),
('hamster', 0.7503507137298584),
('ass', 0.7488968372344971),
('haired', 0.7469390630722046),
('rat', 0.7466884851455688)]
加算した結果に類似する単語が帰ってくる。動物が特徴なことが分かる。
謎かけをしてみる
加算だとあまりよい結果がでなかったので、ある単語に近い単語を求めて、二つの単語に共通する単語を求めてみる。
wx = 'japanese'
x = model.wv[wx]
wy = 'smart'
y = model.wv[wy]
sx = set()
for word, emb in model.most_similar([x], [], 500):
sx.add(word)
sy = set()
for word, emb in model.most_similar([y], [], 500):
sy.add(word)
sz = (sx & sy)
sz で集合 x と 集合 y の両方に含まれる単語 z が求められる。これを表示してみる。
for wz in sz:
print(wx + "とかけまして" + wy + "と解く。その心は・・・" + wz + "でございます")
japanese とかけまして smart と解く。その心は・・・ capcom でございます
japanese とかけまして smart と解く。その心は・・・ starcraft でございます
japanese とかけまして smart と解く。その心は・・・ doraemon でございます
日本人とかけて秀才と解く、そのこころは、ドラえもんです。。。微妙だ。
いろいろ試してみたけれども、うまくいかなかった。z が名詞だとつまらないな、動詞が来てほしいが方法がわからない。
時間があれば、日本語版 Wikipedia を情報源に使ってみたいけれども、作成に時間がかかりそう。