首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >个性化加权推荐-所有内容排名

个性化加权推荐-所有内容排名
EN

Stack Overflow用户
提问于 2012-02-01 14:52:35
回答 1查看 321关注 0票数 0

我在为音乐家们建一个社交网站。我想从数据库中获取所有歌曲列表,并根据其与登录用户的相关性对每一首歌曲进行排序。原因之一是,我希望始终有10首歌曲推荐,即使用户注册45秒前。

我使用的因素是:

  • 乐队成员(都是网站的成员,可能都已经退出了歌曲)
  • 登录用户的成员连接(可能为无)
  • 最新的歌曲更新(至少是歌曲“创建”的当天)
  • 歌曲的(子)类型(将始终被设置)

<代码>H19用户的(子)类型(将始终被设置)H 210F 211

(子)类型属于更一般的类型,所以我想,如果登录用户和歌曲(子)类型相同,我可以选择更高的权重,或者如果它们至少属于相同的一般类型,就稍微低一点。

我不确定我是否应该瞄准Apriori或Bayesian算法.似乎是介于两者之间。我有几行借用从解释黑客新闻算法,我已经调整了。我不太清楚如何把最后的结果加在一起来得到我的排名。

这是我到目前为止编写的代码(就所有意图和目的而言,工作室就是一首歌)。我知道这样循环中的查询从来都不是一个好主意,但我这样做是因为我使用了一些内存缓存方案,而且这可能也会被批处理:

代码语言:javascript
运行
复制
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;
}

如有任何建议,将不胜感激!我是在正确的轨道上还是在这件事上都错了?

EN

回答 1

Stack Overflow用户

发布于 2012-02-01 15:27:38

tl博士我建议您从头开始重写您的问题,或者查看CodeReview站点。https://codereview.stackexchange.com/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9097919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档