3D mode!

Entries in 2009/01

Rubyでシンプルなページャ

あるページにアクセスして,ある処理をして,そしたら次のページに遷移して,また同じ処理をして… ってのはよくある処理です.ボクも過去に何度かそういった処理をするスクリプトを書いた覚えがあります.特に,Nokogiri 登場以後は,がしがしと XPath を扱えるようになったのでスクレイピングがとても楽しくて,その手のスクリプトを書く機会が増えました.

そこで,シンプルなページャを作ってみました.対象となる Web ページの URL と,そのページ中に「次ページへのリンク」の XPath を与えます.each に与えるブロックが,各ページへの処理になります.

サンプルでは,http://june29.jp/ にアクセスして,各エントリのタイトルとリンクを表示させています.2008年11月より古いエントリが現れたら,ページングを止めています.

コンソール出力はこんな感じです.

------------------------

http://june29.jp/

------------------------
「ウェブで一発当てる方法」を読んだ

http://june29.jp/2009/01/05/kayac-book/

ユーザ向けレコメンデーションを考える

http://june29.jp/2009/01/04/thinking-about-recommendation-for-user/

新しくなったはてなブックマークが面白い

http://june29.jp/2009/01/03/new-hatena-bookmark/

年賀状的なもの

http://june29.jp/2009/01/02/something-like-a-new-year-greeting-card/

パッケージング能力

http://june29.jp/2009/01/02/ability-topackage/

------------------------

http://june29.jp/page/2/

------------------------
2008年を振り返る!

http://june29.jp/2008/12/31/looking-back-at-the-year-2008/

Fairy Tale に行ってきた!

http://june29.jp/2008/12/28/fairy-tale/

高専カンファレンスのこれから

http://june29.jp/2008/12/21/kosenconf-in-future/

数ヶ月ぶりにテレビを楽しんだ

http://june29.jp/2008/12/21/tv-shows-are-interesting/

マイネット・ジャパンさんとの交流勉強会

http://june29.jp/2008/12/21/workshop-in-mynet/

(途中略...)

------------------------

http://june29.jp/page/6/

------------------------
LimeChatにTwitterのアイコンを表示させてみる

http://june29.jp/2008/11/03/show-twitter-user-icon-on-limechat/

どこで終わるか分からない処理を each で書くのはどうなんだろう,とか考えたりもしつつ,二転三転して今の形になっています.非常に短いプログラムですが,考えることがたくさんあって勉強になりました.引き続き,自分で使ってみながら作り込んでいこうと思っています.

「ウェブで一発当てる方法」を読んだ

面白サービスをひたすら連発してお届けしてくれる面白法人カヤックさんの本です.この本もやっぱり面白かった.

ウェブで一発当てる方法―スマッシュコンテンツ成功の法則 ウェブで一発当てる方法―スマッシュコンテンツ成功の法則
面白法人カヤック

ワークスコーポレーション 2008-12
売り上げランキング : 2794

Amazonで詳しく見る by G-Tools

内容に関してはぜひ皆さんも読んでみてくださいということで,ここでは1点だけメモ書きしておきます.

とにかく「スピード」重視で,速く作る,たくさん作る,そんなカヤック道が垣間見える濃い本でした.物作りを加速させる工夫がすごいなーと思いました.きっと,バランスが重要で,基本的には作り手に自由を与えているんだけれど,加速するための「決まり事」もあって.この本の86ページでは,「リリース前のチェック」として,作ったサービスを公開する前にチェックするべき項目をまとめたものが紹介されています.ボクは「決まり事が増えれば増えるほどスピード感は失われる」と,一部誤認していたなぁ.こうやって,繰り返し発生する作業はどんどんパターン化していって,とりあえずこれだけやっておけば安心,って状態を作っておくのはいいですね.

個人を尊重しつつも,チームで勝負しているってのが伝わってくる内容でした.面白かった!

去年,知り合いのつてで,カヤックで働いている人とお話させてもらう機会がありました.感じたのは,物作りに対する想いが熱いってこと.自分が手がけるプロダクトに思い入れがあるってのがいいなぁ.見習いたいです.

ユーザ向けレコメンデーションを考える

今回は,お仕事とも少しだけ絡む話をしてみたいと思います.

(ひとつ前のエントリ新しくなったはてなブックマークが面白いは,このエントリに含めようとして膨らみすぎてしまったはてなブックマークへの想いを切り出したものでした)

はじめに

