2012-02-01 10 views
0

私はミュージシャンのための社交的なサイトを構築しています。データベースから曲のリスト全体を取り出し、ログインしたユーザーとの関連性に基づいてそれぞれの曲をランク付けしたいと思います。これの理由の1つは、ユーザーが45秒前にサインアップしても、常に10曲が推奨されることです。ユーザーのメンバー接続中の曲のパーソナライズされた、加重された推薦 - ランクすべてのコンテンツ

  • バンドメンバー(すべてのサイトのメンバーとなり、すべての曲を終了している場合があります)
  • ログに記録された(5月:

    私が使用している要因でありますことなし)

  • 曲の中で最も最近の更新(少なくとも曲は「作成」された日となります)曲の(サブ)ジャンルは(常に設定されます
  • (サブ)ユーザーのジャンル(常に設定されます)

(サブ)ジャンルはより一般的なジャンルに属しているため、ログインしたユーザーと曲の(サブ)ジャンルが同じ場合はそれ以上の重みを付けたり、少なくとも同じジャンルに属している。

AprioriまたはBayesianアルゴリズムを目指すべきかどうかはわかりません...間にあるようです。私は、私が調整したHacker Newsアルゴリズムの説明から借りた2行を持っています。最終結果をどのようにまとめてランキングに入れるのかは分かりません。

これまでに書いたコードは、すべての目的と目的のためにです(スタジオはの曲です)。

function studio_relevance($user_id, $user_genre) { 
    global $cxn; 

$query = "SELECT * FROM studio WHERE project_status='active'"; 
$result = mysqli_query($cxn, $query) or die($query.': '.mysqli_error($cxn)); 

$data = array(); 

while ($studio = mysqli_fetch_object($result)) { 
    //Find similarities in social connections and band 
    $query_b = "SELECT * FROM band WHERE studio_id=".$studio->studio_id; 
    $result_b = mysqli_query($cxn, $query_b) or die($query_b.': '.mysqli_error($cxn)); 

    $the_band = array(); 
    while ($people = mysqli_fetch_array($result_b, MYSQLI_ASSOC)) { 
     $the_band[] = $people['user_id']; 
    } 

    $studio_band_count = count($the_band); 

    $query = "SELECT * FROM idols WHERE friend_id=".$user_id; 
    $result_b = mysqli_query($cxn, $query_b) or die($query_b.': '.mysqli_error($cxn)); 

    $idol = array(); 
    while ($people = mysqli_fetch_array($result_b, MYSQLI_ASSOC)) { 
     $idol[] = $people['artist_id']; 
    } 

    $same_band = array_intersect($the_band, $idol); 
    $same_band_count = count($same_band); 

    ######## 
    $similar_band = $same_band_count/$studio_band_count; 
    ######## 


    //Find the most recent activity 
    $query_b = "SELECT * FROM studio_feed WHERE studio_id=".$studio->studio_id." ORDER BY feed_id DESC LIMIT 1"; 
    $result_b = mysqli_query($cxn, $query_b) or die($query_b.': '.mysqli_error($cxn)); 
    $tab = mysqli_fetch_object($result_b); 

    $time_diff = strtotime('now') - strtotime($tab->timestamp); 
    $hours = $time_diff/3600; 

    ######## 
    $last_activity = pow(($hours+2), 1.8); 
    ######## 


    //Compare genres 
    $genre_weight = 1; 

    if ($studio->songGenre == $user_genre) { 
     $genre_weight = 3; 
    } 
    else { 
     $query_b = "SELECT * FROM genres"; 
     $result_b = mysqli_query($cxn, $query_b) or die($query_b.': '.mysqli_error($cxn)); 

     $genres = array(); 
     $user_genre_cat = 0; 

     while ($genre = mysqli_fetch_object($result_b)) { 
      $genres[$genre->genre_cat][] = $genre->genre_id; 

      if ($genre->genre_id == $user_genre) { 
       $user_genre_cat = $genre->genre_cat; 
      } 
     } 

     if (in_array($studio->songGenre, $genres[$celeb_cat])) { 
      $genre_weight = 2; 
     } 
    } 


    //Find final result 
    //$final = $similar_band + $last_activity + $genre_weight; 
    //$hours/pow(($similar_band+2), $genre_weight); 
} 

return $data; 
} 

任意の提案をいただければ幸いです。私はこのようなループ内のクエリは良いアイデアことはありませんが、私は使用していくつかのmemcaching制度がありますので、私はそれをこのようにやったし、これはおそらくも、バッチ処理されます知っています!私は正しい道を歩いているのですか?

答えて

関連する問題