みんな大好き！コンビニ銀行【Python&Twitterで情報を見える化←形態素分析】

#３文で言うと
１．**Twitter**を利用して、コンビニ銀行を分析してみた。
２．**セブン銀行**は、サービスが充実している。スイカのチャージが出来たり、イケメン声優がATMで案内をしてくれていることが、Twitterでも取り上げられている。
３．**ローソン銀行**は、カフェラテやスィーツと共にツブヤかれている。銀行利用と商品購買を結び付けることに、ひとまず成功しているように見える。

#ポイントは以下の３点になる。
　1.Twitterからデータ取得
　2.形態素分析
　3.コンビニ銀行比較⇒セブン銀行とローソン銀行のキーワード

#1.Twitterからデータ取得
　Twitterからデータを取得するためには、TwitterのAPIを利用しよう。
APIを利用するためには、まず、キーを取得する必要がある。

　この点に関しては、ググると参考になるサイトが見つかると思う。
僕が利用して良かったと思うサイトは、下に参考サイトとして記載しておくので、参照してね。

　キーが取得できたら、Twitterから情報を取得しよう。
　まずは、必要なモジュールのインポート。インストールされていない場合は、pip install コマンドでインストールしてね。
　ちなみに、僕はGoogleのColaboratoryを使って、Jupyterでコードを書いています。

```python
from requests_oauthlib import OAuth1Session
import json
```
次に先ほど取得したキーを入力。

```python
ConsumerKey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
ConsumerSecret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
AccessToken = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
AccessTokenSecret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
```

　今回はTweetにコンビニ銀行名が含まれるTweetを取得してみたい。（最初はひとまず、5件。）　
　パラメータとして、q に検索したいキーワード、count に取得したい件数を入れる。

```python
params = {'q' : 'セブン銀行', 'count' : 5}
```

　データを取得できるようにするため、urlを指定。
Twitter認証のため、先ほどのキーを渡します。
APIを投げて返ってきたデータはreqという変数に入れておきます。

```python
url = "https://api.twitter.com/1.1/search/tweets.json"
twitter = OAuth1Session(ConsumerKey, ConsumerSecret, AccessToken, AccessTokenSecret)
req = twitter.get(url, params = params)
```

　ステータスコードが、req.status_code に格納されていて、この値が200（成功）になっていることを確認してから、Tweet情報を取得。
search_timeline という変数に辞書型で結果を格納します。

```python
if req.status_code == 200:
    search_timeline = json.loads(req.text)
```

　search_timeline['statuses'] にアクセスすることで、search_timelineからTweet情報が得られます。

　情報はリスト型で格納されていて、１件目のTweetを抜き出すには、以下のように書きます。

```python
search_timeline['statuses'][0]
```

　発信者のTweet上のnameやlocationも含まれていますが、登録されていない情報も多いです。descriptionというプロフィールを記載する項目があり、どんな人のツブヤキか、なんとなく分かるときがある。発信者の分析は、今回は対象外だけど、ちゃんとやれば、どんな人が、どんな発信をするのか、分析できるかもしれない。

　Tweet情報のtextにTweetの本文が入っている。
先ほど指定した5件分のTweetを取り出すには、以下のように書きます。

```python
for tweet in search_timeline['statuses']:
    print(tweet['text'])
    print('-----')
```

　一度に取得できるTweet数の上限は100件。100より大きな数値を count に代入しても、100件しか取得できませんので注意してね:relaxed:

#2.形態素分析

　まず、Tweetを100件取得して形態素分析をしてみましょう。パラメータのcountを100にすれば、100件取得できます。

　日本語は、英語を始めとするヨーロッパの言語と違って、一つ一つの単語の切れ目が外見では分からない。したがって、ある単語が別の単語と一緒に使われているかを調べるには、形態素分析と言って、文章を単語に分解することが必要。

　今回、コンビニ銀行と一緒に、どんな名詞が出て来るのか調べようと思うので、Tweetを形態素分析しようと思います。

　形態素分析で一番有名なソフトはMeCabです。しかし、Pythonと相性が良い形態素分析ソフトはjanomeです。本当はMeCabを使いたいところですが、やはりPython(蛇の名前)にはjanome(蛇の目)がマッチします:relaxed:

　ということで、janomeを使っていきます。janomeをインポートして、オブジェクトを作ります。

```python
from janome.tokenizer import Tokenizer
t = Tokenizer()
```

　janomeで形態素に分解して、名詞だけ取り出します。同じ名詞については、カウントアップして、どの名詞が何回使用されているかをチェックします。
　使用された名詞は、降順で並び換えて、多く使われている順に表示します。ソートはデフォルトでは昇順だけど、オプションでreverse=Trueとすれば、逆順になります。

