朝7時30分に起きて駒沢公園をジョギングすること10日目のmikioです。だいぶ体が軽くなってきて、そろそろ体型にも変化が出てくるかなと期待する毎日です。さて、以前の記事で予告した通り、Tokyo Dystopiaを使ったmixi内の検索機能をインディーズ機能としてリリースしました。「かんたん友人検索」という名のとおり、mixiの登録ユーザを対象として友人や知人を簡単に検索する機能です。操作を簡潔にしながらも、マイミクシィのつながりなどを使って検索精度を高めているのが特徴です。

シンプルにした

見た目として最も大きな特徴は、従来の友人検索よりも入力フィールドの数を減らしたことです。従来では「姓」「名」「ニックネーム」「性別」「年齢(下限)」「年齢(上限)」「血液型」「現住所(都道府県)」「現住所(市区町村)」「出身地(都道府県)」「出身地(市区町村)」「趣味」「職業」「キーワード」「写真」と15個もの入力フィールドを提示するものでした。これでは、どこに何を入力すれば適切に検索できるかよくわかりません。友人検索を最もよく使うのはmixiに登録したての人達なのですが、そういう初心者の人達にこんなにたくさんの選択肢を提供するのは、正直言って、あまり良い設計とは言えないと思います。

■ 従来の検索画面

old_search.png

そこで、かんたん友人検索では、入力フィールドを思い切って一つにしてしまいました。これなら、キーワードを入れて「検索」ボタンを押すだけで、迷う余地が一切ありませんね。ここで検索すると、「姓」「名」「ニックネーム」の全てを対象とした検索が実行されます。

■ シンプルにした検索画面

new_search.png

検索結果は従来と変わらず、該当するユーザのニックネームや写真や紹介文が表示されます。

■ 検索結果の画面

search_result.png

名前検索を統合した理由

従来の検索で「姓」「名」「ニックネーム」を分けていた機構も、mixiのユーザ数がまだ10万人やそこらで、ほとんどのユーザが本名を開示していた時代には期待通りに機能していました。しかし、1500万人超のサイトに成長した現在では、本名の代わりに、「わかる人にだけわかる」ような文字列を名前として登録する人が増えてきました。友達に呼ばれるニックネームや好きな映画のキャラクター名などを使っている人もいます。その方が、「これで検索すれば自分にたどり着けるよ」と人に説明するためのキーワードとして有効だという判断もあるのかもしれません。

そうなると、例えば、姓:”ルパン”、名前:”三世”、ニックネーム:”lupin” という人を従来の検索機能で探す場合には困ったことになります。「そういえばあいつ “ルパン” って名前でmixiやってるって言ってたけど、姓と名とニックネームのどれに指定すればいいかわからん」といったことになります。探す側としては “ルパン” が姓なのか名なのかニックネームなのかはどうでもいいことなので、それらの区分ごとに何回も検索をしてイラっとさせられるよりも、一回の入力で一気に検索できた方が幸せですよね。検索項目を統合したおかげでヒット数が増加して適合率が下がってしまう心配はありますが、この問題に対しては後述するスコアリングの改善で対処しています。

検索オプション

従来の検索でも性別や年齢などの属性で検索結果を絞り込むことができていましたが、実際にそれが使われるケースは多くありませんでした。探したいユーザが必ずしもその性別や年齢などのプロフィールを公開しているとは限らないので、検索条件として指定するとかえってうまく探せないことが多いからでしょう。とはいえ、一般的過ぎる名前を使っているユーザの検索結果を絞り込むのには有用であることもないとは言いきれないので、機能としては残すことにしました。

「よく使う機能はデフォルトにして、あまり使わない機能はオプションにする」というユーザインターフェイスの定石を踏襲し、あまり使わない機能である属性絞り込みは「検索オプション」という別ページに分離することにしました。Googleなどでもこのような構成はお馴染みのことと思います。

■ 検索オプションの画面

new_search2.png

検索オプションでは、「名前(姓・名・ニックネーム)」だけでなく、名前と自己紹介文を統合した全文検索もできるようにしています。また、「性別」「年齢」「現住所」「出身地」による絞り込みは従来の検索機能から引き継いで持たせています。「血液型」「趣味」「職業」はほとんど使われていないし、実際に有用だとも思わないので、廃止しました。

適合度順表示

