レコメンド(推薦)機能をRubyで実装したいです。教えてください。


人をフォローするシステムがあって、ユーザーの嗜好にあった人をリコメンドする処理を実装したいです。

あるユーザー(Aさん)と同じような人をフォローしている人がいて(Bさん)、Bさんがフォローしているけど、Aさんがフォローしていない人を提案する。 という処理がすぐ思いつきます。

私が欲しい情報は、Rubyで上記を実装するための、ズバリのコード(ライブラリ)があればベストです。

または、上記方法以外に良い方法があれば、ご提案ください。

参考サイト、書籍、Ruby以外の他言語でのコードなど参考情報があれば教えてください。

フォローしていない人に、推薦度のような数値を設定して、上記5人ぐらいを推薦する... そんな感じでしょうか? 現在ユーザー数は千人ぐらいで、フォローする「人」も千人ぐらいのシステムです。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/05/26 05:45:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:dawakaki No.1

回答回数797ベストアンサー獲得回数122

Rubyでユーザーがフォローしているユーザーのリストを取得する方法
http://opentechnica.blogspot.jp/2012/01/rubytwitter.html

id:nemutaiyo

私の説明が不足してましたね。
フォローと書きましたが、Twitterとは関係ありません。

2013/05/19 08:44:29
id:a-kuma3 No.2

回答回数4974ベストアンサー獲得回数2154

ポイント75pt

Ruby のコード、というか、アルゴリズムの話ですよね。
こんなのを考えてみました。
自分と似たようなフォローをしている人を洗い出して、その人がフォローしているけど、自分がフォローしていない人をレコメンド候補とする。
# 文章で書くと、当たり前すぎる?

以下、こんな想定です。

  • User クラス
    • id … ユーザのID
    • follows … フォローしている人 (User) の Array
    • same_follows … 自分と同じフォローをしている人の数(途中で計算する)
  • userMap … キーが User#id 、値が User の Map
  • me … 自分を表す User のインスタンス

#   フォローしている人の一致している数をカウントする
userMap.each { |k, v|
    if v != me then
        v.same_follows = (v.follows & me.follows).size
    else
        v.same_follows = 0
    end
}

#   フォローしている人が一致した数の多い順で、先頭 10人(適当)
map = Hash.new
(userMap.values.sort_by { |a| a.same_follows }).last(10).reverse_each { |similar|
    #   自分がフォローしていない人をカウントアップ
    (similar.follows - me.follows).each { |user|
        if map[ user.id ].nil? then
            map[ user.id ] = 1
        else
            map[ user.id ] += 1
        end
    }
}

#   多い順に、上位五名をレコメンド候補
map.sort { |a, b| a[1] <=> b[1] }.last(5).reverse_each { |rec|
    puts "user: #{rec[0]} --- #{rec[1]}"
}

と、こういうことでしょうか?

# 動かしてません。擬似コードだと思ってください

id:boost_beast No.4

回答回数785ベストアンサー獲得回数31

ポイント75pt

http://www.moongift.jp/2012/03/20120305-5/

こちらが参考になると思います。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません