【问题标题】:Popularity decay algorithm for popular website posts流行网站帖子的流行度衰减算法
【发布时间】:2013-10-13 16:56:54
【问题描述】:

我正在寻找一种算法来按受欢迎程度对网站结果进行排序。就像 Reddit 一样,帖子越旧,其投票/分数的影响力就越小。

这是 reddit 使用的普遍接受的解决方案:

t = (time of entry post) - (Dec 8, 2005)
x = upvotes - downvotes

y = {1 if x > 0, 0 if x = 0, -1 if x < 0)
z = {1 if x < 1, otherwise x}

rank = log(z) + (y * t)/45000

我已经研究过 Reddit 的算法,虽然它适用于一种情况,但我真正需要的是两种算法,一种用于热门帖子,另一种用于即将发布的帖子:

  • 热门帖子
  • 即将发布的帖子

受欢迎程度会减慢,给稍旧的帖子更多的权重,即将发布的帖子将更多地关注今天的热门帖子,在 N 小时/天/等之后急剧下降。

我正在使用 Sphinx 表达式编写此代码,因此我无法编写极其复​​杂的算法,并且我只能访问以下函数:

http://sphinxsearch.com/docs/current.html#numeric-functions

所以我每个帖子都有以下数据:

  • 以秒为单位的帖子年龄
  • 发布分数

这是我目前的解决方案:

Exponent = 0.01 (Popular), 0.5 (Upcoming)
SecondsSincePublised = abs(CurTimeInSecondsSinceDate-PubTimeInSecondsSinceDate)
Rank = (log10(PostScore)*10000) / pow(SecondsSincePublised,Exponent) 

虽然这个解决方案确实有效,但它并不理想。在过去的几个小时内,一篇新的热门帖子通常在热门和即将发布的帖子中都排名靠前,这并不是我真正想要的。

谁能建议我可以修改指数分量以调整衰减的另一种算法?

【问题讨论】:

    标签: c# algorithm sphinx


    【解决方案1】:

    你试过 Hacker news 使用的排名算法吗? 实现起来很简单。

    Score = (P-1) / (T+2)^G
    
    where,
    P = points of an item (and -1 is to negate submitters vote)
    T = time since submission (in hours)
    G = Gravity, defaults to 1.8 in news.arc
    

    您可以改变重力来调整衰减。

    更多信息请参考How Hacker News ranking algorithm works

    【讨论】:

    • 这看起来很有趣,我将在本地实现它,看看我得到了什么样的结果。
    • 这是否意味着您需要不断更新数据库,因为“提交后的时间”总是在变化。当您获得数百万个条目时,这将无法扩展。
    【解决方案2】:

    您是否尝试对“流行”和“即将到来”使用不同的衰减函数?例如,对“即将发布”使用指数衰减率,对“流行”使用多项式衰减率,这样,在几个小时后(如果优化正确),帖子在即将发布时获得高分的可能性很小。而在多项式衰减函数中,相邻时间之间的关系越来越小,而指数衰减函数则不是这样。

    这是一个示例(参数 0.01 和 1.0005 是任意的,应根据您的目标进行优化)。

    流行:

    SecondsSincePublised = abs(CurTimeInSecondsSinceDate-PubTimeInSecondsSinceDate)
    Rank = (log10(PostScore)*10000) / pow(SecondsSincePublised,0.01)
    

    即将到来:

    SecondsSincePublised = abs(CurTimeInSecondsSinceDate-PubTimeInSecondsSinceDate)
    Rank = (log10(PostScore)*10000) / pow(1.0005,SecondsSincePublised)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-30
      • 2012-06-23
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 2010-12-30
      相关资源
      最近更新 更多