PythonとMecabとCaboChaでtweet分析

##はじめに
この記事は[Python Advent Calendar 2014 - Qiita](http://qiita.com/advent-calendar/2014/python) 22日目の記事です。

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

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

##参考にしたもの
[せっかくだから俺は衆院選挙のツイートを調べるぜ - Qiita](http://qiita.com/mima_ita/items/a30d8809c428f73fd360) 
https://github.com/mima3/stream_twitter 

参考というより、やっていることはほとんど[mima_ita](http://qiita.com/mima_ita)さんの受け売りです…


##環境
・Mac OSX 10.9.5
・Python 2.7.8

##Twiiterデータ収集
今回は[mention](https://en.mention.com/)というサービスを利用しました。
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

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

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

https://github.com/mima3/stream_twitter

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

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

```python: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のため、日本時間だと９時間ずれています。

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/19111/c5f7c8fc-4603-f0fd-afaa-a5ec3fcb35fa.png "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|
|ｗｗｗ|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/](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|
|描く|☆究極作品☆(&gt;|28|
|【定価以下】★譲★仮面チャウダーYAJIOCRAZYチャウ大ユニバーシティインターナショナルコラーゲンハイスクール|12/20(土)大阪城ホール|28|
|合う|人|28|
|もの|かる|27|
|好き|アーティスト|27|

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

Perfume のっち あ～ちゃん ライブ中に●●で大激怒ｗｗｗ 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](http://qiita.com/mima_ita)さんの力を多いに借りながら、Perfumeに関するtweetの解析を行ってきました。
振り返ってみると、今回行った条件では解析に不必要なbottweetを大量に収集してしまっていたことが残念です…

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