2012年12月25日火曜日

Rを用いたTwitterテキストマイニング

R Advent Calendar 2012 ついに25日目です。栄えあるクリスマスですが、R Advent Calendar に限ってはこれはトリではなく単なる通過点のはず!さらに、後続に素晴らしい方が控えているのでお手柔らかにお願いします。

とはいえ、、はい。今日はクリスマスです。 光栄です。ということでやってみました。Twitterを用いたRによるクリスマス分析です。

まずはTwitterからテキストを集めます。こちらはpython-twitterを利用してPythonで取得しました。

#!/usr/bin/python
# -*- coding: utf8 -*-

import twitter, urllib2, sys

consumer_key = "**********"
consumer_secret = "**********"
access_token_key = "**********"
access_token_secret = "**********"

api = twitter.Api(consumer_key, consumer_secret, access_token_key, access_token_secret)
query = u'クリスマス'
query = urllib2.quote(query.encode("utf-8"))
results = api.GetSearch(query, page=1, show_user="false", result_type='recent', per_page=100)
for res in results:
    mod = res.text.encode('utf-8')
    print mod


これをcronで回してツイートを 1000件取得しました。ちなみに上記の例はシェルから実行してファイルに書き出しているので、そのまま、ファイルに書き出したい場合は変更してください。上記のコードはSearchAPIを利用していますが、身のまわりのクリスマス実態を把握する場合はタイムライン等から引っ張るとおもしろいかも知れません。

次に取得したテキストから不要な文字を抜き取ります。一度このまま行こうかと思いましたが、顔文字だらけになりました。笑

vimを利用して顔文字を消去し(:%s/(.\{-})//g)、適当に以下のコードを実行しました。


#!/bin/bash

sed -ie 's/http:\/\/[^ ]* //g' merge.txt
sed -ie 's/http:\/\/[^ ]*$//' merge.txt
sed -ie 's/([^)]*)//' merge.txt
sed -ie 's/!//g' merge.txt
sed -ie 's/-//g' merge.txt
sed -ie 's/\.//g' merge.txt


この辺りはかなり適当なので、近々しっかりとまとめようかと思ったり。。。クリスマスってことで多めに見てください笑 あっ、ちなみに顔文字だけvimで消去したのもsedで動かずググるのがめんどかっただけなので、ご教授頂ければと思います。

ここからRMeCabを利用してテキストマイニングを行います。取得したファイルをsource.txtとし、カレントディレクトリに保存してあるとします。

まず、重要語を選出します。

data <- RMeCabFreq('source.txt')
head(data)
    Term    Info1 Info2 Freq
1     あ フィラー     *   14
2   あの フィラー     *    1
3   あー フィラー     *    8
4     え フィラー     *   11
5   えー フィラー     *    1
6 えーと フィラー     *    1

dataは単なるリストなので、頻度の高いものだけを選ぶことが出来ます。

> data1 = data[data$Freq > 20,]
> head(data1, n=10)
      Term  Info1                    Info2 Freq
151     う 助動詞                        *   52
153 ござる 助動詞                        *   23
156     た 助動詞                        *  407
157   たい 助動詞                        *   43
159     だ 助動詞                        *  425
162   です 助動詞                        *  152
163   ない 助動詞                        *  142
169   ます 助動詞                        *  172
170     や 助動詞                        *   29
178     と   助詞                 並立助詞   44


助詞を眺めても仕方がないので名詞・動詞に限定します。

data2 = data[data$Freq > 40 & (data$Info1 == "動詞" | data$Info1 == "名詞"),]

とりあえず出力

data2[order(data2$Freq),]
           Term Info1    Info2 Freq
710        いる  動詞   非自立   41
717        くる  動詞   非自立   41
747           #  名詞 サ変接続   45
302        いる  動詞     自立   46
3340         笑  名詞 固有名詞   49
3554         日  名詞     接尾   51
3806         の  名詞   非自立   62
381        なる  動詞     自立   64
3484       さん  名詞     接尾   66
3816         ん  名詞   非自立   74
2292         ー  名詞     一般  104
2961       今日  名詞 副詞可能  108
934  プレゼント  名詞 サ変接続  111
837           _  名詞 サ変接続  117
725        てる  動詞   非自立  126
3052         RT  名詞 固有名詞  146
802           :  名詞 サ変接続  182
352        する  動詞     自立  214
821           @  名詞 サ変接続  307
1993 クリスマス  名詞     一般  785


少しはマシになってきました!

N-gram解析を行ってみます。
RMeCabパッケージではNgram関数を呼び出すことで簡単にNgram解析が可能です。
bi-gramで頻度が10を越えるものの取得は下記のように行います。

data1 <- data-blogger-escaped-data1="" data-blogger-escaped-ngram="" data-blogger-escaped-req="" data-blogger-escaped-source.txt="" data-blogger-escaped-type="1)">10,]
以下の結果は氷山の一角です。

4024               [リア-充]   21 
4616               [値段-女]    6
4875             [商品-ブス]    6
5091             [安め-商品]    6
6602             [関係-ない]    6
ちなみにこの抽出に悪意はありません。 共起語を抽出するとこんな感じです。

data <- collocate("source.txt", node = "クリスマス", span = 3) 
data[order(data$Total),]
略 
1159                    過ごす      1    11   12    25
1188                    食べる      2     4    6    25
269                         あ      5     1    6    26
1124                      言う      2     2    4    26
512                         へ      8     0    8    27
763                         何      1     8    9    27
495                       ので      3     8   11    28
666                     バイト      0     5    5    28
750                       今年     10     1   11    28
992                       来る      0     4    4    28
1085                    終わる      0    10   10    28
553                       やる      0     6    6    29
1142                      買う      1     5    6    29
1228                        ~      7     6   13    29
626                     サンタ      5     0    5    30
926                       思う      1     0    1    30
1224                        w      2     0    2    30
270                       ああ      3     2    5    31
357                       こと      3     5    8    32
399                       そう      4     0    4    32
538                     みんな     11     1   12    32
569                       れる      1     1    2    32
616                     ケーキ      2    14   16    33
725                         一      2     6    8    33
248                          ♪      9     6   15    36
1077                        笑     16     3   19    36
1117                      行く      1     4    5    36
略

1248              [[MORPHEMS]]    662   585 1247  3881
1249                [[TOKENS]]   3140  2355 5495 19313


最後にネットワーク分析行います。メモリが足らなかったので、ツイートの数は500程度に減らしてしまいました。 コードはこんな感じです。頻度は3以上のものに限定しました。

file <- NgramDF("source.txt", type=1, pos="名詞", N=3)
net <- graph.data.frame(file)
plot=(net, vertex.label=V(net)$name)
以上です。


なんとなく幸せそうな感じが伝わりとてもよかったです。笑  今後はこれを発展させ、イベントやブランド・商品に対してどの単語がどれほど影響しているのかなどを測定していきたいと思います。


また、この場を借りて。。。といっても自分のブログですが、今年お世話になった方皆さん、本当にありがとうございました!多くのことを学び、とても幸せでした。 来年も頑張るのでよろしくお願いします。


Happy Christmas!!

0 件のコメント:

コメントを投稿