LoginSignup
43
40

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-07-23

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

事前準備

PythonのInstallationはこちらを参考
Mecab + neologdのInstallationはこちらを参考

  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)にアドオンを追加

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

HelloWorld.py
import nltk
nltk.download('all');

import argparse
from gensim.models import word2vec

print("Hello, World!")

6. Twitterで情報を取得

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. トレーニングモデル作成とデータ抽出

とりあえず、コマンドラインでデータがちゃんと取れるか確認してみます。

>>> # !/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辞書の追加

こちらを参考にしてユーザー辞書を追加します。
駅名一覧と都内の公園とモンスター名を入れます。

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

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

43
40
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
40