LoginSignup
2
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-25

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

2
2
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
2
2