はじめに

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 を情報源に使ってみたいけれども、作成に時間がかかりそう。