mixi engineer blog

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

Mixi::Music->recommend_music();

ミクシィ開発部アプリ開発チームのk_joeです。今回は先日『極秘裏に』改善されたmixiミュージックのアルゴリズムについて紹介したいと思います。

このブログを読んでる方々はmixiミュージックって使ったことあるのでしょうか?僕は心配症なので使ったことない人のために(宣伝ついでに)軽く説明からさせていただきたいと思います。mixiミュージックは「音楽で人をつなぐ by mixiミュージック担当」を理念として、個人が聞いた音楽をベースにいろいろな繋がり・関連性を生み出そうというサービスです。自分の聞いてる音楽についての情報をみんなで共有できて、その繋がりから新しい音楽との出会いがあるってすばらしいことですよね。(/宣伝終)

mixiミュージックには自分の聞いている音楽からお勧めの音楽を提示するサービスとアーティストのリスナーがよく聴いている他のアーティストを提示するサービスがあります。ユーザが送信してくれるデータを計算して提示しているのですが、この計算アルゴリズムが6月の中旬にこっそりと交換されました。

交換をすることになった理由は、以前のシステムでは関連アーティストに誰でもよく聴くアーティストが入ってきやすいという問題点があったためです。ハードロック嗜好の人でも売れているJ-POPは良く一緒に聴いたりするため、広くみんなに聴かれる曲はどのアーティストの関連アーティストにも上がってきやすいという傾向がありました。ユーザからの情報を使ってユーザに新たな情報を還元するのがmixiです。そこで、ユーザが求めている情報はなんだろうかということを考えた結果、今回のアルゴリズムの目標は「新しい音楽との出会い」に設定しました。

レコメンドするアーティストの選出方法として、ジャンル情報を使う方法がすぐに思いつくのですが、mixiミュージックで使用している曲情報は全てユーザから送られてくる情報を使用しているため、精度の問題から今回は断念しました。そこで今回は、DBにあるアーティストのリスナーリストを利用する方向で作成を始めました。

まず、解析するデータを集めなくてはいけないのですが、どうしても全てのユーザの情報を使用するとノイズが多くなってしまいます。そこで、mixiミュージックのDBで保持している各アーティストのトップリスナーから情報を参考にすることにしました。トップリスナーとはそのアーティストを聴く回数が多いユーザなので、その音楽に似た曲調の音楽を好む傾向が高いのではという推測からです。さらに、そのトップリスナーが他に聴いているアーティストでも上位25名だけを選出しました。これもできる限りデータのノイズを減らすためです。この方法でアーティストAとの関係を計算する対象のアーティスト群を選出しました。

次にこの対象のアーティスト群との関連度を計算していくのですが、ここでは共起率を計算することにしました。アーティストAとアーティストBを共に聴いている総リスナー数をどちらか一方でも聴いたことがあるリスナー数で割る計算です。ただ、この計算だけではやはりよく聴かれるアーティストが関連度に残ってしまいました。そのため、アーティストAの関連度を計算する場合、アーティストAのリスナー数とアーティストBのリスナー数に重み定数を掛けたものを加算したものを分母に使用することにしました。この結果、総リスナー数の多いアーティストは関連度が下がるという仕組みです。

recoment_music_000.gif

アルゴリズム決定以降も計算量や負荷についてのたくさんのお叱りを受けながら、ようやく改善することができました。結果はそれなりの精度が出てきていると思います。ぜひ、自分の好きなアーティストからたどったらどんなアーティストに行き着くのか試してみてください。

僕も月に2〜3枚と決めてmixiミュージックのレコメンド機能を使って新しいアーティストを探して購入しています。数ヶ月後の自分のミュージックライブラリがどうなるのか少し楽しみです。