Intereting Posts

Персонализированные, взвешенные рекомендации – рейтинг всех материалов

Я создаю социальный сайт для музыкантов. Я хотел бы взять весь список песен из базы данных и оценить каждый из них на основе его релевантности для зарегистрированного пользователя. Одной из причин этого является то, что я хочу, чтобы там всегда было рекомендовано 10 песен, даже если пользователь зарегистрировался 45 секунд назад.

Факторы, которые я использую:

  • Участники группы песен (все будут членами сайта, возможно, все выйдут из песни)
  • Записанные входящие соединения пользователя (может быть ничем)
  • Самое последнее обновление в песне (по крайней мере, будет днем ​​создания песни)
  • (Суб) жанр песни (всегда будет установлен)
  • (Суб) жанр пользователя (всегда будет установлен)

(Под) жанры относятся к более общим жанрам, поэтому я полагаю, что могу либо весить песню выше, если зарегистрированный пользователь и жанр песни (суб) одинаковы или немного меньше, если они по крайней мере принадлежат к одному и тому же общий жанр.

Я не уверен, должен ли я стремиться к алгоритму Apriori или байесовскому алгоритму … Кажется, он находится где-то посередине. У меня есть пара строк, заимствованных из объяснений алгоритма Hacker News, который я изменил. Я не совсем уверен, как собрать окончательные результаты, чтобы получить мой рейтинг.

Вот код, который я написал до сих пор (для всех целей и целей, студия – это песня ). Я знаю, что запросы в циклах вроде этого никогда не являются хорошей идеей, но я сделал это так, потому что есть некоторые схемы 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; } 

Любые предложения будут ценны! Я на правильном пути или все это неправильно?