Twitterからポケモン出没情報探し

ポケモンGOがリリースされたのでどうしてもtwitter情報を効率よく見たいと思います。
Python3でword2vecしてみて口コミデータを検索して欲しい情報にリーチしましょう。

## 事前準備
[PythonのInstallation](http://blog.manbolo.com/2013/02/04/how-to-install-python-3-and-pydev-on-osx#2)はこちらを参考
[Mecab + neologdのInstallation](http://qiita.com/K-1/items/5cb3601341f6fa4fdd95)はこちらを参考

1. Meacabをインストール
2. python3がコマンドラインで動く事を確認
3. Eclipse(STS)にアドオンを追加
4. pip3でモジュールインストール
5. HelloWold
6. Twitterで情報を取得
7. トレーニングモデル作成とデータ抽出

## やってみよう！
### 2.python3がコマンドラインで動く事を確認
```
[murotanimari]$  python3 --version
Python 3.5.2
[murotanimari]$ pip3 --version
pip 8.1.2 from /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages (python 3.5)
```

### 3. Eclipse(STS)にアドオンを追加
http://pydev.org/updates/からPyDevをインストールすると、PyDevProjectが作成可能になるので、新規に作成します。

### 4. pip3でモジュールインストール
```
pip3 install gensim
pip3 install argparse
pip3 install prettyprint

pip3 install word2vec
pip3 install print
pip3 install pp
pip3 install nltk　#日本語の場合いらない
pip3 install tweepy
pip3 install scipy

# for japanese
brew install mecab
brew install mecab-ipadic
pip3 install mecab-python3
```

### 5. HelloWold
```py3:HelloWorld.py
import nltk
nltk.download('all');

import argparse
from gensim.models import word2vec

print("Hello, World!")
```

### 6. Twitterで情報を取得
```py3:ParseJP.py
#!/usr/bin/env python
# -*- coding: utf-8 -*- 

import nltk
import sys
import tweepy
import json
import subprocess
import datetime
import MeCab

from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream
from numpy.core.multiarray import empty

#Variables that contains the user credentials to access Twitter API 
access_token = "＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊"
access_token_secret = "＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊"
consumer_key = "＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊"
consumer_secret = "＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊"

#This is a basic listener that just prints received tweets to stdout.
class StdOutListener(StreamListener):
    def on_data(self, data):
        jsondata = json.loads(data)
        sentence = jsondata["text"]
        
        try:
            #print(sentence)
            t = MeCab.Tagger("-Ochasen")
            tagged = t.parse(sentence)
            #print(tagged)
            out = "";
            for item in tagged.split('\n'):
                item = str(item).strip()
                if item is '':
                    continue
                
                fields = item.split("\t")
                #print(fields)
                found = ""
                if 'EOS' not in item:
                    if "名詞" in fields[3]:
                        found = fields[2]
                    if "動詞" in fields[3]:
                        if "助動詞" not in fields[3]:
                            found = fields[2]
                    
                if("//" not in str(found).lower()):
                    if(found.lower() not in ["rt","@","sex","fuck","https","http","#",".",",","/"]):
                        if(len(found.strip()) != 0):
                            found = found.replace("'", "/'");
                            out += found + " "
                            
            today  = datetime.date.today()
            cmd  = "echo '"+ out + "' >> /tmp/JP" + today.isoformat() +".txt"
            #print(cmd)
            subprocess.check_output(cmd, shell=True)
                    
            return True
        except:
            print("Unexpected error:",found, sys.exc_info()[0])
            return True
            
    def on_error(self, status):
        print(status)

#### main method
if __name__ == '__main__':

    #This handles Twitter authetification and the connection to Twitter Streaming API
    l = StdOutListener()
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    stream = Stream(auth, l)

    #This line filter Twitter Streams to capture data by the keywords: 'python', 'javascript', 'ruby'
    #stream.filter(track=['#pokemongo','#PokemonGo', '#PokémonGo', '#Pokémon' ,'#Pokemon', '#pokemon'], languages=["en"])    
    stream.filter(track=['#ポケモン','#pokemongo','#PokemonGo', '#PokémonGo', '#Pokémon' ,'#Pokemon', '#pokemon'], languages=["ja"])    
    #stream.filter(track=['#pokemon'], languages=["en"])
    
```

### 7. トレーニングモデル作成とデータ抽出
とりあえず、コマンドラインでデータがちゃんと取れるか確認してみます。

```py3:
>>> # !/usr/bin/env python
... # -*- coding:utf-8 -*-
... from gensim.models import word2vec
>>>
>>> data = word2vec.Text8Corpus('/tmp/JP2016-07-23.txt')
>>> model = word2vec.Word2Vec(data, size=200)
>>> model.most_similar(positive=u'Pokemon')
[('Pokémon', 0.49616560339927673), ('ND', 0.47942256927490234), ('妖怪ウォッチ', 0.4783376455307007), ('I', 0.44967448711395264), ('9', 0.4415249824523926), ('j', 0.4309641122817993), ('B', 0.4284788966178894), ('CX', 0.42728638648986816), ('l', 0.42639225721359253), ('bvRxC', 0.41929835081100464)]
>>>
>>> model.most_similar(positive=u'ピカチュウ')
[('SolderingArt', 0.7791135311126709), ('61', 0.7604312896728516), ('ポケットモンスター', 0.7314165830612183), ('suki', 0.7087007761001587), ('チュウ', 0.6967192888259888), ('docchi', 0.6937340497970581), ('ラテアート', 0.6864794492721558), ('EjPbfZEhIS', 0.6781727075576782), ('はんだ付け', 0.6571916341781616), ('latteart', 0.6411304473876953)]
>>>
>>> model.most_similar(positive=u'ピカチュー')
[('タバコ', 0.9689614176750183), ('作成', 0.9548219442367554), ('渋谷', 0.9207605123519897), ('EXCJ', 0.9159889221191406), ('ポイ捨て', 0.8906601667404175), ('ゴミゲット', 0.7719830274581909), ('あるある', 0.6942187547683716), ('ありがとう', 0.6873651742935181), ('お願い', 0.6714405417442322), ('GET', 0.6686745285987854)]
>>>
>>> model.most_similar(positive=u'レアポケモン')
[('表', 0.8076062202453613), ('早見', 0.8065655827522278), ('生息地', 0.7529213428497314), ('入手', 0.7382372617721558), ('最新', 0.7039971351623535), ('日本版', 0.6925774216651917), ('基地', 0.6455932855606079), ('300', 0.6433809995651245), ('YosukeYou', 0.6330702900886536), ('江ノ島', 0.6322115659713745)]
>>>
>>> model.most_similar(positive=u'大量発生')
[('区域', 0.9162761569023132), ('カオス', 0.8581807613372803), ('桜木町駅', 0.7103563547134399), ('EjPbfZEhIS', 0.702730655670166), ('大蔵', 0.6720583438873291), ('殿町', 0.6632444858551025), ('今井書店', 0.6514744758605957), ('丿', 0.6451742649078369), ('パリ', 0.6437439918518066), ('入口', 0.640221893787384)]
```

レアポケモンで基地とか江ノ島とか気になります！
大量発生で桜木町駅、大蔵、殿町、今井書店とか何でしょうね？



### 追記:おまけ

```
EC2にDeployでデータ処理始めました。お金ないとAPIにして公開できないですw
注: まだ精度が低いのでググッて真意を確認してね!!!!

▼ポケモン「スポット」口コミキワードランキング by twitter & word2vec
1. 錦糸公園
2. 愛知県
3. gamespark 
4. 名古屋
5. 公園
6. 商店街
7. 三ヶ所
8. 大濠公園
▼ポケモン「大量発生」口コミキワードランキング by twitter & word2vec
1. ポケモンイベントコラボ
2. 桜木町駅
3. 大蔵
4. 西新宿
5. 商店街
6. パリ
7. 中央公園
8. 福島 
9. 今井書店
▼ポケモン「レアポケモン」口コミキワードランキング by twitter & word2vec
1. 伝説
2. デマ
3. 生息地
4. 深夜
5. 民家
6. 東
7. ミュウツー
8. デマ情報
9. アップデート
10. 評価
11. 群馬県伊勢崎市馬見塚町
`````

### 追記:neologd
https://github.com/neologd/mecab-ipadic-neologd
をよくよく読むと下記のようにinstall-mecab-ipadic-neologdで最新版をインストールできるらしい。

```
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
/usr/local/lib/mecab/dic/mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n
echo `mecab-config --dicdir`"/mecab-ipadic-neologd"

vi /usr/local/etc/mecabrc
dicdir = /usr/local/lib/mecab/dic/mecab-ipadic-neologd
```

### 追記:user辞書の追加
[こちら](http://web-tsukuru.com/333)を参考にしてユーザー辞書を追加します。
駅名一覧と都内の公園とモンスター名を入れます。

```
cd /usr/local/lib/mecab/dic/ipadic
# add pokemon list
/usr/local/libexec/mecab/mecab-dict-index -u pokemon.dic -f utf-8 -t utf-8 /mnt/s3/resources/pokemons.csv
# add station list
/usr/local/libexec/mecab/mecab-dict-index -u station.dic -f utf-8 -t utf-8 /mnt/s3/resources/stations.csv
/usr/local/libexec/mecab/mecab-dict-index -u park.dic -f utf-8 -t utf-8 /mnt/s3/resources/park.csv

# copy into dict folder
cp pokemon.dic /usr/local/lib/mecab/dic/mecab-ipadic-neologd/ 
cp station.dic /usr/local/lib/mecab/dic/mecab-ipadic-neologd/
cp park.dic /usr/local/lib/mecab/dic/mecab-ipadic-neologd/

```

## おまけ
2018年にwikipediaのデータモデルで試した結果を追記しておきます。

```
女の人生は「恋」である
女の人生に「結婚」を足すと「情事」である
女の人生から「結婚」を引くとそれは「知恵」である
由緒正しき、WikiPediaデータ・モデルからの解答
```
![26166696_645464965624132_9085888345293241147_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/89997/bdb1e457-6509-5797-2570-a0eebc15940a.jpeg)


ちなみに就活、成功、事例で検索すると六ヶ所再処理工場が出てきてしまう・・・