如何使用类似于stackoverflow / digg / reddit的推荐系统实现网站?即,用户提交内容,并且网站需要根据项目的受欢迎程度来计算某种“热度”。流程如下:
如何实现计算提交项目“热度”的算法,最好是实时计算?是否有最佳实践或设计模式?
我认为该算法需要考虑以下因素:
E.g。获得持续涓涓细流的项目将持续保持某种程度的“热”,而在首次提交时获得一连串投票的项目将跳到“热度”列表的顶部但随后随着投票停止而下降进来。
(我使用的是MySQL + PHP,但我对一般设计模式感兴趣)。
答案 0 :(得分:6)
您可以使用与Reddit algorithm类似的内容 - 其基本原则是根据帖子的发布时间和分数计算帖子的值。关于Reddit算法的简洁之处在于,只需要在帖子得分发生变化时重新计算该值。当您想要显示首页时,您只需根据该分数从数据库中获得前n个帖子。随着时间的推移,分数自然会增加,因此您无需进行任何特殊处理即可从首页删除项目。
答案 1 :(得分:4)
在我自己的网站上,我为每个条目分配一个单调增加的系列中的唯一整数(较新的帖子获得更高的数字)。每次向上投票都会将数字增加一,每次投票都会减少一次(当然,您可以调整这些数值)。然后,只需按数字排序即可显示“最热门”条目。
答案 2 :(得分:1)
我开发了一个社交书签网站Sites Favoritos,并使用了一个复杂的算法:
用户在投票时会获得随机点数。正面投票给出正面积分,负面投票给予负面点。
答案 3 :(得分:1)
他提供了这个引用:
表现的关键是优雅,而不是特殊情况的营。
根据用于生成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 *列相同的触发器更新它。在优化之后,对于大多数任何规模的网站来说,它应该足够快。