今回から、コンテンツベースのレコメンドのHadoopによる実装を紹介します。
おさらい:協調フィルタリング
第3回~第5回に紹介した協調フィルタリングでは、入力データに履歴、アイテム間の類似性を計算するためにコサイン関数を使いました。その結果、アイテムごとに類似性の高いアイテム、すなわち、各アイテムを評価(購入、ダウンロード、チェック、クリックなど)したユーザが他に評価したアイテム集合を見つけることができました。
このアイテム集合が、「このアイテムを評価している人はこのアイテムも評価しています」というタイプのレコメンドの基本情報で、アイテムベースのレコメンドになります。同じ履歴およびコサイン関数を使って、ユーザ間の類似性も計算できます。ここで前提としているのは、「ターゲットユーザ(レコメンドの対象ユーザ)と同じようなアイテムを評価するユーザは、ターゲットユーザと嗜好も似ている。したがって、評価が似たユーザ集合で気に入られたアイテムは、ターゲットユーザの嗜好にも合う。」というアイデアで、ターゲットユーザごとに類似ユーザの集合を見つけます。アイテムベースのレコメンドに対し、こちらはユーザベースのレコメンドと呼ばれます。
ユーザベースのレコメンドは、ターゲットユーザごとに類似ユーザ集合の中で人気の高いアイテムを推薦します。ここで推薦されるアイテムは、ターゲットユーザの嗜好に合っていることが期待できます。
コンテンツベースのレコメンド
コンテンツベースでは履歴に代わり、各アイテムのメタデータ等を入力データとして使い、アイテム間の類似性を計算します。たとえば、アイテムが映画であれば、メタデータとして映画の監督・脚本・プロデューサ・スタッフ・キャスト・あらすじなどがあります。
この場合、類似性の高い映画は、製作陣が被っている映画、あるいはあらすじが似ている映画になります。たとえば、前者であればシリーズ化された映画、後者であればリメークされた映画などが類似性の高い映画になります。メタデータとしてどのデータをどう使うかによりアイテム間の類似性が変わることに注意してください。
もちろん、コンテンツベースでもユーザ間の類似性を計算できます。その場合、データとしてユーザの年齢、性別、住所、職業、趣味といった属性やプロファイルなどを使います。ここで計算したユーザ間の類似性を使うと、各ターゲットユーザと似た属性やプロファイルを持つユーザ集合が気に入ったアイテムを抽出できます。
では、同じアイテムベースで、協調フィルタリングとコンテンツベースにはどんな違いがあるのでしょう?
アイテムが映画であれば、コンテンツベースではメタデータが類似している、つまり映画の中身が類似した映画が推薦される傾向がありますが、協調フィルタリングの場合、それぞれを評価したユーザ集合が類似している、つまり映画のカテゴリや内容が異なっていても、ユーザが共通して評価している映画が推薦される傾向があります。
たとえば、「シャーロックホームズ」に対しては、コンテンツベースであれば続編の「シャーロックホームズ シャドウ ゲーム」や主演のロバート・ダウニー・Jrのほかの主演作「アイアンマン」や「アベンジャーズ」、協調フィルタリングであれば、ほぼ同じ時期に公開された「Dr パルナサスの鏡」,
「インビクタス」や「かいじゅうたちのいるところ」を推薦します。
これらのレコメンド手法は長所や短所も違っています。協調フィルタリングでは、アイテムのメタデータに依存しないために、ユーザに対して意外性を与える推薦をできる長所がある一方で、履歴が無い、あるいは今まで誰にも評価されていないアイテム/評価したことの無い新規ユーザには推薦できないという短所があります。
一方、コンテンツベースでは、まだ評価されていないアイテムや履歴の無い新規ユーザにも推薦できる長所がある一方で、メタデータの量が十分に無い場合は推薦されるアイテムの質が安定しませんし、メタデータ自体が変化しない限り、推薦されるアイテムも変化しないという短所があります。
したがって、実際のサービスでは、レコメンドの目的や利用可能なデータに応じて、どちらかを選択あるいは併用します。
協調フィルタリングからコンテンツベースへ
協調フィルタリングとコンテンツベースの大きな違いは使うデータの違いにあります。両者ともアイテムあるいはユーザ間の類似性を計算するのは同じです。
ここで「使うデータが違うだけで、類似性の計算は一緒だから、プログラムは殆ど同じでは?」と思う読者の方もいると思います。まさにその通りです。Hadoopであれば、類似性を計算するまでの、どのデータからどれをkeyおよびvalueに設定するかの違いだけです。
次回は、前回までの協調フィルタリングで紹介した関数を元に、コンテンツベースのレコメンドの実装方法について紹介します。