음악인을위한 소셜 사이트를 구축 중입니다. 데이터베이스에서 노래 전체 목록을 가져 와서 로그인 한 사용자와의 관련성에 따라 순위를 매기고 싶습니다. 한 가지 이유는 사용자가 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;
}
어떤 제안이 크게 감사하겠습니다! 나는 옳은 길을 가고 있는가? 아니면이 모든 잘못을 저질러 가고 있는가?
다운 투표에 참여해 주셔서 감사합니다. – grandcameo