このエントリーをはてなブックマークに追加

レコメンドしたい!

最近「サイト上でレコメンドしたい」という要望を多くいただくようになりました。

これまでサイト上のレコメンドはそのサイト毎に開発をしていました。例えばwriteWiredで比較的事例が多い旅行会社のサイトの場合は商品情報であるツアー情報は基幹システムから連動して表示するので、「今見ているツアーと同じ国、都市、泊数で少し値段が高いもの」などです。

こういったおすすめの仕方はわかりやすいのですが、サイト、商品ごとに最適化が必要なので、パッケージの機能としては組込みにくく、かつ新規に開発した方がよりよいレコメンドをすることができるのではないかと思います。

一方で、商品を販売しない一般的なサイトの場合、通常はある程度の分類(カテゴリーやタグなど)をすると思いますが、分類づけをする作業そのものが大変だったり、あるいは同じカテゴリのコンテンツの中でさらにおすすめしたい、というものでwriteWiredは好きなように開発が出来ますが「じゃぁどんなレコメンドがいいですか?」とお聞きすると「なんでもいいからレコメンドしたい」という要望です。

確かに今ではコンテンツマーケティングが普通になり、どのサイトでもとにかくコンテンツを増やそう、せっかく作ったコンテンツをより多くの人に見て、自社サイトで楽しんでもらいたい、と思うのは当然ですね。

弊社でもマーケティングブログをやっていて、記事も結構な量になってきたのでサイトに来ていただく方に喜んでもらいたいのでレコメンドの勉強と開発に着手しました。

「この記事を読んでいる人はこの記事も読んでいます」を作ろう

まずは手始めによく見かける「この記事を読んでいる人はこの記事も読んでいます」の実装です。これはとてもシンプルで、アクセスログを元に、コンテンツを読んだ人が見た、他のコンテンツに対して人数を集計して、それをおすすめに使うというものです。

下のようなアクセスログがあったとします。

コンテンツA 田中さん、山田さん、佐藤さん
コンテンツB 田中さん、山田さん、
コンテンツC 佐藤さん
コンテンツD 鈴木さん
上記のようなアクセスログがある場合、下のようにデータが集計され「この記事を読んでいる人~」に利用することができます。

コンテンツA
    Bは2人、Cは1人、Dは0人
コンテンツB
    Aは3人、Cは1人、Dは0人
コンテンツC
    Aは3人、Bは0人、Dは0人
コンテンツD
    Aは0人、Bは0人、Cは0人

これは弊社マーケブログで利用しています。それなりに分散して表示されるのでユーザーの方はある程度楽しんでもらえるのではないかと思います。また、このデータを使って表示するテンプレートjspでディレクトリやテンプレート種類を柔軟に組み込む事ができるのでとても汎用的になりました。たったこれだけのことですが、人気の記事、最近の投稿、カテゴリ別などとは違った見せ方ができます。

「あなたにおすすめの記事」を作ろう
機械学習ライブラリ Apache Mahout を使った協調フィルタリング

さて、まずは簡単な集計バッチを作ることで「この記事を読んでいる人~」は実現することが出来ました。次は「あなたにおすすめ」するレコメンドです。

レコメンドには色々種類がありますが、それらの説明は良い記事が世の中に沢山あるので、ここでは割愛します。
その中で「協調フィルタリング」と呼ばれるもので、多くのユーザの嗜好情報を蓄積し、あるユーザと嗜好の類似した他のユーザの情報を用いて自動的に推論を行う方法論でAmazon.comの「おすすめの商品」などに利用されています。

writeWiredはJavaで開発されているので相性を考えJavaで実装されている協調フィルタリングのレコメンドエンジンを調べたところ、Apache Mahoutというライブラリにしました。MahoutとはApache Software Foundationが公開しているオープンソースの機械学習ライブラリで、大きく分けて3つの機械学習分野(1)「レコメンデーション」、(2)「クラスタリング」(3)「分類」を中心に実装されています。

他にも今話題のApache Spark上で実装されたMLlibという機械学習のライブラリなど気になりますが、MLlibはSparkが無いと動かないようで、MahoutはHadoopとセットで紹介されていることが多いのですが、レコメンドの機能であればHadoopなしでも動かす事が出来ます。
※本音ではSpark+MLlibの出現によりMahoutは若干おわコンがありますが・・・いずれレコメンドエンジン部分だけSpark+MLlibに置き換えるかも知れません。

インフラを増やす事は避けたかったので単体で稼働するMahoutを選択しましたが、汎用に作られているMahoutを自社パッケージに組み込むにあたっては以下のような課題がありました。
 
  • Hadoopは使いたくない
    インストールや設定、レコメンドの元になるデータをいちいちHDFSに出力してバッチ流してまた取り込む、といった処理はやりたくない。
     
  • 当面はインメモリ型レコメンド
    Mahoutはレコメンドをメモリの中で行うか、Hadoopを使ってHDFSに全員分の全レコメンドを出力する方式があるが、当面はインメモリで実装。
    メモリを確保したいので、writeWiredとは別に専用のWebアプリ上で稼働させる。
    (ただし量が増えた時用に全レコメンドをバッチに出力する処理も実装、Hadoopを使わないJavaの並列マルチスレッドでレコメンドをDBに出力)
     
  • 学習データはファイルではなく極力データベースで完結させたい。
    writeWiredのアクセスログはデータベースの中にあるので、レコメンドをする度にファイルに出力、ということはやりたくない。
    Mahoutはデータベースから読み込める機能がデフォルトにあるが、ログテーブルすべてを対象にする。
    writeWiredは複数サイト管理できるのでレコメンド生成単位で関連するログを対象に学習させたい。
     
  • 学習はさせるが「レコメンドさせたくない」コンテンツがある
    トップページや、記事一覧などのインデックス系はレコメンドの学習には使いたいがレコメンドはさせたくない。
次回以降で、これらの課題を解決した例をご紹介したいと思います。

協調フィルタリングとは  (Wikipediaより引用)

協調フィルタリング(きょうちょうフィルタリング、Collaborative Filtering、CF)は、多くのユーザの嗜好情報を蓄積し、あるユーザと嗜好の類似した他のユーザの情報を用いて自動的に推論を行う方法論である。趣味の似た人からの意見を参考にするという口コミの原理に例えられることが多い。

例えば、ユーザAがアイテムXを好むとすると、アイテムXを好む別のユーザBが好むアイテムYを探し出し、ユーザAもアイテムYを好むのではないか、という推論をコンピュータによって自動的に行う。実装にはユーザ同士の類似度を、同じアイテムにつけた評価の相関係数などによって表して類推に利用することが多い。

協調フィルタリングはリコメンデーション(推薦)やパーソナライゼーションに利用されている。実際にAmazon.comの「おすすめの商品」や、はてなアンテナの「おとなりアンテナ」などに応用されており、Web 2.0においてロングテールを支える要素技術として捉えることができる。

このコンテンツは参考になりましたか?

送信する

デジタルマーケティングに対する
実体調査アンケート実施中

是非、アンケートにぜひご協力ください。

デジタルマーケティングに対する
実体調査アンケート実施中

是非、アンケートにぜひご協力ください。

 アンケートに回答する  ≫

無料eBookのダウンロード

【今からでも遅くない!】
初心者に贈る「インバウンドマーケティング」の始め方

 無料ダウンロードはこちら  ≫

人気の記事

タグ別