如何更新内容受欢迎度评分,比如Hacker News算法?
我在我的社交网站上使用了一个定制版的Hacker News热门算法,这个算法是根据点赞和评论的数量来判断内容的受欢迎程度。这个算法运行得很好,但我不知道怎么正确地更新每个项目的得分(我把得分存储在项目模型的元数据里)。
现在,我只是对过去9天内的项目在每次收到新的点赞和评论时更新得分。这种做法非常慢,而且消耗资源,所以我在寻找更好的方法来保持得分的实时更新。问题是,每当有一个项目的得分发生变化时,所有相关的项目都需要重新计算得分,以保持时间衰减的效果。有什么更好的方法来做到这一点呢?我在这个项目中使用的是Django框架。
2 个回答
有很多方法可以做到这一点。一个简单的方法是给每个项目按顺序编号,并用它的ID号作为“排名ID”开始每个项目。每当一个帖子被点赞时,就把它的排名数字加一(如果是点踩则减一)。然后,根据排名数字来排序,这样就能正确地排列项目。
另一个选择是使用指数衰减模型,这种方法需要定期更新,但可以和投票一起进行,这样就能减少你需要做的批量更新工作。我写了一篇关于如何实现这个模型的文章,可以在这里找到。这篇文章主要针对App Engine,但一般来说也很有用。
好的,我用不同的应用程序实现了这个功能:
首先,你需要在GitHub上安装“dokterbob/django-popularity”或者“thornomad/django-hitcount”,这两个工具可以用来追踪一个链接被访问的次数。
其次,你需要统计一个对象收到多少投票(喜欢或收藏)。为此,你可以试试“brosner/django-voting”或者“apgwoz/django-favorites”。
现在你需要用这段代码——django-populars来把这些功能整合在一起。我建议你先看看这段代码,了解它是怎么工作的,这样你就能明白如何把需要的组件组合起来。