#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件しか取得できませんので注意してね
#2.形態素分析
まず、Tweetを100件取得して形態素分析をしてみましょう。パラメータのcountを100にすれば、100件取得できます。
日本語は、英語を始めとするヨーロッパの言語と違って、一つ一つの単語の切れ目が外見では分からない。したがって、ある単語が別の単語と一緒に使われているかを調べるには、形態素分析と言って、文章を単語に分解することが必要。
今回、コンビニ銀行と一緒に、どんな名詞が出て来るのか調べようと思うので、Tweetを形態素分析しようと思います。
形態素分析で一番有名なソフトはMeCabです。しかし、Pythonと相性が良い形態素分析ソフトはjanomeです。本当はMeCabを使いたいところですが、やはりPython(蛇の名前)にはjanome(蛇の目)がマッチします
ということで、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の情報なんて、時間が経てば、消えてなくなるデータかもしれないけど、分析していみると、それなりに面白かった
定期的にスクローニングして、データベースにデータを格納すれば、本格的に分析できるかも、、、
最後まで、お読み頂き、ありがとうございました
#5.参考とさせていただいたサイト、本
TwitterAPIを用いたクローラー作成
とっても良心的なサイトです。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)
タメになるクジラ飛行机さんの良書です。形態素分析についても解説してくれています。