如何实现类似Digg的算法?

时间:2008-09-16 12:59:01

标签: sql algorithm recommendation-engine digg

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

  • 用户提交内容
  • 其他用户查看内容并投票(假设90%的用户仅查看内容,10%的用户主动对内容进行投票或投票)
  • 不断提交新内容

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

我认为该算法需要考虑以下因素:

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

E.g。获得持续涓涓细流的项目将持续保持某种程度的“热”,而在首次提交时获得一连串投票的项目将跳到“热度”列表的顶部但随后随着投票停止而下降进来。

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

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

保罗格雷厄姆写了一篇关于他在developing Hacker News学到的东西的文章。重点更多的是他试图吸引/创造的人/互动而不是算法本身,但仍然值得一读。例如,他讨论了故事从底部(HN)到爆炸到顶部(Digg)从头版冒出来的不同结果。 (虽然从我所见过的HN来看,它看起来也像故事一样爆炸到了顶层。)

他提供了这个引用:

  

表现的关键是优雅,而不是特殊情况的营。

根据用于生成HN首页的purported algorithm

  

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

     

,其中

     

p =文章的要点和

     

t =提交文章的时间

可能是一个很好的起点。

答案 4 :(得分:1)

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

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 *列相同的触发器更新它。在优化之后,对于大多数任何规模的网站来说,它应该足够快。