livedoorグルメのデータで機械学習してみる①

Mahoutを使って機械学習の勉強するにあたって適当な題材がないか探していたところ、livedoorグルメ(今はロケタッチグルメというサービスに変わっている様子)のデータが学術用に公開されていることを発見。

利用規約に「学術研究の目的に限ります」と書いてあるが、個人の勉強も「学術研究」の範囲内だろうということで使わせていただく。(少なくとも商用利用するわけではないし)

livedoor グルメの DataSet を公開

データを見てみると「口コミデータ」と「口コミへの投票データ」がトランザクションデータで、後はそれに関連するマスタのよう。「口コミへの投票」の意味がよく分からなかったが、実際のサイトを見てみるとその口コミに対して閲覧者が「参考になった」ボタンを押下したログだと思われる。livedoorグルメのAPIだと「口コミデータ」のレイアウトの中に「投票数」という項目があるので、恐らくこれの元ネタだろう。

さて、ではこのデータを使ってどんな機械学習をしてみようか…
いろいろ考えてみたが、そもそもデータマイニングに詳しくないのであまり思いつかない。ということで、ベタだがレコメンデーションでもやってみよう。

で、レコメンデーションといえば代表的なのが協調フィルタリング。簡単に言うと買物する商品が似ているAさんとBさんを探し、Aさんが買っていなくてBさんが買っているものをAさんにお勧めする、というようなもの。

今回は口コミデータを元に、評価が似ているAさんとBさんを探し、Aさんが評価していなくてBさんが高い評価をしている店をAさんにレコメンドする、ということを目標にしてみる。たった20万件しか口コミデータがなく、しかも全国に範囲が散らばっていて、そもそも似た傾向の人を探すこと自体が可能なのか疑問だが、とりあえずやってみよう。

Mahoutの協調フィルタリングについて調べてみると、「Item-Based Recommendations」というのが上記に該当するアルゴリズムのよう。Mahout公式サイトの以下のページの解説によると必要なデータは「ユーザーID,アイテムID,評価」という形式だとわかる。

Introduction to Item-Based Recommendations with Hadoop

livedoorグルメの口コミデータは以下のレイアウトなので、「user_id,restaurant_id,total」を抜き出せば良さそう。(本当は評価の細かい内訳を使った方が精度が高そうだが、Mahoutのアルゴリズムが複数の評価項目を受け取れなさそうなのと、データをざっと見た限り総合評価以外の点数がまともに入っていなさそうなのとで諦める)

  • id 口コミID
  • restaurant_id 対象お店ID
  • user_id ユーザID
  • total 総合評価(0-5)
  • food 料理評価(0-5)
  • service サービス評価(0-5)
  • atmosphere 雰囲気評価(0-5)
  • cost_performance コストパフォーマンス評価(0-5)
  • title 口コミコメントタイトル
  • body 口コミコメント
  • purpose 利用目的
  • created_on 投稿日時

ということで、Mahoutに読み込ませるためにデータの加工が必要になった。
20万件ならExcelでも何とかなりそうなレベルだが、せっかくなのでプログラムで処理する。Hadoopの勉強なのでMapReduceでやるか、あるいはHiveでお気軽にやるか、はたまたちょっと触ってみようかと思ってずっと放置しているPythonを試してみるか。

悩んだので今日はここまで。

コメント

コメントする