```python
word_dic = {}
# twitter内を検索する
for tweet in search_timeline['statuses']:
    tokens = t.tokenize(tweet['text'])
    words = []
    
    for token in tokens:
        word = token.surface
        ps = token.part_of_speech # 品詞
        if ps.find('名詞') < 0: continue # 名詞だけカウント
        if not word in word_dic:
            word_dic[word] = 0
        word_dic[word] += 1 # カウント

# よく使われる単語を表示
keys = sorted(word_dic.items(), key=lambda x:x[1], reverse=True)
for word,cnt in keys[:100]:
    print("{0}({1}) ".format(word,cnt), end="")
```

#3.コンビニ銀行比較⇒セブン銀行とローソン銀行のキーワード

形態素分析の練習に、Tweetを1回の上限の100件取得しました。しかし、やはり、これは少なすぎます。もう少し、増やしてやってみましょう。

　1回の上限が100件なので、100件以上取りたい時は、100件取得した後に、次の100件取得、また次の100件取得、と順に取得していく必要があります。

　順番に取得するには、全てのTweetに付与されているtweet_id を使います。
100件取得した時に、100件目のtweet_id を保存しておき、次の100件のTweetを取得する際に、そのtweet_id よりも古いTweetを取得します。（ちなみに、Tweetのデータは1週間前までのデータしか取得できません。）

　指定したtweet_id よりも古いTweetだけを取得したいので、max_idを使います。max_id の初期値を-1とすることで、最初は最新のTweetから100件取得でき、max_id の値を変化させながら100件ずつTweetを取得します。

```python
max_id = -1
url = 'https://api.twitter.com/1.1/search/tweets.json'
keyword = 'セブン銀行'
count = 100
params = {'q' : keyword, 'count' : count, 'max_id' : max_id, 'lang':'ja', 'result_type' :'recent'}
req = twitter.get(url, params = params)#パラメータを追加している
```

キーワードを1万件取得し、その内、どんな単語が出現数が多くなるか、やってみましょう。

なお、リクエスト回数の上限は15分間に180回なので、念のため、上限に達した場合は15分待つという処理にしています。

```python
from time import sleep
    
word_dic = {}

while(True):
    if max_id != -1:
        params['max_id']  = max_id - 1  
    req = twitter.get(url, params = params)
    
    if req.status_code == 200:
        search_timeline = json.loads(req.text)
        
        if search_timeline['statuses'] == []:
            break
        
        for tweet in search_timeline['statuses']:
            text = tweet['text']
                        
            tokens = t.tokenize(text)               
            
            for token in tokens:
                
                word = token.surface
                ps = token.part_of_speech # 品詞
                
                if ps.find('名詞') < 0:
                    continue # 名詞だけカウント
                if not word in word_dic:
                    word_dic[word] = 0
                word_dic[word] += 1 # カウント
                    
   
        if len(word_dic)>10000:
            break                       
            
        max_id = search_timeline['statuses'][-1]['id']
    
    else: 
        print('1５分待ちます')
        sleep(15*60)
```

**セブン銀行**と一緒に使われる名詞は、どんなものでしょうか。表示してみましょう。

```python
keys = sorted(word_dic.items(), key=lambda x:x[1], reverse=True)
for word,cnt in keys[:100]:
    print("{0}({1}) ".format(word,cnt), end="")
```

結果は、以下の通りです。カッコ内が出現回数。

**銀行(1340) セブン(1302) /(531) ATM(530)** .(511) **https(479)** t(455) co(451) ://(450) @(423) **チャージ(323)** :(293) お(268) #(267) RT(257) _(228) 口座(210) 日(170) 円(166) イレブン(143) 2(137) ん(132) 手数料(125) の(118) 時(117) カード(116) 1(114) ((114) ー(114) マネー(113) キャンペーン(113) 現金(109) 系(101) **交通(99)** 残高(98) 7(97) 電子(97) 5(95) ご(94) 利用(92) 実施(90) こと(87) **JeaIous(86)** 3(83) 無料(80) 4(77) 方(76) 11(76) 月(75) こちら(75) 記念(74) 開始(72) 買いもの(71) 今日(67) )(64) 9(62) よう(62) 詳細(60) nanaco(60) 買い物(58) 0(57) 給料(57) 東京(56) さん(56) 8(56) 確認(56) **津田(55) 健次郎(55) 回(55) 氷室(54) 龍(54) 士(54)** ポイント(54) 不要(54) 神(53) キャッシュカード(52) **Suica(52)** 設置(51) &(50) ;(50) 17(50) 玉(50) リアルタイム(48) げん(48) コンビニ(47) 仕事(47) 出金(46) 駅(46) CD(46) 待ち(46) 中(44) 可能(44) 発表(44) お迎え(44) 楽しみ(44) 楽天(43) 6(43) 他(43) ♬(43) フラゲ(43) 

