LoginSignup
42
45

More than 5 years have passed since last update.

PythonとMecabとCaboChaでtweet分析

Last updated at Posted at 2014-12-22

はじめに

この記事はPython Advent Calendar 2014 - Qiita 22日目の記事です。

先週、会社でやっているAdvent CalendarでBigQuery × Perfume × tweet分析というブログを書きました。
そこでは、12/12(金)〜12/18(木)の1周間で収集したPerfumeに関するTweetをBigQueryにどんとあげて分析するということをやりました。

今回はその発展として、MecabとCaboChaを使った自然言語処理でtweet分析をやっていこうと思いますm(_ _)m

参考にしたもの

せっかくだから俺は衆院選挙のツイートを調べるぜ - Qiita
https://github.com/mima3/stream_twitter

参考というより、やっていることはほとんどmima_itaさんの受け売りです…

環境

・Mac OSX 10.9.5
・Python 2.7.8

Twiiterデータ収集

今回はmentionというサービスを利用しました。
mentionでは管理画面で設定したキーワードで、SNSからお手軽にデータを引っ張ってきてくれます。
ここで取得したデータを管理画面からcsvエクスポートして、準備OK。

今回指定した条件は以下のような感じです。

検索キーワード:Perfume || prfm || perfume_um
(prfmとperfume_umはPerfumeに関する投稿で用いるハッシュタグです)

除外キーワード:RT

対象SNS:Twitter 言語:日本語

期間:12/12(金)〜12/18(木)

MecabとCabochaのインストール

Mecab:http://salinger.github.io/blog/2013/01/17/1/
Cabocha:http://qiita.com/ShingoOikawa/items/ef4ac2929ec19599a3cf

