皆さん、先月の半ば頃からmixiのトップページの3列目に「日記キーワードランキング」というコーナーが登場していたのをご存じでしょうか。手前味噌ながら、これはとても面白い機能で、毎日ランキングが更新される度に素敵なランキングが作られていて悦に入っているmikioです。今回は日記キーワードランキングの秘密についてお話します。
日記キーワードランキングとは、日記に書かれた言葉の使用頻度を統計的に処理して、今話題になっている度合を算出し、その上位をランキング形式で表示する機能です。トップページには5位までが表示されるので、それをチェックするだけで最新の流行を把握することができます。さらに「30位までを読む」に進むと30位までのキーワードとその関連日記が表示されます。詳細を知りたい場合はキーワードをクリックすると、そのキーワードで日記検索をした結果を見ることができます。一通り見るのに10分くらいでしょうか。ここまでチェックしておけば、昼休み、放課後、アフターファイブなどの雑談で話題をリードできること間違いなしです。また、このページでは「日記を書く」ボタンを押すことで関連する日記を自ら書くこともできるので、日記のネタを探している方々にもぜひオススメしたい機能なわけです。

さてさて、ランキング生成のアルゴリズムを簡単に解説してみます。理想的にはトレンドウォッチャーのような人に日記を読んでもらってからキーワードランキングを手動で作ってもらうのがよいのですが、1日に100万件近く書かれる日記を全部読むのは不可能ですし、サンプル調査にしても十分なサンプル数をこなすには手間と時間がかかりすぎます。もしかしたら人間の主観による偏りの問題が表面化するかもしれません。
ということで、ランキングの生成はコンピュータが自動的に行うようにしたわけですが、人間の言葉を理解するわけではないコンピュータにキーワードを判別させるのは非常に大変なのです。しかもmixi内の話題を把握してその適合度でランキングを作るなんて、計算機ワザではありません。最初は途方にくれていましたが、設計・実装・実験・評価を繰り返すうちに、いろんな発見があり、失敗とそれを乗り越える工夫を重ね、どんどん精度がよくなってきて、今に至ります。
ランキングを生成する際の基本的な考え方は、以下のものです。ここで言う頻度とは、その言葉が何回使われたかということです。また、一般語とは、「今日」「笑」「気持ち」のような、頻度が常に高い語のことです。
- 日記の本文を自然言語処理(形態素解析)して名詞のみを抽出する。
- 特定の名詞が頻繁に連続する場合、それを複合名詞として合体させる。
- 頻度が高い語を選ぶ。
- そうすると一般語ばかり選ばれてしまうので、対象日以外の日の頻度に応じてペナルティをかける。
- そうすると顔文字や絵文字などの無意味な語が多く選ばれるので、字種や長さに応じてペナルティをかける。
- 表記揺れで集計がぶれることがあるので、似たような文字列は頻度を合算する。
ここまではキーワードランキングの企画段階ですでに思いついていたのですが、実際に集計してみると、特定の話題の語だけが上位を独占してしまって、「世の中のメジャーな話題を網羅する」という当初の企図が達成できないという壁にあたりました。そこで、同じ話題に属する語は相互にペナルティをかけることにしました。
ここで「話題」という概念が出てきますが、何をもって話題を構成する塊(クラスタ)を作るかが問題となります。そこで、機械的に言葉や文書やいろいろなものを分類する「クラスタリング」という技術を使うことになります。具体的な手法の説明は複雑になりすぎるので割愛しますが、共起関係(ある語と別の語が同じ文または文章で表れたという事実)に着目した様々な技法を組み合わせるのが一般的なようです。
以上のことを実現するべく、処理の流れは以下のように設計されました。簡単にいえば、定期的に起動する頻度集計プログラムが、該当の期間の日記を読んでキーワードの頻度データベースを作っておき、いざランキングを更新するという時に起動されるランキング生成プログラムが、対象日の頻度データベースとそれ以外の日の頻度データベースの頻度を比較してランキングを作るということです。

