yondor(よんどるβ)をリリースしました

自分が欲しいから自分のために作る第4弾。
よんどる
今よんでるページをtwitterへ1クリックでポストするためのツール「yondor(よんどる)」をプロトタイプβとしてリリース。
(むしろα版と呼ぶの方が近いかもしれないレベルだけど、公開しちゃったのでβ版)

どうしてもソーシャルブックマークだと、他のユーザーとのシェアを意識するための感想や、きちんと整理しておくためのタグを考える必要があり、
気軽にポストするにはどうしても心理的コストがかかる(私の場合)。
しかし、URL短縮サービスを使っても、実は高機能過ぎて1クリックではポストできないケースばかり。

だったら、何も考えずに「とりあえずクリップ」しておくためのサービスがあってもいいんじゃないか。ちょうど、ブログを書く前段階や、それより粒度の小さい話題として、思考の断片をtwitterにポストするようにね。

タグや感想なんかなくても、あなたが見てきたページの履歴には、
きっと個性的であり、そこには他の人にはない独自のアンテナがある。
そして、それはあとできっと誰かの役に立つ(と信じたい)。

などと思う(後付け)こともあったり、ちょうど、同企画第3弾で、webdesignStatioを作ってから、特定の分野の記事ページを今までに15,000ページ程収集し解析してきて(そして今も10分毎に増え続けている)、これは自動的に収集されたウェブデザインに関係する記事から、私の独自の選択の視点(趣向)を教え込んで運用している背景がありーの。

そんなこんなで整理すると

  • 1クリックでtwitterにポストするツールが欲しかった
  • 関心のあるページを収集しておけば、その人の関心事をコンピュータ上にモデル化できんじゃないかと
  • +twitterAPI(oAuth)を使ってみたかった
  • +Codeigniterを使ってみたかった
  • +なんか作りたかった

という上記複合的な理由で作ったのが今回のツール。

正直なところoAuthとCodeigniterでお勉強がてらなので、完成度よりも技術習得が主であったことは、公開後の今となっては隠しておきたい。
1クリックでのポストはまだしも、見てるページをどんどん登録して個人的な関心事を他人のサーバーに教え込もうなどという奇特な方は少ないと思うが、せっかく作ったので、誰に向けてのアピールかも分からないが、リリースをつぶやいちゃったので後悔公開。

前回同様、動作は完全無保証なうえ、いきなりデザインを変えようが、貧弱な自宅サーバーでの運用なので止まるし止める。突然の閉鎖も十分にあり得る、などはご了承いただいたうえで、それでも構わない、使いたいという方のお役に立てるのであればこれ幸い。
なお、1クリックで投稿できるってのは、twitterにログインしっぱなしで、twitterのoAuth認証有効期限が現在のように長め(無期限らしい)に設定されている場合に限った話。
前述以外の条件では、oAuthによるアプリケーション認証画面が表示され「許可する」ボタンを、もう1クリックしないといけないということを事前了解いただきたい。

問題のご指摘(特にMacブラウザからのBookmarkletが最終動作確認できていない、など)等ございましたら@ohbatchまで。

ベイジアンフィルタをPHPから利用する

ここ2ヶ月ほどずっと仕事から帰ってきて、ベイジアンフィルタの組み込みばかりやっていた。せっかく動くようになったので、技術面でのつまづき等についても残しておきたいと思う。

PHPでベイジアンフィルタ (棚からパルチャギ)」で紹介されて「PHP Naive Bayesian Filter(XHTML.net)」を参考に、というかライブラリもブログの記事もほとんどそのまま利用させていただいた。解説どおりにMySQLにデータベースを作成し、「Yahoo!日本語形態素解析」を噛ませる。上記サイトでは、トークンの切り出しメソッドをオーバーライドされていたが、それすらも面倒だったのでそのまま直接メソッドの内容を書き換えるが、ほぼそのまま利用させていただいたので、ソースも省略、詰まったところやさらに手を加えたところを中心に記すことにする。

ありがたいことに、思ったよりスムースに早い段階で動作が確認できたのだが、早速文書を大量に流し込んでフィルタを実行してみると、なぜかものの見事に、全ての記事が「スパム」に判定される。どんな内容でも「spamである確率1、hamである確率0」ってことはないだろうと、メソッド「categorize」の最深ブロックにデバッグ出力を組み込んでみる。

echo $category.’ ‘.$token.’ ‘.$word['count'].’ ‘.$proba.’ ‘.$scores[$category].”\n”;

これで、判定しようしている文書に出現した単語を元にスパム/ハムである確率が変化していく様子がみてとれる。追いかけていくと、どうもアルゴリズムの特性上、事前学習させる「スパム」「ハム」それぞれの文書量(単語量)の偏りが、フィルタリングの精度に大きく影響してしまうらしい。今回の場合、「ハムとして学習された文書量がスパムのそれと比べ多過ぎ」といったところのようだ。
学習した結果の単語量は、テーブル「nb_categories」のフィールド「word_count」にそれぞれ記録されるので、どのカテゴリ(今回はスパム・ハムの2カテゴリ)においても限りなく同等の単語量となるよう学習が必要のようだ。

もうひとつ、同様にメソッド「categorize」の最後にリスケール(rescale)というカテゴリごとの適合度を正規化する関数を通しているようなのだが、動かしてみるとどうもここで丸め誤差が大きい(ほぼ 0 or 1 の二値化に近い数値が返る)。なので、いっそのこと取っ払って出力された適合度に応じた動きはアプリケーションに任せる方針とする。

