2009-01-30 130 views
4

我想通过上传的“最热门”插图填充我的用户提交的插图网站的主页。受欢迎程度算法

这里有措施,我提供以下信息:

  • 有多少人收藏最多的是插图
    • votes表包括日投票
  • 当插图上传
    • illustration标签乐已创建日期
  • (合计约10最多评论不太好,此刻)的评论数
    • comments表有

找遍周围评论日期,但不希望用户权限发挥作用,但大多数算法都包含这一点。

我还需要找出是否最好在MySQL中进行计算,以获取数据或者每小时应该有一个PHP/cron方法。

我只需要20个插图来填充主页。我不需要为这些数据进行任何分页。

我该如何衡量年龄与选票?当然,提交数量较少的网站在添加日期时需要的重量较轻?

回答

4

许多使用某种类型的流行度排名的网站通过使用标准算法来确定分数然后随着时间的推移而永久衰减。我发现,对于流量较少的网站而言,效果更好的是可以为新内容/活动提供奖励的乘数 - 它本质上是相同的,但在您选择一段时间后,分数会停止变化。

例如,下面是您可能想要尝试的某个虚拟示例。当然,您需要根据自己的网站体验调整归因于每个类别的重量。评论很少见,但比用户喜欢的/投票更多的努力,所以他们可能会得到更多的分量。

score = (votes/10) + comments 
age = UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date_created) 

if(age < 86400) score = score * 1.5 

这种类型的方法会为上一天上传的新内容提供奖励。如果你想以类似的方式来处理近期已经被收录或评论过的内容,那么你可以在你的查询中添加一些WHERE约束来从数据库中获取分数。

实际上有两个很大的原因不是在飞行中计算这个排名。

  1. 要求您的数据库获取所有数据并对每个页面加载进行计算以重新排序项目会导致代价高昂的查询。
  2. 可能是一个小问题,但如果您在网站上的活动数量相对较少,则排名的小改动可能会导致内容移动得非常剧烈。

这会让您周期性地缓存结果,或者设置一个cron作业来更新一个新的数据库列,并保持您排名靠前的分数。

0

就实际算法而言,我没有任何有用的想法,但是在实现方面,我建议在某个地方缓存结果,并定期更新 - 如果结果计算导致昂贵的查询,那么您可能不想减慢你的响应时间。

0

喜欢的东西:

(count favorited + k) */time since last activity

越高k是重量少了具有其收藏的人数。

您也可以将时间更改为最初出现的时间+最后一次活动的时间,这样可以确保较旧的插图随时间消失。

2

显然这里有一些主观性 - 没有一个“正确的”算法来确定适当的平衡 - 但我会从每单位年龄的投票开始。 MySQL可以进行基本的数学计算,因此您可以要求它根据时间投票的商数进行排序;但是,出于性能原因,缓存查询结果可能是一个好主意。也许像

SELECT images.url FROM images ORDER BY (NOW() - images.date)/COUNT((SELECT COUNT(*) FROM votes WHERE votes.image_id = images.id)) DESC LIMIT 20 

,但我的SQL是生锈;-)

以简单平均,当然,有利于新的图像偏移显示出来的头版上。如果你想消除这种偏见,那么你可以只计算在图片发布后的特定时间限制内发生的那些投票。对于比该时间限制更近的图像,您必须通过将时间限制乘以投票数然后除以图像的年龄来归一化。或者,您可以给选票连续变化,如exp(-time(vote) + time(image))。依此类推......取决于你对这个算法的作用有多特别,可能需要一些实验来弄清楚什么公式提供了最好的结果。

+0

我同意。可衡量的流行度的数量应该随着时间的推移来衡量,否则你最终只能得到一个半陈旧的主页。例如,在过去24小时内获得最多积分的项目。 – Ross 2009-01-31 13:48:11