2012-02-01 2 views
0

음악인을위한 소셜 사이트를 구축 중입니다. 데이터베이스에서 노래 전체 목록을 가져 와서 로그인 한 사용자와의 관련성에 따라 순위를 매기고 싶습니다. 한 가지 이유는 사용자가 45 초 전에 가입 했더라도 항상 10 곡을 추천하기를 바랍니다. 내가 사용맞춤형, 권장 가중치 별 - 순위 전체 내용

요인은 다음과 같습니다

  • 노래의 밴드 구성원은 사용자의 회원 접속 로그인
  • (사이트의 모든 것 구성원 모두가 노래를 종료 할 수도 있습니다) (5 월 수 없음)
  • 노래의 최신 업데이트 (적어도 노래가 "창조"된 날이 될 것입니다) 노래의 (하위) 장르 (항상 설정됩니다
  • )
  • (서브) 사용자의 장르 (항상 설정 됨)

(하위) 장르는 더 일반적인 장르에 속하므로 로그인 한 사용자와 노래 (하위) 장르가 같거나 더 높으면 노래의 무게를 더 높일 수 있습니다. 적어도 같은 장르에 속한다.

Apriori 또는 베이지안 알고리즘을 목표로해야하는지 확실하지 않습니다 ... 중간에있는 것으로 보입니다. 나는 해커 뉴스 알고리즘에 대한 설명에서 빌린 몇 줄의 것을 가지고있다. 최종 결과를 어떻게 정리하여 내 순위를 얻는 지 잘 모르겠습니다.

지금까지 작성한 코드는 다음과 같습니다 (모든 용도와 목적으로 스튜디오는 노래입니다). 이 같은 루프에서 쿼리 좋은 생각이 결코 알고 있지만, 내가 사용하는 일부 memcaching 제도가 있기 때문에 나는이 방법을 수행 한이 아마 또한 일괄 처리됩니다

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; 
} 

어떤 제안이 크게 감사하겠습니다! 나는 옳은 길을 가고 있는가? 아니면이 모든 잘못을 저질러 가고 있는가?

답변