従来の検索では、検索結果は、mixiへの登録日の新しい順(実際にはIDの降順)で並べられていました。これもmixiの規模が小さかった時代の名残りで、今や新規登録ユーザだというだけで日記を閲覧したりマイミクシィ申請をしたりする興味の対象になるわけではありません。

友人検索を使う動機は、自分の友人・知人を探して、日記を読んだりメッセージのやりとりをしたりマイミクシィ申請をしたりすることでしょう。あるいは、知らない人であっても、何か共通の話題を持った人に出会ってコミュニケーションを始めることでしょう。

となると、検索操作を行っている人となるべく共通点が多い人を優先的に表示するのが妥当だと考えられます。そこで、自分の住所や出身地が一致するユーザや年齢が近いユーザはポイントを上げるようなスコアシステムを導入しました(もちろん、全体公開されている属性のみを使っています)。また、ログイン時間が近くてコミュニケーションがとりやすい状態にあるユーザもスコアを上げるようにしました。

さらに、マイミクシィのつながりを解析して、自分からのホップ数(自分は0、直接のマイミクは1、マイミクのマイミクは2、マイミクのマイミクのマイミクは3、…)が低いユーザ、すなわち自分と友人ネットワーク的に近いユーザほどスコアが上がるようにもしました。これによって、たとえ「佐藤」「鈴木」「山田」といった一般的な名字で検索したとしても、知人が先頭もしくは1ページ目に表示されてすぐ見つけられる確率は格段に上昇したと思います。Googleにおけるページランクのようなアプローチをmixi上で実装した感じでしょうか。アルゴリズムの基本的な考えかたはマイミクシィレコメンドとほぼ同じですが、今回はオンデマンドで計算していることと3ホップ以上も対象に計算しているところが違います。

■ システム構成イメージ

friendsearchstructure.png

同級生を探してみよう

まず、かんたん友人検索の検索オプションページを開いてください。そこで、検索キーワードの欄の右側のリストボックスで「名前と自己紹介」を選択してください。そして、自分のキーワード入力欄に自分が通っていた中学校や高校などの名前を入れて、「検索する」ボタンを押してください(年齢などの条件は入れない方が探しやすいです)。以下のように二つの単語を「||」で区切る(前後に空白が必要)といわゆるOR検索をすることもできます。

所沢高校 || 所沢高等学校

そうすると、人によっては、いきなり1ページ目に同級生が出てくるかもしれません。何ページか見ればおそらく何人か出てくると思います。もし該当数が多すぎるようならば、自分の年齢の前後1年くらいを指定して絞り込んでみてもよいでしょう。同級生が見つかったらその人とマイミクになってみてもよいでしょう。そうすると、しばらくするとそのマイミクシィ関係が加味されて、さらに同級生が見つけやすくなります。

ギークな技術者の皆様の中には、同級生なんて興味ないという方もいると思います。そんなあなたは、業界用語を使って友人・知人を探してみましょう。例えば以下のような条件はどうでしょう(もちろん、表示される検索結果は人によって異なります)。

I ♥ インディーズ機能

かんたん友人検索はインディーズ機能としてリリースしました。特にバックエンド(検索エンジンやデータマイニングエンジンやストレージエンジンなど)の研究開発工程を含んだプロジェクトは開発者自身がイニシアティブをとって進めないと明後日の方向に進みがちなわけですが、インディーズ機能として開発できたおかげで今回はかなりうまく仕上がったと思っています。大人の事情によりトップケージからの誘導枠がとても地味になってしまったインディーズ機能ですが、逆境にめげず今後とも模索を続けていこうと思います。

■ インディーズ機能への誘導リンク

indies_navi.png

まとめ

「かんたん友人検索」の特徴について説明しました。ユーザインターフェイスをシンプルにして、絞り込むことよりも並び替えをうまくすることで、目的のユーザを探しやすくしています。技術的には、レコメンドと検索の統合を試みたという意味で面白いものになっていると思います。

