第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がいいかなーと思って導入しようとしてたら、参加してない人からTwitterでHome - 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してます。ただ、洋書の和訳なので、スペースでワードが区切られている英語前提になってます。でもまぁサンプルだから。
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)
は1
と2
というノードを作って、その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
あとは、こんな感じのページとか。