如何实现类似Digg的算法?

时间:2020-03-05 18:55:50  来源:igfitidea点击:

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

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

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

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

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

例如。不断获得点滴滴答的项目将保持恒定的"热度",而第一次提交时获得一连串投票的项目将跳至"热度"列表的顶部,但随着投票停止而下降进来。

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

解决方案

回答

我们可以使用类似于Reddit算法的方法,该算法的基本原理是根据发布时间和得分计算发布值。 Reddit算法的优点在于,仅当帖子的分数发生变化时才需要重新计算该值。当我们要显示首页时,我们仅会基于该分数从数据库中获得前n个帖子。随着时间的流逝,得分自然会增加,因此我们无需进行任何特殊处理即可从首页删除项目。

回答

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

回答

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

  • 首先,票数是有限的,用户只有有限的票数,而票数取决于用户点数。为了获得积分,每个用户必须添加获得好评的链接。
  • 然后,用户可以为每个链接投票-3,-2,-1、1,2或者3票。由于投票数量有限,每个用户只会对自己喜欢的那些链接进行投票。
  • 为了防止用户仅对同一用户的链接进行投票,从而创建支持组,每个投票添加到链接的点取决于总投票数与投票链接所有者的链接之间的投票比率。如果我们始终对相同的用户链接进行投票,那么投票将失去价值。
  • 投票会随着时间而失去价值。
  • 来自没有积分的用户(新用户)的新链接将以0开头。来自老用户的新链接将根据他们的积分获得积分。从+3到-无限。来自具有负点的用户的链接将具有负的起点,来自具有正点的用户的链接将具有正的起点。

投票通过后,用户将获得随机分数。正面票数为正面分,负面票数为负数。

回答

保罗·格雷厄姆(Paul Graham)写了一篇文章,介绍了他在开发《黑客新闻》时学到的知识。重点更多是在他试图吸引/创造的人员/互动上,而不是算法本身,但仍然值得一读。例如,他讨论了故事从首页的底部(HN)冒到顶部(Digg)冒起时的不同结果。 (尽管从我对HN的了解来看,故事似乎也爆炸到了顶部)。

他提供此报价:

The key to performance is elegance, not battalions of special cases.

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

(p - 1) / (t + 2)^1.5
  
  where
  
  p = an article's points and
  
  t = time from submission of article

可能是一个很好的起点。