この機能、単純なようで、裏では結構な工夫を重ねて実現しています。分散処理によって検索や絞り込みを高速化するのはもちろん、検索結果のパーソナライズをオンデマンド(0.01秒程度のレイテンシ)で実現するための工夫も重要です。実装の詳細について書き始めるとものすごく長くなってしまいますので、それは次回の記事にとっておこうと思います。続きを読みたい方は、わっふ(ry

はじめまして。mixi開発部のskimuraです。
1月28日にリリースした「コミュニティブラウザ」について書きたいと思います。

■ コミュニティブラウザとは

存在するコミュニティが増加するほど、目的のコミュニティを捜し出すのは困難になると考えられます。mixiに存在するコミュニティは日々増加しており、今現在では180万以上ものコミュニティが存在します。そこで、興味があるコミュニティを探す手助けをするためのツールを作成したいと考え、本サービスを作成しました。コミュニティブラウザは各コミュニティ対して、関連性が高いコミュニティをおすすめするサービスです。それぞれのコミュニティに参加している各ユーザが参加しているコミュニティの傾向をもとに計算しています。

■ コミュニティブラウザの使い方

実際のサービスはこちらです。

  1. コミュニティブラウザにアクセスすると自分の所属しているコミュニティの一覧が表示されます
  2. オススメコミュニティが見たいコミュニティをクリックします
  3. クリックしたコミュニティに対して、関連性の高いオススメコミュニティが表示されます
  4. ★の数はオススメの度合いを示しています(10段階)

オススメコミュニティは最大20個まで表示されます。

■ キーワード検索との違い

キーワード検索のメリットとデメリット

コミュニティの場合、キーワードベースの検索では見つけるのが困難なものがあります。例えば、システムエンジニアであるユーザがシステムエンジニアにとって有用なコミュニティを探したい、と考えたとします。そこでmixiの「コミュニティ検索」で“システムエンジニア”を検索キーワードとして検索すると、“システムエンジニア”というキーワードを含むコミュニティが検索結果として大量に得られます。キーワード検索の特徴は、検索キーワードを含む検索結果を大量に得られるのと引き換えに、次の問題が存在します。

関係の無い結果も得られる

高速に膨大な検索結果を得られるのは、検索エンジンの良いところです。しかし、キーワード検索の場合、膨大な結果を得られますが、その中にはたまたまそのキーワードが使用されているだけで、そのキーワードとほとんど関係が無いものも一緒に得られます。したがって検索者はその膨大な検索結果から求めているコミュニティを探さなければならない、というコストが発生します。

キーワードの表記の揺れなどがあると検索結果として得られない

“システムエンジニア”に関するコミュニティの場合、“システムエンジニア”を“SE”や単に“エンジニア”と省略して表記している可能性があります。これは記述者としては“システムエンジニア”と同じ意味でこの言葉を使用していたとしても、検索エンジンにとっては両者の単語は別のものであると判断します。他には言い換えの問題があります。例えば“Mr.children”を“ミスチル”と表現しても両者は、同じバンドグループを意味しています。しかし、Mr.childrenに関する有用なコミュニティが存在しても、そのコミュニティで“Mr.children”を“ミスチル”とだけ表記してしまっていたら、“Mr.children”を検索キーワードとして検索したユーザには表示されません。

レコメンド型の検索

キーワード検索と方法はまったく別物なのですが、コミュニティブラウザではこれらの問題を軽減した形でコミュニティを探すことができます。コミュニティブラウザでは、個々のコミュニティに対して関連性が高いコミュニティが表示されるため、その関係性をたどっていき、目的としていたコミュニティにたどり着くことができます。たとえば“システムエンジニア”の例で、既にシステムエンジニアのコミュニティには所属しているが、さらにプログラム関係やデーターベースに関する特化されたコミュニティを探したいと考えたとき、その分野に詳しい人であれば、“システムエンジニア”に関するキーワードをすぐに思い浮かぶかもしれませんが、一般的には簡単には思い浮かびません。

そこで、「システムエンジニアの部屋」というコミュニティを対象にコミュニティブラウザを利用してみると以下のような結果が得られます。

se.png

「システムエンジニアの部屋」コミュニティには、「Java、C言語、PHP、Perl, Visual Basic」といったシステムエンジニアにとって必要なスキルに関するコミュニティや「ネットワークエンジニア、迷えるSEの卵たち」など直接的に関係するコミュニティなどが結果として得られます。そもそも「システムエンジニアの部屋」というコミュニティを探すのには、キーワード検索をしなくてはなりません。しかし、よりニッチでコアなコミュニティを求める場合には、これまでの説明をしたようにレコメンド型の形式の方が見付かりやすい場合が多くあります。

このようにコミュニティブラウザは検索のあり方の実験も兼ねて開発したサービスでもあります。

■ コミュニティブラウザの仕組み

コミュニティブラウザは次の仮説を前提に実装したものです。

あるコミュニティAに所属しているユーザ達が重複して参加しているコミュニティはコミュニティAに関連性が高い

mixi_blog_picture.png

図で示したように、Community Aに参加しているそれぞれのユーザが参加しているコミュニティをカウントすると、Community Cに最も多く参加していることがわかります。

基本的には、コミュニティブラウザはこの着想をもとに実装されています。だいたいのコミュニティに対してはこの実装のみでそれなりに関連性があるコミュニティを獲得できます。しかし、これだけの実装では次の問題が発生します。

オススメコミュニティのほとんどが参加数が多いコミュニティになってしまう

実際に図のようにコミュニティをカウントしていくと、たいていはあまり関係のないコミュニティが上位になってしまいます。そうするとどのコミュニティにも、単に参加数が多いコミュニティがオススメされてしまいます。そこで、なるべく関連性が高いコミュニティを得られるようにいくつかのパラメータを設定しています。つまり、コミュニティブラウザで示されている星印のポイントは、そのコミュニティに参加しているユーザが重複して入っている確率といくつかのパラメータから作成されています。

■ コミュニティブラウザの楽しみ方

最後にコミュニティブラウザの楽しみ方の例を示したいと思います。基本的には楽しみ方は自由で、興味にしたがってどんどん興味があるコミュニティをたどっていけば良いのですが、その中でもいくつかおもしろいオススメコミュニティが得られたものを紹介したいと思います。

地域コミュニティについて

地域といっても、地名や駅名など様々なものが存在するのですが、基本的にその地域特有のオススメコミュニティが得られます。例えば、株式会社ミクシィが所在している「原宿」コミュニティに対するオススメコミュニティは以下のようになっています。
harazyuku.png

上位は「表参道、神宮前、代官山、青山」と傾向が似た街のコミュニティが示されます。おそらく原宿に良く行く、もしくは好きな人は、これらの街にもよく行かれるのかもしれません。個人的にはおしゃれな街関連なのではないかなどと、予想をしたりしているのですが根拠になる分析はまだしていません。

似ている街以外にも原宿らしい「古着屋、カフェ」に関するコミュニティも得られています。その街の属性を表すコミュニティが得られました。これは、「六本木」や「恵比寿」と比べるとまた、全然違う傾向が表れておもしろいですね。

文学コミュニティについて

私は最近、ミステリー系作家である森博嗣さんの小説を好んで読んでいるのですが、そろそろ森さんの作品をすべて読み終えようとしています。そこで、森さんの小説に傾向が似ている作家を探すため、コミュニティブラウザを用いて、森さんのコミュニティのオススメコミュニティを見てみることにしました。オススメ結果を見ると、「京極夏彦さん、西尾維新さん、綾辻行人さん、宮部みゆきさん」といったミステリー系の作家のコミュニティを得ることができました。このように似ている作家を得るとき以外にも、似ている音楽、料理屋などを探すときにも、コミュニティブラウザの機能を応用することが可能であることが示唆されています。

mori.png

Bookmarklet of Community browser

コミュニティブラウザに簡単にアクセスするためのbookmarkletを作成しました。
以下のbookmarkletをブラウザのお気に入り追加して利用してください。

利用方法
  1. コミュニティブラウザのbookmarkletをブラウザのお気に入りに追加する
  2. mixiのコミュニティページ(http://mixi.jp/view_community.pl?id=xxxx)を表示している状態で設置したbookmarkletをクリックする
  3. 表示しているコミュニティに対してのコミュニティブラウザのページに遷移する

■ まとめ

コミュニティブラウザの使い方、簡単な仕組みについて説明しました。コミュニティブラウザを使うと、それぞれのコミュニティに対する関連コミュニティを取得できます。しかし、これまでの説明にもあったように、基本的にはコミュニティブラウザは各コミュニティに参加しているユーザの傾向を計算しているため、参加人数が少ないコミュニティや、逆にとても多いコミュニティでは関連するコミュニティを抽出するのが困難となります。パラメータ調整により、参加数が多いコミュニティに関しては、関連があるものが抽出できるようになりましたが、参加メンバーが少ないコミュニティに関してはまだまだいい結果が得られないため今後の課題にしたいと思っています。

今後もコミュニティブラウザのオススメコミュニティの抽出アルゴリズムに関しては検討していきたいと思います。
また、本機能を応用したサービスも展開していけたら、と思います。

こんにちは。夏休みが待ち遠しくって、夜なべしては旅行関係のサイトを巡っているmikioです。休みといえば、お出かけして美味しいランチ食べたり映画見たり、あるいは家で本読んだりゲームしたり音楽聞いたりしますよね。そんなあなたにお薦めしたいのがレビュー検索です。今回は、そこでのtipsや開発裏話などをお届けします。

mixiレビューとは、amazon.co.jpやぐるなびなどにある商品や店舗などについてユーザの皆さんがレビューを投稿できる機能です。気に入ったり気に入らなかったりする商品などについて一言言いたくなるのが人情というものですが、普通のmixi日記で言及するよりもレビューを書く方が後で読んだ時に有用です。レビュー機能の特徴は、1点から5点までの満足度をつけられることと、写真や説明などの関連情報が参照できることと、そして何より、他のユーザがその商品につけたレビューと比較できることです。

自分でレビューを書いて後で読み返したり友達に見てもらったりするのも楽しいですが、これから買おうとしている商品や行こうとしている店についての既存のレビューを見るのも楽しいです。そんな時にこそレビュー検索が役立ちます。

例えばソケットプログラミングに関する本を探すとしましょう。その場合、キーワードに「ソケット|socket」と入れて、カテゴリを「和書」にして検索します。検索キーワードを空白で区切るといわゆるAND検索になりますが、縦棒(|)で区切るとOR検索になるのがtipsですね。つまり「ソケット」か「socket」を含む和書を探しているというわけです。ちなみに、エクスクラメーションマーク(!)で区切るとNOT検索もできます。NOT検索はカタカナ語の絞りこみに便利で、「コーラ!コーラス!コーラン」などとして、「コーラ」は含むけどそれは「コーラス」や「コーラン」の一部としてではないといった指定ができます。

検索してヒット数が多かった場合は、並び替え機能を使うのが便利です。デフォルトは「登録日順」で、新しいものから表示されます。多くの人が言及しているものを見たい場合は「レビュー数順」にして、満足している割合が多いものを見たい場合は「満足度順」にするといいでしょう。

満足度順とは、対象商品について各レビューの満足度の平均の降順なわけですが、ここでちょっとした裏話があります。実は、キーワードを指定しないで「満足度順」の検索をした場合、完全な満足度順でない結果が表示されるのです。例えば全カテゴリの満足度順の結果は「スラムダンク」が1位なのですが、その満足度平均は5.0でなく4.95です。レビュー数1件でその1件が満足度5である商品はいくつもあるのに。

もちろんこれはわざとやっています。「みんなに良いと言われているものを知りたい」というのが目的なので、一人や二人が5をつけただけのものが上位に表示されてもピンときませんよね。そこでどうするかという議論を社内でしたわけですが、なかなかこれといった解法にたどり着かずに苦労しました。例えば「レビュー数が10以上のものに絞ってから満足度平均でソートする」という案の場合、全般的に精度は良さそうなのですが、レビュー数が比較的少ない新しいカテゴリの場合には対象がほとんどなくなって精度が下がるという欠点がありました。また、「レビュー数の三乗根と満足度平均の積でソートする」という私からの案は、同じく精度は良さそうなのですが、ヘルプ等で説明するときにわかりにくすぎるという欠点がありました。なるほど、実験での精度よりも説明性とか納得性というのが実サービスには重要なのです。

結局のところ、「レビュー数順で上位1000件に絞ってから満足度平均でソートする」という社長からの案に落ち着きました。これなら精度も高いしレビュー数に依存しないし説明性もそこそこだろうということです。ソート順ひとつとってもなかなか奥が深いですよね。インデクサの圧縮アルゴリズムとかばかり追求していては発想がトリッキーになりすぎていけないなと思った次第です。

最後に個人的にレビュー検索でよくつかう技を紹介します。「あー、なにか面白い映画でも見たいな−」と思った時には、レビュー検索でカテゴリを「劇場映画」にして、キーワードに「2007/6/|2007/7/」などと入れて検索してみてください。数字は現在の月と前の月を入力します。この例では、説明文に「2007/6/」または「2007/7/」を含むものが検索され、その部分が公開日の月となっている、今まさに公開されている映画の一覧を見ることができます。あとはレビュー数順や満足度順で並べ替えて、話題のものや評価が高いものから見る映画を決めればよいのです。mixiのレビューって、映画専門のサイトのレビューとはまた少し違う、個人的で率直な感想が読めるので興味深いですよね。