我在为音乐家们建一个社交网站。我想从数据库中获取所有歌曲列表,并根据其与登录用户的相关性对每一首歌曲进行排序。原因之一是,我希望始终有10首歌曲推荐,即使用户注册45秒前。
我使用的因素是:
<代码>H19用户的(子)类型(将始终被设置)H 210F 211
(子)类型属于更一般的类型,所以我想,如果登录用户和歌曲(子)类型相同,我可以选择更高的权重,或者如果它们至少属于相同的一般类型,就稍微低一点。
我不确定我是否应该瞄准Apriori或Bayesian算法.似乎是介于两者之间。我有几行借用从解释黑客新闻算法,我已经调整了。我不太清楚如何把最后的结果加在一起来得到我的排名。
这是我到目前为止编写的代码(就所有意图和目的而言,工作室就是一首歌)。我知道这样循环中的查询从来都不是一个好主意,但我这样做是因为我使用了一些内存缓存方案,而且这可能也会被批处理:
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;
}
如有任何建议,将不胜感激!我是在正确的轨道上还是在这件事上都错了?
发布于 2012-02-01 15:27:38
tl博士我建议您从头开始重写您的问题,或者查看CodeReview站点。https://codereview.stackexchange.com/
https://stackoverflow.com/questions/9097919
复制相似问题