「30位までを見る」のページで上位3位までキーワードに付随して表示される「関連日記」の算出を行うのもランキング生成プログラムの役目です。考え方は上述のクラスタリングと似ていて、そのキーワードが属する話題に属する日記を探すことになります。
アルゴリズムの解説はここまでにしますが、おそらくこの分野の研究者の方にとってはかなり標準的な技法しか使っていないという印象を持たれることかと思います。実際そんなに奇抜なことはしていません。それでもとても精度が高いランキングを生成できているという自負があるのですが、その原因の第一はおそらくmixiの日記という良質なコーパス(自然言語処理の対象データ)が利用できることにあると思います。一般的なWebサイトではそもそも日付などの時間情報を用いたランキングを作ることは困難ですし、ブログをクロールする戦略ではノイズが多すぎて、信頼できる記事を一日に数10万件も集めるのは難しいでしょう。
そうです。現状では自分とマイミクの日記しか読まないというmixiユーザーもいると思いますが、mixiの中には、さまざまな興味深いコンテンツがあるのです。検索やデータマイニングの技術をうまく組み合わせれば、ユーザの方々にとって面白いと思ってもらえる情報をmixi内から探しだして提示できるようになります。これは大変な仕事ですが、Webサーチエンジンの手が届かない領域に眠る千思万考に光をあてるのは社会的価値のあることですし、そうしていくことがこれほどのコンテンツを預る運営会社としての責務であると私は思います。そのような深遠な目標の中では日記キーワードランキングはほんの第一歩にすぎませんが、今後も研究を続けて、より付加価値の高いサービスをお届けしていければ幸甚です。
ミクシィ開発部で研究開発をしているtmaesakaです。さて、mixi開発部といえばODF、だけど実際に何をしているの?と思われる方も多数いらっしゃると思います。
mixi開発部のODFでは一週間に一日、自然言語処理、空間データ構造、データマイニング、Telecommunication、グラフィックス系アルゴリズム、人工知能、ネットワークデザイン等の様々な技術が研究されています。今回はその中でも私がこの2ヶ月ODFで携わってきたAdobe社のAIR(旧Apollo)に関して書こうと思います。
Adobe® AIR™とはAdobe社が開発したクロスOSランタイム環境の事です。AIRの面白いところはGUI開発の専門知識を必要とせず、ウェブで使われているFlash、Flex、HTML、Ajax等の技術でデスクトップアプリケーションの開発が実現されるという事です。つまり単純な物であればHTMLだけでデスクトップアプリケーションが作れてしまうのです!
私が始めてAIRの存在を知ったのは3月。リリース当時は新鮮な刺激を受け、頭の奥底で妄想していたコンセプトが実現したと感激した事を覚えています。これをODFのネタにしたら面白いかも?という単純な遊び感覚で私のODFプロジェクトが始まりました。
プロジェクトが始まった当初のlearning curveは今までActionScript 3を触った事がない(コンパイルの仕方すら知らない)という現実にも関わらず言語syntaxがJavaに似ている理由で緩やかなものでした。しかも解り易い言語リファレンスが存在するため、コーディングがかなり楽だと個人的に感じました。
先日はAIRがローカルのファイルシステムを読み書きできるという利点(?)を活かし音楽プレーヤーとスペクトラムアナライザーを書いてみました。しかしこれだけでは面白くないため、地味ではありますがリモートサーバーから音声データをストリームするなどの機能も実装してみました。意外と簡単に出来てしまってあっけなかったですが、笑。
近い未来にLinuxが対応されるとの事ですので待ち遠しい!、、と思う今日この頃です。
主にmixiのバックエンドを専門とする研究開発グループに所属する私ですが、こういったエンドユーザーと直接的に身近なレベルの技術の勉強を業務として行えるのでODFは楽しくてたまりません。
さて次は何をしよう?
こんにちは。mixiエンジニアブログのアイディアを出したmikioです。日本最大のユーザ数(2007年5月20日時点で1000万人)、膨大なデータ量とトラフィック(日記だけで4億件以上)、多岐にわたるサービスと機能を誇るmixiですが、その技術情報を世の皆様にお伝えする機会が今までなかなかありませんでした。また、社内にはどんなスタッフがいて、どんな風にmixiを作ったり運用したりしているのかということに興味を持ってくれている方も多いと思います。そこで、mixiエンジニアブログです。開発チームの面々が持っているノウハウやサービスに対する思いをこれからツラツラと書き連ねていきます。
ところで、このサイトのドメイン名が「alpha.mixi.co.jp」になっているのにお気づきでしょうか。そういうわけで、alphaなことを語るのがこのブログの趣旨です。「mixiのロゴに未だに “β version” と書いてあるのは何で?」というFAQがありますが、stableであるよりもdevelopingであることを重視している姿勢の表明であると個人的には思っています。そこで、 alpha.mixi.co.jp です。「サイトがbetaだからメイキングはalpha」という安直な理由も見え隠れするところですが、開発部の会議で投票の結果として決まった次第です。玉石混淆の内容になると思いますが、お付き合いいただけると嬉しいです。
僭越ながら、軽く開発チームのグループ紹介をしてみます。開発チームは「アプリケーション開発グループ」「システム運用グループ」「Webデザイングループ」「研究開発グループ」「Find Job開発グループ」の5つのグループから構成されます。
アプリケーション開発グループは、mixiの様々なサービスやその個々の機能を担うプログラムを開発する人たちです。主にPerlプログラマが多く、Perlの作法やライブラリやフレームワークなどの話が得意なようです。もちろんHTMLやJavaScriptやFlashなどの様々なWeb関連技術も押さえていますので、そういった話も出てくるかもしれません。新しいサービスや機能が登場した際には、それらを開発した際のヨモヤマ話や楽しい使いかたなどについても語ってくれるでしょう。
システム運用グループは、mixiを支えるインフラの部分を構築し運用する人たちです。1000台以上のサーバをデータセンタに設置し、ネットワークの設計と構築を行い、OSやデータベースサーバやWebサーバを設定し、各種のサービスが適切に動作し続けるように管理しています。mixiのデータ量とトラフィック量を捌くハードウェアやソフトウェアに関する高度なノウハウについて語ってくれるでしょう。
Webデザイングループは、mixiの様々なサービスの画面デザインをする人たちです。Webマガジン「mikly」や各種のPR企画のデザインも担当しています。アイコン、ロゴ、バナーなどに使う画像を描いたり、HTMLやCSSを駆使してページレイアウトを作りこんだりしています。mixiらしさをアピールするとともに、可愛く使いやすく、老若男女に親しんでもらえるデザインとはどういうものか語ってくれるでしょう。
研究開発グループは、mixiで将来的に使われるだろう技術のタネを研究し開発する人たちです。より多くのデータをより高速に扱えるデータベースの仕組みを考えたり、自然言語処理や統計などの技術を駆使して検索機能やデータマイニングの精度を向上させる仕組みを考えたり、様々なサービスを拡張していくためのAPIを設計したりしています。各種のアルゴリズムや実装をmixiのサービスやコンテンツに適用する際のノウハウについて語ってくれるでしょう。
Find Job !開発グループは、IT系求人サイトFind Job !のシステムを開発するグループです。マップと連携したFind Job ! MapsやAjaxによる検索機能をはじめ、Web APIなどの先進技術を積極的に採り入れたシステム開発を行っています。個々の求人情報の魅力をいかに伝えるか、そして多様なユーザのニーズをとらえて目的の求人情報をいかに探しやすくするかなど、B2CとB2Bの両側面を持ったサイトならではのノウハウと醍醐味について語ってくれるでしょう。
ということで、ネタには困らないだろうと思って始めたエンジニアブログですが、みんな何気に忙しいからブログ書いてる暇なんてないんじゃないかとちょっと心配している今日この頃です。ブログを続けるコツは気楽にやることなので、更新頻度の目標とかは特に設定しません。書きたいことがある人が書きたい時に適当に書くというユルいスタンスで行ければなと思います。
初エントリーを任された開発部のマネージメントをしているnealです。簡単ですが、mixi開発部についてご紹介させていただきます。
開発部のスタッフは自ら自社サービスを使い楽しむと同時に、このサイトを作り上げて行く事も楽しむ、これが我々の求める開発部です。このブログはこの楽しさをmixiに興味を持っていただける方々と共有できる場となる事を願っています。
楽しい仕事とは言え、1,000万人のユーザ数を超えるサイトの構築や運用は決して楽な仕事ではありません。日々の業務をこなして行く中、サイトを作る側として苦労した点、失敗談、新しい技術への挑戦など、この場を利用して掲載して行きます。
詳細は後述しますが、開発部では One Day Free (ODF) という制度があり、この中から生まれた成果物もブログを通し徐々に一般公開ができるよう整備する予定です。詳細は後ほど!
Hope y’all enjoy it!