Персонализирани, претеглени препоръки - класирайте цялото съдържание

Създавам социален сайт за музиканти. Бих искал да взема целия списък с песни от базата данни и да класирам всяка въз основа на нейната уместност за влезлия потребител. Една от причините за това е, че бих искал винаги да има 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)


tl;dr. Бих ви посъветвал да пренапишете въпроса си от нулата или да разгледате сайта на CodeReview. https://codereview.stackexchange.com/

person Theodore R. Smith    schedule 01.02.2012