search
LoginSignup
2

More than 3 years have passed since last update.

posted at

updated at

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

3文で言うと

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

ポイントは以下の3点になる。

 1.Twitterからデータ取得
 2.形態素分析
 3.コンビニ銀行比較⇒セブン銀行とローソン銀行のキーワード

1.Twitterからデータ取得

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

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

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

from requests_oauthlib import OAuth1Session
import json

次に先ほど取得したキーを入力。

ConsumerKey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
ConsumerSecret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
AccessToken = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
AccessTokenSecret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

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

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

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

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 という変数に辞書型で結果を格納します。

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

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

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

search_timeline['statuses'][0]

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

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

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をインポートして、オブジェクトを作ります。

from janome.tokenizer import Tokenizer
t = Tokenizer()

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

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を取得します。

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分待つという処理にしています。

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('15分待ちます')
        sleep(15*60)

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

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)

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

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

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

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

4.津田健次郎、氷室龍士はイケメン声優でセブン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)

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

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

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

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

4.まとめ

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

5.参考とさせていただいたサイト、本

TwitterAPIを用いたクローラー作成
とっても良心的なサイトです。Twitterの良い勉強になりました。

Pythonによるスクレイピング&機械学習 開発テクニック
タメになるクジラ飛行机さんの良書です。形態素分析についても解説してくれています。

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
What you can do with signing up
2