このエントリでは,ソーシャルブックマークを主な題材として,ユーザ向けのレコメンデーションについての現段階での自分の考えを文章化してみます.今の考えに至るまで,研究室時代の仲間たちや,今の会社のメンバーとの数多くの議論があったことを強調しておきます.

ユーザ向けレコメンデーションとは

特に Web 界隈において,レコメンデーションというと,Amazon の商品ページにて提示される「この商品を買った人はこんな商品も買っています」を思い浮かべる人が多いと思います.これは「商品」に対して「商品」をレコメンデーションするものです.

ここでは,今回のテーマである「ユーザ向けレコメンデーション」を,ユーザの過去の行動履歴から,それぞれのユーザにあった情報(や他の何か)を提示するもの,とします.先に挙げた Amazon でも,ユーザの過去の購買データから,オススメの商品をメールで知らせてくれたりしますよね.これもユーザ向けレコメンデーションです.

好みの近いはてなブックマーカーを探そう!

好みの近いはてなブックマーカーを探そう!がとても良い,というのが,この文章を書こうと思ったキッカケでした.何が良いのか考えてみました.

(ちなみに結果はこれです: id:june29さんと好みが近いブックマーカー)

  • 直近のデータしか計算に用いないので,結果が頻繁に変化する
  • フィード配信によるプッシュがある
  • なぜそのユーザがオススメされるのか(どのブックマークが共通だったのか)が提示される
  • (はてなブックマークのシステム的に) 次のアクションにつながりやすい
  • (はてなブックマークのシステム的に) 結果を評価しやすい
  • (はてなブックマークのシステム的に) 結果が悪くてもマイナスになりにくい

以下,個別に考察します.

直近のデータしか計算に用いないので,結果が頻繁に変化する

ボクも修士のときに,ソーシャルブックマークのデータを用いた情報ナビゲーションのようなものに取り組みました.研究として扱う場合は,少量のデータだと統計的に云々って話になりがちですし,結果がころころと変わっては検証のしようがありません.だけどシステム的にはとても良いと思います.全データを計算に用いる場合,ブックマークが数千件にもなってくると,新しく数件をポストしたところで結果が変わらないんですよね.一度だけ「これとこれとこれとこれがオススメです!」と提示するだけでは,ユーザはもう見にこないでしょう.

フィード配信によるプッシュがある

たとえレコメンデーションの結果が日々更新されるとしても,わざわざそのページに行って内容を確認するかっていうと,しませんよね.フィード配信があるので,変化をチェックできています.

なぜそのユーザがオススメされるのか(どのブックマークが共通だったのか)が提示される

後述しますが,根拠となるデータを示すのは大事です.「この人は Web 好きの人だなー」「この人はジョジョだなー」とその場である程度の情報が得られるので,「最近ちょっとジョジョのアンテナが鈍っているから,強化しておくか」といった判断もできます.

次のアクションにつながりやすい

結果を評価しやすい

結果が悪くてもマイナスになりにくい

オススメされたユーザのブックマークを見に行って,よさそうだったらワンクリックでお気に入りに追加できちゃいます.お気に入りに登録してから数日間,様子を見てみて,自分がブックマークしているエントリをその人もよくブックマークしていて,気の利いたコメントなんかが書かれていたらハッピーですよね.ブックマークが全然重ならなくても特に不利益はありませんし,ネガティブなコメントが気になるようだったらお気に入りから外しちゃってもいいでしょう.いずれにせよ,嬉しいことはいくつかあっても,悲しいことはほとんど起きません.

これら3つは,レコメンデーションのシステムというより,はてなブックマークのシステム的にそうなっているということで,はてなブックマークは「こんなユーザをお気に入りに登録したらどうですか」というレコメンデーションと,大変に相性が良いと言えると思います.公式にもユーザのオススメ機能がありますものね.その辺りも見据えて作っている感じがして恐ろしいです.

良い点のまとめ

こうしてみると,レコメンデーションで最も重要と考えられがちな「何がオススメされるか」について,ボクはあまり気にしていないことが分かります.レコメンデーションは,その内容の他にも重要となる要素がたくさんあります.また,レコメンデーションを適用する先のシステム(この場合ははてなブックマーク)の作りによって,レコメンデーションの結果からどのようにアクションを起こせばいいか,その結果得られるメリットが大きいか,デメリットはないか,などが大きく左右されると思います.

弊社では,汎用化したレコメンデーションエンジンの提供を行っているので,導入先のシステムとの連携については悩ましいです… ただ似たものを提供すれば良い結果が得られる,ってわけではありません.

