mixi engineer blog

*** 引っ越しました。最新の情報はこちら → https://medium.com/mixi-developers *** ミクシィ・グループで、実際に開発に携わっているエンジニア達が執筆している公式ブログです。様々なサービスの開発や運用を行っていく際に得た技術情報から採用情報まで、有益な情報を幅広く取り扱っています。

mixi日記キーワードランキングの秘密

皆さん、先月の半ば頃からmixiのトップページの3列目に「日記キーワードランキング」というコーナーが登場していたのをご存じでしょうか。手前味噌ながら、これはとても面白い機能で、毎日ランキングが更新される度に素敵なランキングが作られていて悦に入っているmikioです。今回は日記キーワードランキングの秘密についてお話します。

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

kwr-screen.png

さてさて、ランキング生成のアルゴリズムを簡単に解説してみます。理想的にはトレンドウォッチャーのような人に日記を読んでもらってからキーワードランキングを手動で作ってもらうのがよいのですが、1日に100万件近く書かれる日記を全部読むのは不可能ですし、サンプル調査にしても十分なサンプル数をこなすには手間と時間がかかりすぎます。もしかしたら人間の主観による偏りの問題が表面化するかもしれません。

ということで、ランキングの生成はコンピュータが自動的に行うようにしたわけですが、人間の言葉を理解するわけではないコンピュータにキーワードを判別させるのは非常に大変なのです。しかもmixi内の話題を把握してその適合度でランキングを作るなんて、計算機ワザではありません。最初は途方にくれていましたが、設計・実装・実験・評価を繰り返すうちに、いろんな発見があり、失敗とそれを乗り越える工夫を重ね、どんどん精度がよくなってきて、今に至ります。

ランキングを生成する際の基本的な考え方は、以下のものです。ここで言う頻度とは、その言葉が何回使われたかということです。また、一般語とは、「今日」「笑」「気持ち」のような、頻度が常に高い語のことです。
  • 日記の本文を自然言語処理(形態素解析)して名詞のみを抽出する。
  • 特定の名詞が頻繁に連続する場合、それを複合名詞として合体させる。
  • 頻度が高い語を選ぶ。
  • そうすると一般語ばかり選ばれてしまうので、対象日以外の日の頻度に応じてペナルティをかける。
  • そうすると顔文字や絵文字などの無意味な語が多く選ばれるので、字種や長さに応じてペナルティをかける。
  • 表記揺れで集計がぶれることがあるので、似たような文字列は頻度を合算する。
ここまではキーワードランキングの企画段階ですでに思いついていたのですが、実際に集計してみると、特定の話題の語だけが上位を独占してしまって、「世の中のメジャーな話題を網羅する」という当初の企図が達成できないという壁にあたりました。そこで、同じ話題に属する語は相互にペナルティをかけることにしました。

ここで「話題」という概念が出てきますが、何をもって話題を構成する塊(クラスタ)を作るかが問題となります。そこで、機械的に言葉や文書やいろいろなものを分類する「クラスタリング」という技術を使うことになります。具体的な手法の説明は複雑になりすぎるので割愛しますが、共起関係(ある語と別の語が同じ文または文章で表れたという事実)に着目した様々な技法を組み合わせるのが一般的なようです。

以上のことを実現するべく、処理の流れは以下のように設計されました。簡単にいえば、定期的に起動する頻度集計プログラムが、該当の期間の日記を読んでキーワードの頻度データベースを作っておき、いざランキングを更新するという時に起動されるランキング生成プログラムが、対象日の頻度データベースとそれ以外の日の頻度データベースの頻度を比較してランキングを作るということです。

kwr-flow.png

「30位までを見る」のページで上位3位までキーワードに付随して表示される「関連日記」の算出を行うのもランキング生成プログラムの役目です。考え方は上述のクラスタリングと似ていて、そのキーワードが属する話題に属する日記を探すことになります。

アルゴリズムの解説はここまでにしますが、おそらくこの分野の研究者の方にとってはかなり標準的な技法しか使っていないという印象を持たれることかと思います。実際そんなに奇抜なことはしていません。それでもとても精度が高いランキングを生成できているという自負があるのですが、その原因の第一はおそらくmixiの日記という良質なコーパス(自然言語処理の対象データ)が利用できることにあると思います。一般的なWebサイトではそもそも日付などの時間情報を用いたランキングを作ることは困難ですし、ブログをクロールする戦略ではノイズが多すぎて、信頼できる記事を一日に数10万件も集めるのは難しいでしょう。

そうです。現状では自分とマイミクの日記しか読まないというmixiユーザーもいると思いますが、mixiの中には、さまざまな興味深いコンテンツがあるのです。検索やデータマイニングの技術をうまく組み合わせれば、ユーザの方々にとって面白いと思ってもらえる情報をmixi内から探しだして提示できるようになります。これは大変な仕事ですが、Webサーチエンジンの手が届かない領域に眠る千思万考に光をあてるのは社会的価値のあることですし、そうしていくことがこれほどのコンテンツを預る運営会社としての責務であると私は思います。そのような深遠な目標の中では日記キーワードランキングはほんの第一歩にすぎませんが、今後も研究を続けて、より付加価値の高いサービスをお届けしていければ幸甚です。