Персонализированные, взвешенные рекомендации — ранжируйте весь контент

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

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

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

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

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

Вот код, который я написал до сих пор (во всех смыслах и целях студия — это песня). Я знаю, что запросы в таких циклах никогда не бывают хорошей идеей, но я сделал это таким образом, потому что я использую некоторые схемы кэширования памяти, и это, вероятно, также будет пакетным:

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

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


person grandcameo    schedule 01.02.2012    source источник


Ответы (1)


тл; др. Я бы посоветовал вам переписать свой вопрос с нуля или проверить сайт CodeReview. https://codereview.stackexchange.com/

person Theodore R. Smith    schedule 01.02.2012