如何实现类似 Digg 的算法?
Posted
技术标签:
【中文标题】如何实现类似 Digg 的算法?【英文标题】:How to implement a Digg-like algorithm? 【发布时间】:2010-09-09 11:20:00 【问题描述】:如何用类似于***/digg/reddit的推荐系统来实现一个网站?即用户提交内容,网站需要根据该项目的受欢迎程度来计算某种“热度”。流程如下:
用户提交内容 其他用户查看内容并对内容进行投票(假设 90% 的用户只查看内容,而 10% 的用户对内容积极投赞成票或反对票) 新内容不断提交如何实现一个算法来计算提交项目的“热度”,最好是实时计算?是否有任何最佳实践或设计模式?
我假设该算法考虑了以下因素:
提交项目时 每次投票的时间 查看项目的时间例如一个获得持续不断的投票的项目会一直保持一定的“热度”,而一个在首次提交时获得大量投票的项目将跳到“热度”列表的顶部,但随着投票停止而下降进来了。
(我使用的是 mysql+php,但我对一般设计模式感兴趣)。
【问题讨论】:
相关问题,其中记录了我们使用的公式:meta.stackexchange.com/questions/11602/… 【参考方案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* 列相同的触发器对其进行更新。经过优化后,它对于大多数任何规模的网站都应该足够快了。
【讨论】:
【参考方案2】:Paul Graham 写了一篇关于他在developing Hacker News 中学到的东西的文章。重点更多的是他试图吸引/创造的人/互动,而不是算法本身,但仍然值得一读。例如,他讨论了故事从底部冒泡(HN)与爆炸到首页顶部(Digg)时的不同结果。 (虽然从我对 HN 的了解来看,似乎故事也在那里爆发了)。
他提供了这句话:
性能的关键是优雅,而不是各种特殊情况。
根据purported algorithm生成HN首页:
(p - 1) / (t + 2)^1.5
在哪里
p = 一篇文章的观点和
t = 文章提交时间
可能是一个很好的起点。
【讨论】:
【参考方案3】:我开发了一个社交书签网站Sites Favoritos,并使用了复杂的算法:
-
首先,投票是有限的,一个用户只有有限的票数,票数取决于用户积分。要获得积分,每个用户都必须添加获得正面投票的链接。
然后,用户可以对每个链接投-3、-2、-1、1、2 或3 票。由于投票数量有限,每个用户将只对他们喜欢的链接进行投票。
为防止用户仅对同一用户的链接进行投票,创建支持组,每次投票添加到链接的点数取决于总投票数与投票链接所有者的链接投票数之间的比率。如果您总是对相同的用户链接进行投票,您的投票将失去价值。
投票会随着时间的推移而失去价值。
来自没有积分的用户(新用户)的新链接的起始积分为 0。来自老用户的新链接将根据他们的积分获得积分。范围从 +3 到 -infinite。负分用户的链接起点为负,正分用户的链接起点为正。
用户在他们的链接被投票时将获得随机积分。正票给正分,负票给负分。
【讨论】:
【参考方案4】:在我自己的网站上,我从一个单调递增的系列中为每个条目分配一个唯一的整数(更新的帖子获得更高的数字)。每次投赞成票都会将数字加一,每次投反对票会减一(当然,您可以调整这些值)。然后,只需按数字排序即可显示“最热门”条目。
【讨论】:
【参考方案5】:您可以使用类似于Reddit algorithm 的东西 - 其基本原理是您根据发布时间和分数计算帖子的值。 Reddit 算法的巧妙之处在于,您只需要在帖子分数发生变化时重新计算该值。当您想要显示您的首页时,您只需根据该分数从数据库中获取前 n 个帖子。随着时间的推移,分数自然会增加,因此您无需进行任何特殊处理即可将项目从首页中删除。
【讨论】:
挖掘者永远不会使用 reddit 算法。永远。以上是关于如何实现类似 Digg 的算法?的主要内容,如果未能解决你的问题,请参考以下文章