情報推薦アルゴリズムの効果をどう評価するのか – 図書館情報学を学ぶは,ブックマークコメントも含めて面白い話が多いです.そもそも「これがオススメされれば正解」なんて明確な解をユーザ自身が持たない状況で,適合率がどうのこうのという議論にどれだけ意味があるのか,疑わしいところですよね.それならば,オススメ結果が喜ばれなかったときの失敗コストをできる限り低くする工夫をして,再現率(これも定義を曖昧にしたまま使うと危険な言葉ですが)を上げられるように,「こんなユーザさんもいたんですね」を多く提供できるようにするのが,システム的には吉だと考えます.

ナビゲーションの 5W1H

一旦,レコメンデーションをナビゲーションのひとつとして捉えてみることにします.ナビゲーションを有効に機能させるためには,ユーザの 5W1H (What, When, Where, Who, Why, How) を意識しなければなりません.レコメンデーションのアルゴリズムなんてものは,この中の What をどうするか,という部分しか扱いません(計算量の話なんかは What の範疇をはみ出すかもしれません).先に述べた「オススメ理由の提示」は,もちろん Why に該当します.

例えば,Google の検索連動広告が優れているのは,「ユーザがその言葉で検索したとき」という When をピンポイントで狙っているからだと言えましょう.加えて,検索結果の一部のように見せているのは How の工夫と言っていいかもしれません.

適切なナビゲーションが行われれば,ユーザは気持ちよさを感じながら,望む情報にたどりつくことができます.好みの近いはてなブックマーカーを探そう!は,はてなブックマーク本体のお気に入り機能との相性の良さもありますが,ユーザの 5W1H を上手に捉えてレコメンデーションを提供してくれているシステムだと思います.素晴らしいです.

さいごに

アイテム(商品など)に似たアイテムをレコメンデーションする場合と異なり,各ユーザに対して個別にレコメンデーションを提示するときは,そのユーザ用にビューを用意しなければなりません.それがログイン後に訪れるホーム画面のような場所なのか,レコメンデーション専用のページでの表示にするのか,色々あるかと思いますが,ユーザフレンドリーにするには様々な工夫が必要です.ほとんど変動しないコンテンツが繰り返し同じ場所に表示されるようだと,ユーザは次第にその領域には「何もない」と認識するようになり,いざ「これだ!」というコンテンツを用意しても,気付いてもらえないことにもなりかねません.専用ページを用意した場合にも,一度訪れて「何もない」と認識してしまったユーザは,よほどのことがなければ戻ってきません.

レコメンデーションとは,そもそも「必要ではないけど,あるといいかも」ぐらいのものを提示するものなので,見せ方はとても難しいです.アイテムからアイテムへのレコメンデーションにおいても同様の難しさはあるのですが,こちらは,ユーザ側が「よくあるアレだね」と学習していて,かなり受け入れられやすくなっています.

レコメンデーションエンジンを提供しているチームの人間として,考え続けていきたいテーマです.

新しくなったはてなブックマークが面白い

年も明けてしまって,今更感たっぷりですね.遅ればせながら,ようやく考えがまとまりつつあるので書きます.

はてなブックマークが新しくなってから,開発者の皆さんの狙い通り,ボクも他のユーザさんを気軽に「お気に入り」登録するようになり,とても楽しく利用させてもらっています.相変わらずメインで使っているのは Delicious で,Firefox の拡張機能によるブラウザとの統合が素晴らしすぎてなかなか離れられないのだけど,自分のブックマークを見返して楽しいのは,断然,はてなブックマークの方です.

新はてなブックマークは,随所にソーシャル化の工夫が取り入れられていて,なおかつ各ユーザが自分なりに楽しめるようにできています.ボクの中では Highly Socialized and Personalized Bookmark って感じです.急に英語で言いたくなりました.妥当な英語になっているかどうかは分かりません.

潜在的価値より実体験

インターネットや Web を語る上で,しばしば「世界中の人と〜〜〜」ってな風に語られることがありますが,きっと「世界中の60億人とコミュニケーションできる」という潜在的な価値と同じかそれ以上に,その中から「本当に気の合う両手で数えられるくらいの数人と出会える」という実体験は重要なんだと思います.

これをソーシャルブックマークに当てはめて考えると,「どこの誰とも知らない100人がブックマークしています」という情報より,「ブログを購読させてもらっているあの人たちがこんなコメントをしています」という情報の方が,価値が高いかもしれないということです.そしてまた,情報の受信者から発信者になればなるほど,後者の情報に重きを置くようになるのではないか,とも思います.自分の発信する情報に共鳴してくれる人は,それこそ直接的に気の合う人だからです.

