第1回「入門 ソーシャルデータ」真面目に勉強する会に行ってきました

第1回「入門 ソーシャルデータ」真面目に勉強する会 @外苑前 : ATNDに参加してきました。O'Reilly Japan - 入門 ソーシャルデータが2011年11月に発行になったので、それに合わせて1章ずつ読み進めていく事を目指した勉強会です。O'Reilly Japan - 集合知プログラミングの勉強会をやっていた方が主催していて、こっちはやってるのを知った時には半分以上進んでいたので、1回目から参加出来る入門ソーシャルデータは、ちょうど良いタイミングでした。入門ソーシャルデータの方は、副題にもある通り分析と可視化がテーマで、ガチ分析よりは可視化に興味がある自分にはぴったりな本です。
ちなみに、このエントリーを書いてる時点で、既に第2回目も開催済みです。もっと早く書かないとなぁ。

感想

一応第1章は読んでおいたんですが、実際に本に載ってるコードは動かしてみてから参加した方が良かったようです。この本では、Pythonが使われていて自分がまだPythonに不慣れというのもあるし、ソーシャルデータなのでAPIを叩くわけで、ちょっと本とは仕様が変わっている場合とかありました。その辺事前に知っておけば、当日にもっとスムーズに理解できたかなーと思います。
なお、第1章ではトレンドAPIに仕様変更があった様です。ちょうどこの本に関してのエントリーでhttp://holidayworking.org/memo/2011/11/21/2/に回避策が書いてありました。

Pythonを書く環境もあまり整備してなかったので、そこでも手間取りました。別にテキストエディタなら何でも良いといえばいいんですが、使いやすい道具として煩わしくない状態になっていて欲しいです。エキPy勉強会で知ったIPythonがいいかなーと思って導入しようとしてたら、参加してない人からTwitterHome - the bpython interpreterを教えてもらって、かなり気に入りました。この勉強会とは関係ないけど、成果の1つです。

Pythonインストール

第1章を読み始めたら、いきなりPythonの環境構築から始まった。どうやらPythonはこういう分野に強いらしく、この本のサンプルコードはPythonで書かれている。Pythonを実務で使った事はないけど、ちょうど最近、エキスパートPythonプログラミングの読書会に参加しているので、割と好都合だったり。

$ pythonbrew switch 2.7.2
$ pythonbrew venv create socialdata01
$ pythonbrew venc use socialdata01
$ easy_install bpython

Pythonの環境構築の自分なりのまとめ+エキスパートPythonプログラミング読書会 第二期 01に行ってきました。 - kanonjiの日記でpythonbrew+virtualenvの環境は構築済みなので、今回用の環境を作りました。前述の通りbpythonが気に入ったので、bpythonでサンプルコードを書いて、うまくいったら保存したりします。vimで書くのもいいけど、Pythonにはまだ慣れてないので、タイプミスや文法ミスした時にすぐ分かるインタラクティブモードで書きたかった。bpythonだと補完や候補表示も分かりやすくて、Python初心者にはすごく良いと思う。


追記だけど、bpythonとかIpythonとかインタラクティブモードをREPLとは - はてなキーワードと言うらしい。Read-eval-print loop、対話型評価環境とも。

Twitterからデータの取得

第1章は、解析/可視化の体験入学的な楽しさを伝える章らしい。なのであまり難しい事はせず、流行もののTwitterのデータを使ったものになっていました。

$ easy_install twitter
import twitter
ts = twitter.Twitter(domain="search.twitter.com")
results = []
for page in range(1,3):
    results.append(ts.search(q="#social_data", rpp=100, page=page))
tweets = [ r['text'] \
    for result in results \
        for r in result['results'] ]

words = []
for t in tweets:
    words += [ w for w in t.split()]

print tweets

print len(words)
print len(set(words))

Search APIからデータを取ってきて、総ワード数/ユニークなワード数をprintしてます。ただ、洋書の和訳なので、スペースでワードが区切られている英語前提になってます。でもまぁサンプルだから。

trendsが取れない

Twitter changed Trends API (again) so trends() no longer works · Issue #56 · sixohsix/twitter · GitHub
本では、twitterパッケージの最初のサンプルとしてTrends APIからデータを取るコードが書いてあったけど、Twitter APIの仕様というかURLが変わったらしくてエラーになってしまった。あんまちゃんと調べてないけど、これがこの件のチケットぽいし、既にクローズされてるので、そのうちPyPIに新しいパッケージが載って動くようになるかも。

NetworkXでグラフの生成

NetworkXというパッケージでグラフを作る。ここで言うグラフというのは、折れ線グラフとかそういうのじゃなくグラフ理論 - Wikipediaのグラフ。

$ easy_install networkx
import networkx
g=networkx.Graph()
g.add_edge(1, 2)
g.add_node('foo')
print g.nodes()
    [1, 2, 'foo']
print g.edges()
    [(1, 2)]

add_node('foo')は、そのままfooというノードを作る。add_edge(1, 2)12というノードを作って、その2つをエッジで繋ぐ。最初コードを見たときは、add_edge(1, 2)がノードを作ってる事が分からなくって、教えてもらいました。でも引数が数字だと、ノードIdみたいなのを指定してるのかなって思うよねぇ。

NLTKで自然言語処理

$ easy_install nltk
import nltk
freq_dist = nltk.FreqDist(words)
freq_dist.key()[:50] #50個の最も頻度が高いトークン
freq_dist.key()[-50:] #50個の最も頻度が低いトークン

NLTKはNatural Language Toolkitの略らしく、自然言語処理をするパッケージ。本にあったサンプルはこんな感じで、頻度分析とかができたりする。やっぱり英語前提になっているというか、日本語だとうまく行かない。検索してみると、NLTKで日本語を扱う事についてそれなりにボリュームのあるページが出てくるので、奥が深そうな感じ。NLTKの機能だってFreqDist()だけじゃないだろうし。多分、後々の章で詳しくやるだろうと想定して、とりあえず深くは調べないで先に進みました。
ちなみに、上のコードのwordsには、前述のTwitterから取得したデータが入ってるという想定です。

『入門 ソーシャルデータ』で日本語を扱うために - Men talking over coffee with smoking Ark Royal.
勉強会に参加した人の中に、深くつっこんでエントリーにまとめた人がいました。

http://nltk.googlecode.com/svn/trunk/doc/book-jp/ch12.html
あとは、こんな感じのページとか。

MeCab

前述の通り、本のサンプルは英語前提で、ホワイトスペースでワード単位に分割してトークンとしています。日本語はホワイトスペースで分けれないので、形態素解析をする必要があり、勉強会でMeCabでやってみたという話が出てました。

なのでMeCabを入れてみました。MacPortsでMeCabを入れてPythonバインディングをvirtualenv環境に入れた - kanonjiの日記