ミッキーと類似の言葉は何なのか、機械学習(word2vec)を使って調べてみる。

# 目的

ミッキーはとても人気

![Unknown.jpeg](https://qiita-image-store.s3.amazonaws.com/0/344880/275495c8-d8f5-8d8d-7157-4a92c34c6a73.jpeg)

なのですが、「どれくらい人気なのか」と質問しようものなら、
「人気なものは人気、世界一、人気！！」と強い回答が返ってくることが予想されます。
とはいえ、何も知らないとミッキーの話題に入れず辛い目に合うかもしれません。

従いまして、まずは類似の言葉をword2vecを使って調べてみたいと思います。
word2vecは自然言語の学習モデルの１つのようです。
詳しい説明は、[絵で理解するWord2vecの仕組み](https://qiita.com/Hironsan/items/11b388575a058dc8a46a)、が直感的に分かりやすいです。

# 準備
word2vecを用いるために必要なツールを記載します。

環境

```
  Mac OS sirra 10.13.6
　プロセッサ：2.3 GHz Intel Core i5
　メモリ：8 GB 2133 MHz LPDDR3
　グラフィック：Intel Iris Plus Graphics 640 1536 MB
```

wgetをinstallする。(macbookの場合はbrewでinstall)

```
$ brew install wget
```

word2vecを日本語に対して使うためのツール類をインストール
（※mecabは今回は使いませんでしたが、日本語の言語処理をするならインストールしておいて損はしないと思います。）

```
# janome、gensim、mecabをインストール
$ pip install janome  
$ pip install gensim
$ brew install mecab
$ brew install mecab-ipadic
$ brew install swig
$ pip install mecab-python3

# mecab-ipadic-NEologdをインストール(Web上の新語をデフォルトの辞書に追加したもの)
$ brew install git curl xz
$ git clone https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ sudo ./bin/install-mecab-ipadic-neologd -n
```

[こちら](https://qiita.com/makaishi2/items/63b7986f6da93dc55edd)のページや、[こちら](https://qiita.com/taroc/items/b9afd914432da08dafc8)のページにて紹介頂いているコードが動けばOKです。

また、wikipediaをword2vecで扱うために、
[こちら](https://textminingonline.com/training-a-japanese-wikipedia-word2vec-model-by-gensim-and-mecab)を参考に学習モデルを作成しても良いのですが時間が掛かるため、
[東北大学のページ](http://www.cl.ecei.tohoku.ac.jp/~m-suzuki/jawiki_vector/)から学習済モデル(20170201.tar.bz2)をダウンロードさせていただきます。
ダウンロード後は下記の通り解凍します。

```
$ tar xf 20170201.tar.bz2
$ mv entity_vector tohoku_entity_vector
```

# コード

下記を求めるpythonコードを作成しました。
・ミッキーと類似度が近い言葉を取得
・クリスマスシーズンのミッキーと類似の言葉を取得（ミッキー + クリスマス）
・ユニバーサルスタジオ界のミッキーは誰か（ミッキー - ディズニー + ユニバーサルスタジオジャパン）

```
# -*- coding: utf-8 -*-                                                                                                                      
from gensim.models import KeyedVectors
import sys, codecs

fout = codecs.open('result.txt', 'w', 'utf-8')

def print_list(inputword):
    for item in inputword:
        w1=item[0]
        w2=item[1]
        print(w1, str(w2))
        fout.write(w1)
        fout.write(',')
        fout.write(str(w2))
        fout.write('\n')
    print("---")

model = KeyedVectors.load_word2vec_format('./tohoku_entity_vector/entity_vector.model.bin', binary=True)


# ミッキーと類似度が近い言葉を取得                                                                                                           
similar=model.most_similar(u'ミッキー')
print_list(similar)

# クリスマスシーズンのミッキーと類似の言葉を取得（ミッキー + クリスマス）                                                                    
similar2=model.most_similar(positive = [u"ミッキー",u"クリスマス"])
print_list(similar2)

# ユニバーサルスタジオ界のミッキーは誰か（ミッキー - ディズニー + ユニバーサルスタジオジャパン）                                                    
similar3=model.most_similar(positive = [u"ミッキー",u"ユニバーサルスタジオジャパン"], negative = [u"ディズニー"])
print_list(similar3)

```

# テスト

・ミッキーと類似度が近い言葉を取得

```
$ python sample.py
ミニー 0.8507789373397827
チャーリー 0.809766948223114
ドナルド 0.8051313161849976
ブッチ 0.7975171804428101
[グーフィー] 0.7875207662582397
ジェリー 0.7815017700195312
ジョニー 0.7738847732543945
カーリー 0.770979642868042
サム 0.7709465026855469
ダニー 0.7695404887199402
```

->ミニー、ドナルド、グーフィー等のディズニーキャラクターが出ております。
　しかし、ジェリー、ジョニー、カーリー、サム、ダニーは何者でしょうか？
　チャーリーはチャーリーブラウンでしょうか？
![illust_charlie-2-400x367.png](https://qiita-image-store.s3.amazonaws.com/0/344880/53f954ce-b0e7-cfec-cfbc-acbd92fa3e76.png)



・クリスマスシーズンのミッキーと類似の言葉を取得（ミッキー + クリスマス）

```
ミニー 0.821307897567749
バレンタイン 0.7653680443763733
[ミッキーマウス] 0.729365348815918
チャーリー 0.708748996257782
メリー 0.7075506448745728
[クリスマス] 0.7061460018157959
イースター 0.7013547420501709
ハロウィーン 0.6952414512634277
ディナー 0.689238429069519
ドリュー 0.686948299407959
```

->バレンタイン、イースターや、ハロウィーンなど、季節のイベント用語が並んでいます。
　是非、顔が新しくなったミッキーのイースターへ行きましょう！
![75188002_220x215.jpeg](https://qiita-image-store.s3.amazonaws.com/0/344880/e236f6db-fa34-6480-7c0f-a5abb7cca7e2.jpeg)


・ユニバーサルスタジオ界のミッキーは誰か（ミッキー - ディズニー + ユニバーサルスタジオジャパン）

```
したてや 0.663770318031311
[魔鐘] 0.6627211570739746
フミカ 0.6586048603057861
ジョースター卿 0.6537103652954102
[GRACE_(ドラマー)] 0.6518503427505493
クラムジー 0.6359982490539551
トルファルディーノ 0.6356921195983887
紗江 0.6320871710777283
[佐津川愛美] 0.6311378479003906
[Oh!診] 0.6306033730506897
```

->ミニオンやエルモは出力されませんでした。
　ジョースター卿
![20170307_02-239x300.jpg](https://qiita-image-store.s3.amazonaws.com/0/344880/1bea2d2f-f2d4-bf4c-a22f-7757257d5297.jpeg)

# まとめ

ミッキーの話題のためword2vecを活用しました。
ミニー、ドナルド、グーフィー辺りについての周辺知識を抑え、
クリスマス、バレンタイン、イースターや、ハロウィーンのイベントについても言及するのが良いでしょう。
ユニバの話題になった際は、ジョースター卿について話をすると良いでしょう。

# CodingError対策

```
TypeError: 'method' object is not subscriptable
```
most_similar(u'ミッキー')をmost_similar(u"ミッキー")に変更して解決
※methodに与える引数を色々模索していたら気づいたら解決していました。

# 参考
[gensim.models.Word2Vec](https://tedboy.github.io/nlps/generated/generated/gensim.models.Word2Vec.html)
[python3でもっとも簡単に言語解析を使う](https://s51517765.hatenadiary.jp/entry/2017/11/25/185529)
[15分でできる日本語Word2Vec](https://qiita.com/makaishi2/items/63b7986f6da93dc55edd)
[絵で理解するWord2vecの仕組み](https://qiita.com/Hironsan/items/11b388575a058dc8a46a)
[【Python】Word2Vecの使い方](https://qiita.com/kenta1984/items/93b64768494f971edf86)
[数値を文字列に変換(str)](https://www.javadrive.jp/python/string/index9.html)
[[Python]Pythonと日本語表示と文字コード、unicode 、str 、utf-8 、shift-jis](http://d.hatena.ne.jp/Cassiopeia/20070602/1180805345)
[Pythonで日本語を使う](http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/python/encoding.html)
[学習済みword2vecモデルを調べてみた](http://blog.hassaku-labs.com/post/pretrained-word2vec/)
[Training Word2Vec Model on English Wikipedia by Gensim](https://textminingonline.com/training-word2vec-model-on-english-wikipedia-by-gensim)
[Training a Japanese Wikipedia Word2Vec Model by Gensim and Mecab](https://textminingonline.com/training-a-japanese-wikipedia-word2vec-model-by-gensim-and-mecab)
[白ヤギコーポレーション word2vecの学習済み日本語モデルを公開します](http://aial.shiroyagi.co.jp/2017/02/japanese-word2vec-model-builder/)
[東北大学 日本語 Wikipedia エンティティベクトル](http://www.cl.ecei.tohoku.ac.jp/~m-suzuki/jawiki_vector/)
[自然言語処理にwikipediaを使う](https://www.slideshare.net/ikuyamada/wikipedia-113013185?next_slideshow=1)
[機械学習のデータセットの重要性](https://qiita.com/nonbiri15/items/b29fe079d359d531bf85)
[最近流行りのword2vecをLDAと比較してみた](https://qiita.com/juri-t/items/22055e264c4970c1ed75#%E5%AD%A6%E7%BF%92-1)
[Python3からMeCabを使う](https://qiita.com/taroc/items/b9afd914432da08dafc8)
[Word2VecをPythonでやってみる](https://foolean.net/p/71)