MapReduceは「WWWの索引付け」(単語/出現ページ(URL)) → 「索引 URL」から始まりましたが、このフレームワークは他のデータやシーンでも利用できます。

代表的なソーシャルメディアであるTwitterのデータからユーザ間の関係でなく、各ユーザ(フォロワー)がフォローしそうなユーザの予測(ユーザ推薦)も可能です。

Twitterは「ツイート」と呼ばれるテキストを投稿し、ユーザ間で公開及び共有するサービスです。ブログとの違いは、文字数に制限があるものの、タイムラインやフォローの仕組みがあり、リアルタイムや双方向性のコミュニケーションが強化されている点にあります。このユーザ推薦のためにはユーザ間の関係を類似性に基づき定量化する必要があり、その類似性の定義は次のような方法があります。

ユーザ同士でフォローするユーザ数に着目する方法

図3-1:ユーザ同士でフォローするユーザ数に着目する方法

このアプローチは各ユーザがフォローしそうなユーザを予測するために、ユーザ間の類似性をフォローするユーザ数で定義します。ユーザBはユーザAと同じユーザをフォローしているので、ユーザBがフォローしていてユーザAはフォローしていないユーザは他のユーザ(ユーザCがフォローするユーザ)よりも、今後、ユーザAからフォローされ易いと期待できます。両ユーザが共通にフォローするユーザ数が多ければ、フォローされる確率も高くなると考えられます。

フォローしているユーザ数に着目する方法

図3-2:フォローしているユーザ数に着目する方法

図3-2:フォローしているユーザ数に着目する方法このアプローチは各ユーザがフォローしそうなユーザを予測するために、各ユーザをフォローしているユーザ数で定義します。ユーザ集合Bがフォローするユーザはユーザ集合Aのそれよりも多くのユーザにフォローされているので、ユーザ集合Bがフォローするユーザは他のユーザ(ユーザCがフォローするユーザ)よりも、今後、ユーザAからフォローされ易いと期待でき、その集合の大きさに比例し、フォローされる確率も高くなると考えられます。この処理に必要なデータはTwitterが公開しているAPIを通して入手できます。これらのデータはJSON形式で出力されるので、長期間に渡って収集する場合、時々JSON形式が変更になるのでMapperの中で変更の違いを吸収する工夫が必要です。

次に、HDFS及びMapReduceを使い処理の手順を考えます。ここでは、図3-2で示したアプローチを、2段階に分け実行します。

図3-3:フォローしているユーザリストの作成

収集したデータからユーザ毎に各ユーザがフォローしているユーザのリストを作っています。

HDFS内にはTwitterから収集したデータが入っています。このデータの各行は各ツイートのID、ユーザのID、ツイート本文、フォローしたユーザのID(各ユーザのフォロワーのツイートあるいはリプライの場合)、ハッシュタグ、タイムスタンプなどで構成されています。

図3-3は、収集したデータから各ユーザがフォローしているユーザリストを作成する処理手順を示しています。この処理において、Mapperは、これらのデータからユーザのID(UID)、 フォローしたユーザのID(TID、取得できた場合のみ)を抽出し、UIDをkey、TIDをvalueとするペアを出力します。これらのペアをShuffleではkeyによりソートし、同一keyを持つペアは同一Reducerに送られます。Reducerはkey毎にユニーク、つまり、TIDの重複がない、valueのリストを作成します。このリストは各ユーザがリプライあるいはフォローしているユーザのリストになります。

図3-4:ID対毎の合計値の算出

図3-4は、図3-3で作成したユーザリストからID毎の合計値を算出する処理手順を示しています。まず、HDFS内には先ほどの処理で生成したデータが入っており、各行が各ユーザ(UID)のリプライあるいはフォローしているユーザ(TID)のリストに対応します。次にMapperは、これらのデータからUID毎にリスト内のTIDのペアを生成します。

例えば、リストが太郎、次郎、三郎とあれば、太郎:次郎、次郎:太郎、太郎:三郎、三郎:太郎、次郎:三郎、三郎:次郎と6通りのTID対を生成します。

その後、TID対をkey、UIDをvalueとするペアを出力します。ここでもShuffleではkeyによりソートし、同一TID対を持つペアは同一Reducerに送られます。Reducerはkey毎にユニークなUIDをカウントし、TID対毎の合計値を出力します。

このTID対の合計値は、これらTIDに相当するユーザを両方ツイートあるいはリプライしたユーザの数なので、この数が大きいほど、各ユーザがフォローしそうなユーザを既にフォローしているユーザを見つけやすくなります。

さらに拡張として

・ツイートの内容毎に、影響力のあるユーザの特定
・ツイートの内容毎に、興味を持ちそうなユーザの特定

する方法があります。 

このフレームワークはTwitterでのユーザ推薦だけでなく、他のソーシャルメディアのデータでも同じ事ができます。また、履歴をデータとして使うと「アイテム推薦」にも使えます。その場合は、フォローしたユーザを購入アイテム、フォローしそうなユーザを購入しそうなアイテムと置き換え、ユーザ推薦からアイテム推薦の問題に帰着できます。

さらに、ユーザのプロファイル等を使えば、特定の商品あるいは話題に興味を持つユーザの特徴抽出を行う、顧客分析も可能です。 

川前徳章(かわまえ のりあき)
工学博士、NTTコムウェア 研究開発部 勤務。専門は情報検索、統計的機械学習、マーケティングサイエンス。現在は感性検索とコンテンツジェネレータの研究と開発に従事。東京電機大学 安田研究室協力研究員。
関連記事:Hadoopでレコメンドシステムを作ろう