10

如何用类似于stackoverflow/digg/reddit的推荐系统来实现一个网站?即,用户提交内容,网站需要根据项目的受欢迎程度来计算某种“热度”。流程如下:

  • 用户提交内容
  • 其他用户查看内容并对内容进行投票(假设 90% 的用户只查看内容,而 10% 的用户对内容积极投赞成票或反对票)
  • 新内容不断提交

如何实现一个算法来计算提交项目的“热度”,最好是实时计算?是否有任何最佳实践或设计模式?

我假设该算法考虑了以下因素:

  • 提交项目时
  • 每次投票时
  • 查看项目的时间

例如,一个获得持续不断的投票的项目会一直保持一定的“热度”,而一个在首次提交时获得大量投票的项目将跳到“热度”列表的顶部,但随后随着投票而下降别进来了

(我使用的是 MySQL+PHP,但我对一般设计模式感兴趣)。

4

5 回答 5

6

您可以使用类似于Reddit 算法的东西——其基本原理是根据帖子发布的时间和分数计算帖子的值。Reddit 算法的巧妙之处在于,您只需要在帖子分数发生变化时重新计算该值。当您想要显示您的首页时,您只需根据该分数从数据库中获取前 n 个帖子。随着时间的推移,分数自然会增加,因此您无需进行任何特殊处理即可将项目从首页中删除。

于 2008-09-16T13:05:05.407 回答
4

在我自己的网站上,我从单调递增的系列中为每个条目分配一个唯一的整数(较新的帖子获得更高的数字)。每次投赞成票都会将数字加一,每次投反对票会减一(当然,您可以调整这些值)。然后,只需按数字排序即可显示“最热门”条目。

于 2008-09-19T17:04:36.047 回答
1

我开发了一个社交书签网站Sites Favoritos,并使用了一个复杂的算法:

  1. 首先,投票是有限的,一个用户只有有限的票数,票数取决于用户的积分。要获得积分,每个用户都必须添加获得正面投票的链接。
  2. 然后,用户可以为每个链接投 -3、-2、-1、1、2 或 3 票。由于投票是有限的,每个用户只会对他们喜欢的链接进行投票。
  3. 为了防止用户仅对同一用户的链接进行投票,创建支持组,每次投票添加到链接的点数取决于总票数和对已投票链接所有者的链接的投票之间的比率。如果您总是对相同的用户链接进行投票,您的投票将失去价值。
  4. 选票会随着时间而失去价值。
  5. 来自没有积分的用户(新用户)的新链接的起始积分为 0。来自老用户的新链接将根据他们的积分获得积分。范围从 +3 到 -infinite。来自负分用户的链接将具有负起点,来自具有正分用户的链接将具有正起点。

当他们的链接被投票时,用户将获得随机积分。正票给正分,负票给负分。

于 2008-09-19T17:25:27.960 回答
1

Paul Graham 写了一篇关于他在开发 Hacker News中学到的东西的文章。重点更多的是他试图吸引/创造的人/互动,而不是算法本身,但仍然值得一读。例如,他讨论了故事从底部冒泡(HN)与爆炸到首页顶部(Digg)时的不同结果。(尽管从我对 HN 的了解来看,故事似乎也在那里爆发了)。

他提供了这样的报价:

性能的关键是优雅,而不是各种特殊情况。

根据用于生成 HN 首页的所谓算法:

(p - 1) / (t + 2)^1.5

在哪里

p =一篇文章的观点和

t = 文章提交时间

可能是一个很好的起点。

于 2010-04-11T14:56:50.657 回答
1

我为视频聚合器实现了 Reddit 排名算法的 SQL 版本,如下所示:

SELECT id, title
FROM videos
ORDER BY 
    LOG10(ABS(cached_votes_total) + 1) * SIGN(cached_votes_total)   
    + (UNIX_TIMESTAMP(created_at) / 300000) DESC
LIMIT 50

*cached_votes_total* 会在每次投票时由触发器更新。它在我们当前的站点上运行得足够快,但我计划添加一个排名值列并使用与 *cached_votes_total* 列相同的触发器对其进行更新。在优化之后,它对于大多数任何规模的网站都应该足够快。

于 2012-10-31T13:46:19.260 回答