人气算法

时间:2009-01-30 20:28:53

标签: php mysql algorithm

我想在上传“最热门”插图的用户提交插图网站的主页上填写。

以下是我可以采取的措施:

  • 有多少人喜欢这个插图
    • votes表包含投票日期
  • 上传插图时
    • illustration表已创建日期
  • 评论数量(目前最高评论总数不超过10条)
    • comments表有评论日期

我已经四处寻找,但不希望用户权限发挥作用,但大多数算法都包括这一点。

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

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

如何衡量年龄反对选票?当然,提交较少的网站需要减少日期权重吗?

4 个答案:

答案 0 :(得分:4)

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

例如,这是您可能想要尝试的一个伪示例。当然,您需要根据自己对网站的体验来调整每个类别的权重。评论很少见,但是用户需要付出更多的努力而不是喜欢/投票,所以他们可能会获得更多的权重。

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

if(age < 86400) score = score * 1.5

此类方法可为过去一天上传的新内容带来奖励。如果您想以类似的方式仅对最近被收藏或评论的内容进行处理,您可以在查询中添加一些WHERE约束,从数据库中获取分数。

实际上有两个重要原因是不能动态计算这个排名。

  1. 要求您的数据库获取所有数据并对每个页面加载进行计算,只是为了重新排序项目,会导致代价高昂的查询。
  2. 可能是一个较小的问题,但如果您在网站上的活动量相对较少,则排名的微小变化可能会导致内容大幅度移动。
  3. 这样您就可以定期缓存结果,也可以设置一个cron作业来更新一个新的数据库列,其中包含您正在排名的分数。

答案 1 :(得分: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))。依此类推......根据你对该算法的具体要求,可能需要进行一些实验才能找出最佳结果。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

类似的东西:

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

k越高,人数越少,人数就越少。

您还可以将时间更改为首次出现的时间+上次活动的时间,这样可以确保旧插图会随着时间的推移而消失。