Hadoopでレコメンドシステムを作ろう

第8回 コンテンツベースのレコメンドシステムのHadoop実装[後編]

この記事を読むのに必要な時間:およそ 4 分

自分で確認してみたい場合

前回紹介したMapReduceの第一段階のReducerの出力結果のデータ構造で

<key value>

<単語id 単語idを含むアイテムidのリスト>

でした。

コンテンツベースのレコメンドは,アイテム間の類似性をそれぞれの内容(アイテムのメタデータや概要など)の類似性に基づいて計算するために単語を使います。

一般に,ミススペルされた単語の出現頻度は他の単語に比べ非常に低く,それらを含むレビューおよび該当するアイテムは少ないと予想できます。また,冠詞などの単語はほとんど全てのレビューに出現するため,出現頻度は他の単語に比べて非常に高く,それらを含むレビューおよび該当するアイテムの数は非常に大きくなります。

したがって,単語ごとのレビューやアイテムのリストの長さを見て,以降の処理で利用する単語を選択することができます。

TF/IDF

TFはTerm Frequecny(単語の出現頻度)⁠IDFはInverse Document Frequency(逆文書頻度)で,これらは文書内の単語の重み付けの方法として,情報検索の分野等でよく使われます。これらの重み付けの定義は次の通りです。

図1 TF/IDFの定義

図1 TF/IDFの定義

TF/IDFを使うと,同一単語に対して,⁠文書内での出現頻度」「逆文書頻度」の二通りから重みを付けられます。

TFは局所的な重み付けで,文書内で出現頻度が高い単語に大きな値を与えます。一方,IDFは大局的な重み付けで,出現する文書が少ない単語に大きな値を与えます。同じ単語でも,TFの場合は文書ごとに値が異なるのに対し,IDFは文書集合全体で一定であることに注意してください。

各単語の重みはこれらTFとIDFの積で計算します。

以上の定義より,多くの文書に出現し,かつ各文書での出現頻度の低い単語の値は小さくなり,逆に少数の文書のみに出現し,かつその文書内での出現頻度の高い単語の値は大きくなります。

ここで簡単な例で重みの付け方を説明します。

  • ① 文書a,bから文書内に含まれた単語を要素とする文書ベクトルを作成する。
  • ② 文書ベクトルを表形式で表現する。
    セル内の数値は各文書で列に該当する単語が出現した回数になる。
  • ③ 文書ベクトルのTF値を表形式のデータから計算する。
    TF値なので表形式のデータをそのまま使う。
  • ④ 文書ベクトルのIDF値を表形式のデータから計算する。
    ここでは全文書の数を10としている。
    IDFの値は各文書での出現頻度に関係なく,同じ単語であれば全文書で共通であることに注意してください。
  • ⑤ 文書ベクトルのTF/IDF値をTF及びIDFのデータから計算する。
    各文書かつ各単語ごとに③と④で計算した値を使って積を求めます。

図2 文書からTF/IDFの計算までの処理フロー

図2 文書からTF/IDFの計算までの処理フロー

MapReduceを使ってTF/IDFを計算しよう

図2に示した流れに従い,アイテムごとのTF/IDFを計算します。ここでは文書(レビュー)をアイテムごとに集約しているので,次のような変換をします。

  • 単語→そのまま
  • 文書→アイテムごとの文書群

同一アイテムへの文書が複数ある場合,それをまとめて1つの文書にしています。

ここで知りたいのは「文書の近さ」で無く,⁠アイテムの近さ」なので,ここでは各文書で出現する単語の頻度を全て1とし,TF/IDFを次のように計算します。

図3 コンテンツベースで使うTF/IDFの定義

図3 コンテンツベースで使うTF/IDFの定義

もちろん,各文書で出現する単語の頻度をそのまま使う方法も可能です。先ほどの図2の結果を使いTF/IDFを計算すると,次のようになります。

図4 TF/IDFを使ったアイテム間の近さの計算

図4 TF/IDFを使ったアイテム間の近さの計算

これらの重みを計算するために,第7回で紹介したMapReduceを使い,MapReduceの変更箇所を考えます。

著者プロフィール

川前徳章(かわまえのりあき)

工学博士,NTTコムウェア 研究開発部 勤務。専門は情報検索,統計的機械学習,マーケティングサイエンス。現在はレコメンドシステムと感性検索の研究と開発に従事。

東京電機大学安田研究室 研究員

コメント

コメントの記入