ソーシャルな色合いが濃くなったはてなブックマークを楽しめている背景には,ソーシャル Web の発展もあるでしょう.毎度毎度言及している Twitter や Tumblr のおかげで,ただの文字列だった ID が,アイデンティティを伴った真の意味での ID に昇格することも多くなり,はてなスター等の登場とともに「良いと感じたものに良いと言う」ための閾値がグッと下がり,緩くも強力なコミュニケーションの場が形成されました.こういった背景がなければ,ボクは気軽に他のユーザさんをぽんぽんとお気に入りに登録できていないかもしれません.

絶妙なバランス

ボクが Web にのめり込み始めた2004年ぐらいには,すでにソーシャルなんちゃらって呼ばれるサービスはたくさんあって,「そのユーザのページに行けばそのユーザに関する情報が得られる」って意識付けは充分になされていたと感じます.その後,Twitter でいう home,Tumblr でいう dashboard のような,そこに行けばお友達の最新情報がとめどなく流れてくるタイプのビューもよく見かけるようになりました.去年の10月に Flickr が微妙にリニューアルされたときも,機能強化されたのは home まわりでした.そのアプリケーション上でのお友達が増えれば増えるほど,すべてのお友達のユーザページを訪問するのは億劫になります.フィードリーダによる閲覧で事足りるようなコンテンツであればそれで問題ないかもしれませんが,とりあえずログインして最初に飛ばされるビューに,一通りの情報が揃っているとありがたいですよね.まさに home って感じがして,毎日訪れたくなります.

新はてなブックマークがそれらを飛び越えるほどにすごいなぁと思うのは,サイト上のあらゆるページが home のビューも兼ねている点です.自分がブックマークしたエントリに,お気に入りユーザのブックマークがついていればそれも合わせて表示されます.各エントリページにおいても,お気に入りユーザの存在は強調されますね.たとえば,自分のブックマークページに,はてなブックマークの全ユーザのデータも併せて表示されてしまっては,システム負荷も高くなり,情報の一覧性も乏しくなり,デメリットが大きすぎます.だけど,対象をお気に入りユーザに絞ることで,自分のブックマークページもほどよく静的でほどよく動的な状態が実現されています.絶妙なバランスが素晴らしい.

個人特化からグループ特化へ

結局よくまとまらないまま書きましたが,とにかく新はてなブックマークはとびきり楽しいです.はてなブックマークのリニューアルは,自分の中では2008年の主要トピックのひとつでした.

ここで,別の主要トピックとして並べておきたいのが FriendFeed です.FriendFeed については,Web 好きのお友達と「何が面白いか」「なぜメインストリームにならないか」と何度も議論していて,その度に「もう一歩なんだよなぁ」的な結論になりがちなのですが,一皮むければ一気に楽しくなるアプリケーションだと予感しています.本当は FriendFeed をネタにして1エントリを書けちゃうぐらいです.

それで,FriendFeed には溢れる情報に埋もれないようにするために整理・分類機能ってのがあって,でも面倒臭くて使っていないんですよ。

ここから先は本当に感覚しかない話で,書いていて辛いんですけど… はてなブックマークにおいても,ユーザが誰かを明示的にお気に入り登録しなくても,「ここに行けば(自分にとって)面白い情報がある」って場所を作れたら本当にすごいことになるなぁ.「ユーザ全体」と「各ユーザ」の間ぐらいの粒度で,人気エントリーを出す,みたいな感じです.まったく説明できていません.ゴメンなさい.

例えば、僕はラーメンが好きだからといってラーメンコミュニティに入っていて、そのラーメンコミュニティの中にPerlの記事が入ってきたら、ラーメンコミュニティの人たちは嫌がるじゃないですか。だから、どのコミュニティに自分のブックマークをフィードするかを選べる機能は必要かもしれないと思っています。でも、あまり選択肢が増えていくとだんだん不便になっていくので、そこをどうにかしたいんですけど。

id:jkondoが聞く、はてなブックマークリニューアルの舞台裏

そうそう,もう中の人がずっと考えている話です.これを上手いこと実現してほしいなぁって,もしかしたらやってくれるんじゃないかなぁって,超絶に期待しています.

はてなブックマーク楽しい!

年賀状的なもの

2009

昔は,年賀状のデザインを考えたりするのが楽しくて仕方がなかったなぁ.そんなことを思い出しながら,ここを読んでくれている皆さんには新年のご挨拶.

4E1129