パストラックは、「社会」「政治」「スポーツ」などのカテゴリごとにページのランキングを見る機能があります。
パストラックの注目・人気・定番のページ一覧で右上のセレクトボックスからカテゴリを選ぶと、そのカテゴリの一覧が表示されます。
例:
- 「政治」の人気ページ一覧(人気ページ=昨日・今日あたりによく見られたページ)
- http://pathtraq.com/popular?category=Politics
- 「スポーツ」の注目ページ一覧(注目ページ=ここウン時間によく見られたページ)
- http://pathtraq.com/popular?m=upcoming&category=Sports
- 「車/二輪」の人気ページ一覧
- http://pathtraq.com/popular?category=Motor
- 「食/グルメ」の注目ページ一覧
- http://pathtraq.com/popular?m=upcoming&category=Foods
ちなみに、「Pathtraq が贈る人気ページ」ウィジェットでもそのカテゴリ毎のランキング取得に対応してたりなんかします。
このカテゴリ分類は自動で行っているのですが、ようやくそろそろ語っても恥ずかしくない程度に精度も上がってきてくれたので、「Webページの自動カテゴライズ」という切り口でその裏側をざっくり紹介します。
まず Web ページの自動カテゴライズを行うには、以下の技術要素が必要になります。
- クローラー
- 本文抽出
- 分かち書き
- カテゴライズ
このうち、今回のケースでは対象となる web ページの URL についてはパストラック本体が収集してくれるので、クローラーは特別なものは必要ありませんでした(せいぜいプロキシーとかキャッシュとか細かい最適化のレベルの話)。
本文抽出については話が長くなるので別稿で。
分かち書きには MeCab を利用させていただきました。
本文が抽出できて、分かち書きまで済んでいれば、それ使って分類してくれるなんらかのフィルタの登場となります。
いくつか手法がある中で一般にはベイジアンフィルタが使われることが多いようです。今回のカテゴライズでもベイジアンを採用しました。
ベイジアンは追加学習のコストが低いので、Web ページのように変遷の大きいものについて適しているだろうという判断です。
分類精度が学習量と学習データに対して結構シビアな反応を示すので、そのあたりは結構気を使いますね(スパムか非スパムかという2値の判定ならそこまで神経質にならなくてもいいと思うんですが)。カテゴリー毎の一覧を作成するという点を考えると、分類漏れより間違って分類してしまう方がダメージが大きいので、少し過学習寄りに調整していけばなかなかうまくいくということがわかりました。
ちなみに、ベイジアンなら実装ライブラリがすでにそこそこあるので、自分で実装しなくていいというメリットもあります。
また、カテゴライズはどうしてもやっぱりある程度重い処理になりますし、また Web ページを対象とする場合は日々膨大なデータを処理できる必要が生じるので、一定のスケーラビリティを持たせる必要があります。
今回は、全体を Ruby で実装しており、本文抽出からカテゴライズまでの一連の処理を dRuby を用いて分散実行できるようにしました。
1台の仮想サーバ環境でも1日50万件程度の処理能力があり、自動分類のようなそこそこ重い処理でこのくらいの速度が出てればいいかなあと個人的には満足してるんですが、光成さんには「 C/C++ で書かないの?」とかささやかれちゃったりします(苦笑)。
あとの課題としては、今後の継続的な学習をどうしていくかというところでしょうか。
学習をも自動化する、というのは別の挑戦として楽しそうではあるんですが、ちょっとハードル高すぎるのでw、なんとか半自動化する方向で色々検討しているところです。
ところで、「出来合いのフィルタ」を使ってちゃんとした精度が出るのか? という疑問を持たれる方もいるかもしれません。
でも自動カテゴライズを作ってみてよくわかったことがあって、実は学習フィルタをどうこうするよりも、本文抽出の精度の方がはるかに分類精度へのインパクトが大きいんですよね。まあ「Webページ」の分類に限った話であるのだろうとは思いますけど。
本文抽出系の話に手を染めたことのある人なら諸手で同意してくれるでしょうが、この「Web ページ」というのは極めてノイズの多い代物で、ちょっと油断するとサイドバーに「本文」より長い宣伝が書いてあったりなんてのは序の口もいいところ。メニューやフッター、関連リンク、コメント/トラックバックなどなどなどなどなどなどをきちんと取り除けているかどうかが分類精度向上の大きな鍵になります。
と、本文抽出の話にきれいに戻ってきたところで、続きは次回「Webページの本文抽出」。
一応、本文抽出のいろいろ泥臭い話とかしつつ、汎用性のある部分についてはライブラリとして公開しようかなと思ってます(まだ日本語特化のコードとか埋め込まれてしまっているので、ただいまそれを除去中)。
乞うご期待?