つぶやき解析 第2弾 in golang

スクリーンショット 2015-09-23 4.16.24

時の流れがはやすぎて、前回の試みから半年もの月日が経ってしまいましたが、今日はこんなん作りました。本当はグラフ出したり、評価指標作ったりしようと思っていろいろ考えていたのですが、途中から別のことをはじめてしまったので取りあえず出来ているものであげました。
JP TWEET PICKER – あなたがTwitterでよく使う言葉を抽出します

形態素解析について

前回はElasticsearch経由でkuromojiを使っていましたが、今回はmecabを直接叩くようにしました。mecabってなんだという話は割愛して、辞書に関しても前回は特に特別用意していなかったところ、今回はmecab-ipadic-NEologdを使うようにしました。網羅的でありつつも、インターネットでの流行りものにも強い感じがしたので、Tweet文との相性も良いのではないかと思います。
neologd/mecab-ipadic-neologd

また、前回の反省として、ツイートに含まれるurlや@ではじまるメンション等々がノイズとなってしまうことがあったので、ノイズ除去用のフィルターを作って通すようにしました。

単語の重みづけについて

前回一番大きかったところで、”する”や”なる”等の、あまり意味はないがよく使われる品詞が上位に来てしまうという問題があって、今回はそれを除外するための処理を入れています。td-idfと呼ばれるものですが、要するに、異なる文書で毎回のように出てくるような単語は、その文書において重要じゃないよね、という考え方で、[単語A/単語総数]に対して[単語出現文書数/文書総数]を元に算出するidf値なるものをかけ算する形になります。ツールの中ではScoreとして表示されるものです。

ここでいう1文書とは、本来でいえば小説のの1章くらいのボリュームのものになるので、1tweetではなく、1アカウントを1文書としています。つまり、[単語出現文書数/文書総数]は、異なるアカウントの解析を行う度にサンプルが増えていくので、使われれば使われる程正確な分析が可能になるはずです。本来は、はじめから何かしらの文書を食わせて[単語出現文書数/文書総数]のデータを作っておくものですが、1から育てるのも面白いかなと思ってあえて空っぽにしてあります。
tf-idf – Wikipedia

Go言語について

Goで書きはじめた理由のひとつに、CGOとよばれるGo言語とC言語を一緒にしてコンパイルしてしまう仕組みがあって、日本語の形態素解析に使っているmecabがC言語だったので、よりシンプルに作れるかなという目論みがありました。ただ、CGOを使ってしまうと場合によってはGo言語のクロスコンパイルを捨てることになるので、手元でbuildしてサーバーにはバイナリだけ置く、ということが出来なくなってしまって、それに関してはあんまりおいしくない感じでした。

Go言語自体は普段書いている言語と勝手が大きく違うので、興味深いところがあります。プログラミングの世界でダックタイピングと呼ばれる「もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである」という概念があって、つまりGo言語のsortはLen(長さ),Swap(入れ替え),Less(比較)の三つのインタフェース(メソッド)がないものには使えないんだけれども、逆に言えば中身がなんであれ、その三つのインタフェースさえもっていれば、どんなものでもsortできるものだとみなされ、実行することができます。何かしらの文書を読んでそれを知ることができても、なかなか実践してみないと良いところや問題が見えてこないものもあって、普段必要とされないような領域の知識が必要になるという点で、とても面白いと思います。

速度の点でいえば、やはりスクリプト言語の比ではなく、PICKERが重いのはTwitterAPIからのレスポンス待ちであって、処理自体は非常に高速に動作しています。今後個人的なCLIツールとか、バッチ処理やら力技で何かしたい時は、Goで書くんじゃないかなと思います。今までそういったものはNode.jsかRubyで書くことが多くて、あまりに重いので元ファイルを分割して少しずつ食わせたり、何かと面倒だったので、やってみて良かったなと思ったりします。

さいごに

おしまい。