以下、僕なりの、説明および補足説明です。

１．銀行(1340)やセブン(1302)は、当然、Tweetに含まれるでしょうし、/(531)や.(511)、https(479)などは、いわゆるstop wordsで分析対象にはなりません。この辺りは、ローソン銀行でも当然、同様。

２．セブン銀行は、交通系電子マネーのATMチャージを開始し、キャンペーンを実施中です。これに関するTweetが多いのが分ります。
　なお、このサービスはローソン銀行の開業に合わせて2018年10月15日にスタートしています。さすがは、セブンですね。

３．JeaIous(86)は、東方神起のニューシングルだそうで、セブンネット限定・期間限定で東方神起グッズを取り扱っているらしい。この辺の情報がTweetされているようだ。

４．津田健次郎、氷室龍士はイケメン声優でセブンATMのナレーションを担当しているらしい。ネットではセブン銀行のATMが乙女ゲー化していると話題らしいが、プラスとマイナス、どっちの評価が多いのか、Tweetを詳しく読まないと分らない。

さて、続いて、**ローソン銀行**。こちらは、どんなキーワードが登場するのだろうか。（先ほどのコードのセブン銀行の部分をローソン銀行にすればOKです。）

銀行(1987) #(1350) ローソン(1272) ATM(689) @(640) **クーポン(638)** RT(556) :(546) _(516) お(505) こちら(437) jp(428) lawsonbank(425) **カフェラテ(416)** 日(231) ♪(229) 中(228) 実施(226) 発行(220) 使い(214) ?？(214) 今日(204) 給料(202) ～♪(192) 遠く(192) 大丈夫(192) https(181) /(179) 1(176) t(172) ://(167) .(167) co(166) )(105) 3(88) 2(70) 円(69) コンビニ(61) ((58) カード(55) 譲渡(55) 楽天(53) 対応(47) 0(46) デジタル(44) セブン(42) 時(40) これ(40) の(40) ちょ(40) 7(37) 求(37) 送料(36) 6(36) **fumumunet(35)** 譲(35) 支店(34) 手数料(34) **スクエア(34) 缶(34) バッジ(34)** 振込(32) 月(32) 利用(32) 交換(32) A(30) 方(29) 気(29) ､(28) 一(28) みずほ(28) 紙(27) 検索(27) ん(27) 枚(26) 目(26) 十(26) 座(26) 8(25) !(25) エースリー(25) 秋(25) 冬(25) 臣(25) 紬(25) 丞(25) ガイ(25) 350(25) ~(25) (+(25) 開業(25) 年(24) 画像(24) 5(24) 決済(23) キャッシュカード(23) 感(23) MMCuim(23) 3063(23) 社長(23) 

１．まず、目につくクーポン(638)だけど、ローソンのお試し引換券が「レジ直クーポン」に対応したらしい。これがTweetされているのかな。

２．カフェラテ(416)は分りやすいけど、fumumunet(35)は分らなかった。「女子の本音と好奇心をセキララに」をコンセプトに、好奇心を刺激する話題を、20代女子3000人データによる本音と共にお届けするウェブメディアだそうで、ローソンのスィーツを取り上げていた。この辺、ローソンの商品が受けているのかな。

３．スクエア(34) 缶(34) バッジ(34)⇒よく分らなかったけど、ローソンではスクエアの缶バッチを扱っているらしい。

今回のデータだけでは何とも言えないけど、あえて言えば、以下の通りかな？
**サービスのセブン**
**⇒交通系電子マネーのチャージやイケメン声優のATM**
**商品のローソン**
**⇒カフェラテやスィーツ買うついでに銀行利用**

#4.まとめ
　Twitterの情報なんて、時間が経てば、消えてなくなるデータかもしれないけど、分析していみると、それなりに面白かった:sunny:
　定期的にスクローニングして、データベースにデータを格納すれば、本格的に分析できるかも、、、:relaxed:
　最後まで、お読み頂き、ありがとうございました:grin:

#5.参考とさせていただいたサイト、本
[TwitterAPIを用いたクローラー作成](https://datumstudio.jp/blog/twitterapi%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E4%BD%9C%E6%88%90)
とっても良心的なサイトです。Twitterの良い勉強になりました。

[Pythonによるスクレイピング&機械学習 開発テクニック]
(https://www.amazon.co.jp/Python%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0-%E9%96%8B%E7%99%BA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-BeautifulSoup-scikit-learn-TensorFlow%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86/dp/4802610793)
タメになるクジラ飛行机さんの良書です。形態素分析についても解説してくれています。