//return $this->_rescale($scores); //やめ
return $scores; //イキ

最終的にはアプリケーション側で以下のようにハム・スパムの適合度の比を求め、あとは平方根をかけまくって簡易リスケールしてる。結果が1未満なら概ねスパムと判断できそうだ。(ただし適合度の比で判定ができるのは、カテゴリが2通りの場合に限られる)

$scores['ham']/$scores['spam']

webdesignStatioひとまず完成

webdesignStatioへのリンク前回取りあえずプロトタイプを作って晒したwebdesignStatioが、当初描いていたモノが一通り形になったので、これまでの経緯(努力?)を記す。

2ヶ月間稼働させてみた所感
検索対象のタグの種類を増やしたこと、また、収集間隔を3時間から徐々に1時間→30分→最終的に10分間隔まで縮めたことにより、(勝手に)ベンチマークにしている、同種のサイトと同じくらいの収集量に近づいてきた。単純にブログ単位でRSSフィードを購読していたら、決して見つけられないようなブログ記事などに出会うこともできた。
しかし、こういう多種多量のデータを取り扱う仕組みは、動かしてみないと気付かないことが多く、実際多くの気付きが得られた。

  • ページ内容とは全く無関係のタグを付けている(スパムに近い)ソーシャルブックマークにより、アフィリエイトやドロップシッピング、果てにはエロサイトまでが収集されてしまっている
  • 情報を得るためのニュース記事やTIPSではなく、「きれいに作られた」だけの企業サイトやキャンペーンサイトを、ブックマークするという使い方が混じっている
  • ウェブ制作に関わる記事じゃなく、ウェブ制作会社のサイトが混じる。
  • はてブと同じ内容になってしまうと「はてブ読んだ方が早いやん」ってなっちゃうのだが、他のブックマークサイト(特にYahoo、Buzzurlあたり)には結構ノイズが多い

で、その対策として最終的にベイジアンフィルタ(Wikipedia)に落ち着いたのだが、それが「モノになる」までの軌跡がこちら。

  • 収集し記事について、私が「読みたい」か「読みたくない」か全くの主観のみでひたすら分類
  • それらの記事をYahoo!ディベロッパーネットワーク日本語形態素解析にかけて、単語レベルにまで落とし込んで分類
  • さらに迷惑メールの判定に使われるベイジアンフィルタリングのアルゴリズムに分類結果を流し込んで学習させる
  • 気に入った学習結果が得られるまで上記を繰り返し。

その結果、収集総数約8,000ページ、学習ページ1,000ページ、分類キーワード数15,000種にまで膨れ上がってきたあたりで、ようやく納得のいくものになってきた。最後の1ヶ月間は、ひたすらこの学習を繰り返してばかりだった。もうあと組み込むとしたら再学習の手間を軽減させるくらいかな。「重複したりノイズが混じるRSSを読みたくない」というなんともアマノジャクな動機で始めたのに、よくもまぁここまで私のモチベーションが枯れなかったものだ。

要はこれ、何がしたいのかと言うと
当初の趣旨どおり、このサイトは、今でも私自身のための情報収集を目的にすることに全く変わりはない。いや、はっきり言って「みんなの声を取り入れた、みんなのためのサイト」なんかにするつもりは毛頭ない。むしろ「私の趣味趣向」を学習したエージェントが「半自動的」に情報をかき集めてくることに意味が見いだせるものだと思っている。

実は、私自身インターネットを使う時間が長くなるにつれ、「情報に溺れている/踊らされている」感覚がずっと付きまとって、インターネットでの情報収集にモヤモヤしたものを感じていた。ところが、twitterやtumblrで出てきた「follow」という枠組みを知って、このモヤモヤ感が少し整理ができた気がした。

ウェブデザイン関連のブログを書いていらっしゃる方たちは、海外サイトを翻訳されてらっしゃる方が多いのだが、それこそものすごい数の情報を、それぞれのブロガーさんの視点で「選別して」記事にされてらっしゃる。すると、過去の記事の履歴や閲覧体験から、読者が「この人が選ぶニュースなら『チェックしておこう』もしくは『(ネガティブな見方だけれど)時間の無駄にならない』」という、発信者と読者との間での暗黙的な信頼関係が成り立った上に、すんごい数の購読者がいらっしゃる。
つまり、私達を取り巻く情報が多すぎるため、「何を探してきたか」ではなく「誰の目線で探してきたか」という観点から収集する情報を絞り込むことが、今のインターネットでは非常に有用なんだと思い始めている。

ウェブ制作に関するいわゆるTips系の記事だけに限ると、今ではようやく量も速さも個人的には十分満足がいくレベルになってきているし、私自身最近はここからしか情報収集していない。
どなたかが海外サイトの翻訳記事をアップする前に元サイトが収集されてきたりしてるし、日本語のまとめ記事はまとめ記事としてもちろん収集できてる。ブロガーさんの「ブログ書いた」とツイートを発見して30分後にはきちんとこちらでも捕捉できているのを確認して、ひとりニヤニヤするのを毎日続けてきたんやから^^

今まで通り、こいつはいきなりテストでTLが埋まるほどツイートしたりもするし、まだまだ学習されてない予期せぬカテゴリの記事が載っかってくる事もある。私のためだけのツールだけど、一応bit.lyでクリックされた記事の数はモニタしてるし、もしかしたら誰かの役に立ててるかも知れないとも思うので、頑張ってしばらくこいつに私の関心を教え続けていこうと思う。

Copyright © 2010 — ohbatch.net Blog | Site design by Trevor Fitzgerald