こちらの記事に従っていけば、問題ありませんでした(`・ω・´)ゞ

収集、解析に使用したコード

ただ、こちらではStreaming APIを利用してTwitterデータを収集しそれをDBに格納しています。
今回はそれとは違って、mentionで収集してcsvで吐き出したものをDBに格納する必要があります。

なので、以下の様なソースでどかっとSQLiteに格納してください。

create_database.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sqlite3
import csv

if __name__ == '__main__':
    con = sqlite3.connect("twitter_stream.sqlite")

    c = con.cursor()
    # Create table
    c.execute('''CREATE TABLE "twitte" ("id" INTEGER NOT NULL PRIMARY KEY, "createAt" DATETIME NOT NULL, "idStr" VARCHAR(255) NOT NULL, "contents" VARCHAR(255) NOT NULL);
    ''')
    c.execute('''CREATE INDEX "twitte_createAt" ON "twitte" ("createAt");''')
    c.execute('''CREATE INDEX "twitte_idStr" ON "twitte" ("idStr")''')

    # Insert data
    i = 0
    data = []
    reader = csv.reader(open("./perfume_tweet.csv"))
    for row in reader:
        id = i+1
        createAt = row[4]
        idStr = unicode(row[0],'utf-8')
        contents = unicode(row[1],'utf-8')
        t = (id,createAt,idStr,contents)
        data.append(t)
        i += 1
    con.executemany(u"insert into twitte values(?,?,?,?)",data)

    # Save (commit) the changes
    con.commit()

    # We can also close the cursor if we are done with it
    con.close()

これで無事に、カレントディレクトリにtwitter_stream.sqliteが作成できました。

時間別ヒストグラム

ここでは12/17(水)をピックアップしてみます。1日のうちでの時間別のtweet数を集計していきます。

 python twitter_db_hist.py "2014/12/16 15:00" "2014/12/17 15:00" 3600

※Twitterから取得できる時刻がUTCのため、日本時間だと9時間ずれています。

figure_1.png

これを見ると、以下のようなことが分析できます。

・05:00~06:00の時間帯が一番少ない。02:00~06:00で軒並み低いので、みんなこの時間は寝ているんでしょう。
・23:00~24:00の時間帯が一番多い。18:00~24:00は総じてtweet数が多いが、1日の終わりの23:00~24:00が最も高くなっている。Perfumeに関するtweetを行ってから寝ている人が多い?

ということが、雑ですがなんとなくわかりますね。

頻出単語抽出

次は、Mecabを用いた形態素解析を行います。
ここでは、収集した一週間分のtweetをふるいにかけていきます。

python twitter_db_mecab.py "2014/12/11 15:00" "2014/12/17 15:00" > mecab.txt

以下、top100のリストです。

word count
Perfume 10935
prfm 2739
perfume 2136
フォロー 1553
1478
ちる 1462
のる 1448
定期 1410
1347
好き 1256
動画 1218
ちゃん 1204
パフューム 1056
996
YouTube 945
相互 889
850
まとめ 837
sougofollow 775
ライブ 737
um 726
てる 568
タメ 555
www 552
速報 552
男性 551
大本 544
彩乃 544
543
結婚 540
エン 537
激怒 535
一般 534
493
入札 480
433
ない 431
420
419
ヤフオク 413
408
キミ 401
現在 398
価格 377
374
日時 374
364
みる 356
Cling 350
345
クロ 342
終了 341
341
パフュクラ 335
332
聴く 331
of 330
もの 324
お願い 318
yauc 308
DVD 308
限定 307
300
チケット 295
大好き 285
282
love 276
初回 271
ゆか 270
ナチュラル 263
263
:-, 262
261
サカナクション 254
くださる 250
!: 250
もも 247
希望 240
nowplaying 240
Music 239
FC 237
230
仮面 229
チャウダー 228
219
217
くる 217
217
林檎 214
Player 213
れる 210
セカオワ 209
かし 207
mp 206
205
踊る 201
爆音 201
そう 201
椎名 200
200

上位の単語はBotによるtweetに含まれているものなので、有意なデータではないです。
感覚値として、tweet総数500以下から分析するにあたって意味のある単語が現れているようです。

今回のデータ集計期間は、12/20(土)に開催されたPefume出演の『仮面チャウダー ~YAJIO CRAZY~ チャウ大ユニバーシティインターナショナルコラーゲンハイスクール』というイベントを目前に控えていたので、それに関するtweetが多くありました。

イベント名関連:「仮面」「チャウダー」
チケット情報関連:「入札」「ヤフオク」「価格」「yauc」「チケット」「枚」
(yaucって馴染みなかったんですけど、ヤフオクのハッシュタグらしいです)

あとは、ざっと以下の様な分析ができました。

Perfumeの曲名関連:「Cling」(Cling Cling)「ナチュラル」「恋」(ナチュラルに恋して)
歌手関連:「嵐」「もも」「クロ」「サカナクション」「セカオワ」「林檎」「椎名」
Perfume Music Player関連:「聴く」「Music」「Player」「mp」

※Perfume Music Playerとは、Perfumeのスマートフォン向けオフィシャルアプリです。
このアプリからは現在聞いている曲を以下のようにtweetできます。
「Perfume Music Playerで252,533人目にCling Clingを聴いています。 #prfm_mp http://perfume-app.com/

係り受け解析

次に、文節の係り受けの関係をCaboChaを用いて集計してみます。
ここでも一週間分のtweetを解析しています。

python twitter_db_cabocha.py "2014/12/11 15:00" "2014/12/17 15:00" > cabocha.txt

同じようにtop100を見ていきましょう。

phrase1 phrase2 count
Perfume のる 582
ライブ中 大激怒wwwhttp://t 535
のる 大激怒wwwhttp://t 535
●●で 大激怒wwwhttp://t 535
~ちゃん ライブ中 535
大本彩乃一般男性 結婚 532
大本彩乃一般男性 532
PerfumeMusicPlayer 聴く 138
RT#パフュクラさん 繋がる 137
ない http://t 131
くう http://t 127
斎藤さん http://t 127
斎藤さん 127
繋がる #パフュクラhttp://t 125
___VAMPS ___ワンオク 97
クロ ___ラルク 97
___glee ___UVERworld 97
___UVERworld ___VAMPS 97
___もも クロ 97
___Bz ___ワンオク 97
___ラルク ___Bz 97
椎名林檎GLAY ___glee 93
『[作業用BGM]perfumemix』 http://t 91
スキ ける 90
#Perfume#Perfume好き 繋がる 89
【拡散希望】●爆音イベントスケジュール●詳細___http ://t 89
ニノ むちゃぶり 87
『ひみつの 嵐ちゃん 86
ただただ ける 86
ラジオ ける 86
もの かりる 86
『電撃婚~perfumeoflove~___第1話』 http://t 84
~ちゃん ける 83
ステ ___20131115』http://t 77
___MUSIC STATION 77
STATION ステ 77
FC2動画: ける 75
___Perfume ___ワンオク 74
ナチュラル 恋しい 68
ハマオカモト (OKAMOTO'S) 63
好き もの 62
一曲 投票する 60
今年 一曲 60
ワード 『Perfume』 58
ー#prfm#perfume_um 56
~ちゃん 55
ウラ話Talk http://t 50
12/20(土)大阪城ホール チケット 50
2008-4-5GAMEリリース ウラ話Talk 50
【3姫の ウラ話Talk 50
愉快 ウラ話Talk 50
『PerfumeTalk 2008-4-5GAMEリリース 50
PerfumeMusicPlayer 聞く 48
かしゆか お知らせする 47
~ちゃん お知らせする 47
Perfume ~ちゃん 47
好き 45
のる お知らせする 45
ナチュラル 愛す 45
つなぐ 43
セカオワ ももクロ 43
よろしく お願いする 43
もの ある 43
好き 41
Perfume かしゆか 40
メンバー 描く 38
チェックhttp://t 36
すぐ チェックhttp://t 36
Perfume(パフューム) チケット 36
合う 36
co/ 1IoZn9U583 35
ももクロ Perfume 35
なる 34
Perfume GLAY 33
co/ 7CRGN21Brf) 33
フォローお願い 33
時代 33
___http ://t 32
(#Perfume くう 32
ゲス 極み乙女 32
H ___GLAY\720 31
のる #prfm 31
/ 三代目JSoulBrothers 31
かりる ___GLAY\720 31
三代目JSoulBrothers ___GLAY\720 31
(ワッツイン) 2015年 31
二人 いる 31
2015年 01月号[雑誌]http://t 31
___TEAM H 31
気軽 フォローする 30
スポーツ 29
12/20(土)大阪城ホール詳細 こちら 29
キミ メール 28
Perfume メンバー 28
ワード 『Perfumeコスプレ』 28
描く ☆究極作品☆(> 28
【定価以下】★譲★仮面チャウダーYAJIOCRAZYチャウ大ユニバーシティインターナショナルコラーゲンハイスクール 12/20(土)大阪城ホール 28
合う 28
もの かる 27
好き アーティスト 27

ここでも総数500以上の係り受けは、うるさいBotなのでスルーしましょう。
ちなみに、そのBotは以下の2つのtweetとなってます。

Perfume のっち あ~ちゃん ライブ中に●●で大激怒www http://t.co/4Q0fmhel2l <エンタメ速報>
Perfume 「のっち」こと大本彩乃 一般男性と結婚か? http://t.co/k6cFhLZwnZ

係り受けの表はなんとなく眺めていてもよくわからないので、メンバー3人の名前でgrepしてみました。
係り受けのPhraseのうちで、「あ〜ちゃん」「かしゆか」「のっち」が含まれているものを以下に表しています。
(※文節がきれいに区切れているもののみ抽出)

phrase1 phrase2 count
かしゆか 2
かしゆか 2
かしゆか 揺れる 2
かしゆか 可愛い 1
かしゆか かわいい 1
かしゆか 1
かしゆか スカート 1
神々しい かしゆか 1
かしゆか 左手 1
かしゆか 1
のっち キレイ 2
あ〜ちゃん 天使 2
あ〜ちゃん ワンピース・つけ襟 1
あ〜ちゃんの お団子 1
あ〜ちゃんの 笑顔 1

このように、係り受け解析ではかしゆかに関するものが多かったです!
この係り受けを眺めると、3人の特徴がそれぞれ現れていて素晴らしいですね…

最後に

以上、mima_itaさんの力を多いに借りながら、Perfumeに関するtweetの解析を行ってきました。
振り返ってみると、今回行った条件では解析に不必要なbottweetを大量に収集してしまっていたことが残念です…

データ分析やPythonのスキルはまだまだなので、来週発売のこの本を買って勉強しようと思います(`・ω・´)ゞ
Python言語によるプログラミングイントロダクション: 世界標準MIT教科書

42
45
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
42
45