继续创作,加快生长!这是我参与「日新计划 10 月更文挑战」的第5天,点击查看活动详情

打分排序系统的应用十分普遍,比如电影的评分,知乎帖子的热度,和新闻文章的排序。让咱们从最简略直观的平均打分开始, 聊聊各种打分方法的利害和运用场景。

最简略的打分方法当然是一段时间的点赞量综述。显而易见的缺陷便是越老的帖子简略拿到更多的赞而长期霸榜,HN用了一种简略的时间方法来考虑时间衰减。

Hacker News Algo – 只有点赞

打分排序系统漫谈1 - 时间衰减

score=(v−1)(t+2)G∗penwherev−1除掉只有一个用户点赞的状况t+2确保除数永久大于1G:衡量打分随时间的衰减程度pen:争议,过短,没有跳转的文章打分会打折score = \frac{(v-1)}{(t+2)^G} * pen \\ where v-1 除掉只有一个用户点赞的状况 \\ t+2 确保除数永久大于1 \\ G:衡量打分随时间的衰减程度 \\ pen: 争议,过短,没有跳转的文章打分会打折\\
def hacker_news_ranking(votes, item_age, gravity = 1.8, penalties):
    score = (votes-1)/(item_age +2)**gravity * penalties 
    return score 

Hacker News 的打分方法,首要考虑到了时间衰减。确保老的新闻不会由于累计更多的点赞而一直在排在前面。并且点赞数和帖子新旧程度的权衡能够经过G的大小来调整。但仍然有几个未解问题:

  1. 时间衰减过快,对于一些有长实效性的打分并不适用。能否在打分上参加指数?

  2. 如何考虑时间衰减和当前时段的联系。不一起段浏览量不同,假如一篇很好的文章在凌晨发布,由于当时浏览量低,文章或许永久没有置顶时机。能否对时间进行加权?

  3. 没有考虑到点赞量和文章热度的非线性联系。简略说便是点赞量能够挨近无限大,但文章热度是有限的。能否对打分进行非线性紧缩?

  4. 不同类型文章热度是否可比,例如有的文章质量高但是相对小众。能否做组内排序?或许用点赞率来衡量

  5. 同理也应该考虑到浏览量(PV)和点赞量的联系。点赞率高的应该考虑排在前面,但同样浏览量过小的点赞率也要考虑置信度的问题

Reddit Hot Formula – 包含点赞和拍砖

打分排序系统漫谈1 - 时间衰减

一起考虑点赞和拍砖,Reddit 的 Hot Formula采用了和Hacker News类似的打分方法,来引荐优质高热度的文章。并针对上述问题(1)和(3)给出了不同的处理。公式如下:

score=up−downscoreadj=log⁡10(max(score,1))sign={1ifscore>00ifscore=0−1ifscore<0score=scoreadj∗sign+seconds45000where seconds=发帖时间−2015年12月8日score = up – down \\ score_{adj} = \log_{10}{(max(score,1))}\\ sign = \begin{cases} 1 if score > 0 \\ 0 if score = 0 \\ -1 if score <0 \\ \end{cases}\\ score = score_{adj} * sign + \frac{seconds}{45000} \\ where \, seconds =发帖时间 – 2015年12月8日

和Hacker News相比, Reddt Hot Formula有几个不同点:

  • 用取Log的方法解决了上述提出的第三个问题便是文章热度和点赞量之间的非线性联系,文章热度不会跟着点赞量的添加无限线性增长。而紧缩的强度能够经过改动log的底数来调整,底数越大点赞量对文章的影响

  • 处理时间递减上,Hot Formula采用了线性递减处理。新的帖子由于距历史时点更远会拿到更高的时间加分项seconds45000\frac{seconds}{45000}。和上述指数衰减相比,线性不会过度赏罚老文章。

思考:时间衰减

比较Hacker News,和Reddit Hot Formula, 首要的两点区别在于对点赞量(拍砖)取log进行紧缩,以及不同的时间衰减项。 log运算单调所以假如只用排序不用分数的话并不会对终究排序产生影响,所以让咱们再来深化讨论一下时间衰减项的选取。

简略来说时间衰减的意义便是为了让新老文章的热度具有可比性,否则老的帖子会由于在更长的时间累计了更多的帖子而一直置顶。一种直观的解决办法便是给老的帖子添加时间赏罚项。几种常见的时间衰减项包含:

  • 线性衰减
scoret=score0−T/Gscore_t = score_0 – T/G
  • 幂指数衰减
scoret=score0/(T+2)Gscore_t = score_0 / (T + 2)^G

幂指数衰减的衰减速度会跟着时间加快,加快时间赏罚项对打分的影响。假如觉得幂指数的表达形式不够直观,咱们能够对等式左右取个对数,会发现对数打分的变化是对数时间的线性函数,能够用这个方法来判别幂指数打分是否适用,如下:

log(scoret)=log(score0)−G∗log(T+2)log(score_t) = log(score_0) – G * log(T+2)
  • 指数衰减
scoret=score0∗exp(−∗T)score_t = score_0 * exp( – \lambda * T )

指数衰减能够由牛顿冷却定律的一阶微分方程得到,\lambda是衰减速率,速率恒定,经过t时间衰减的量和N当前的值正相关

dN(t)dt=−N(t)dN(t)N(t)=−dtlog(N(t)N0)=−t\frac{dN(t)}{dt} = – \lambda N(t) \\ \frac{dN(t)}{N(t)} = -\lambda dt \\ log(\frac{N(t)}{N_0}) = – \lambda t \\

也能够从指数分布的视点来理解,N0N_0是调集初始的元素数量,其间每个元素都在衰减,在t时间依旧存在的元素数量期望是N(t)N(t)。元素的生命长度符合指数分布:

f(t)∼e−tP(x>t)=1−F(x<t)=e−tN(t)=N0∗P(x>t)f(t) \sim \lambda e^{-\lambda t} \\ P(x>t) = 1 – F(x<t) = e^{-\lambda t } \\ N(t) = N_0 * P(x>t)

下一节咱们接着就上述提出的几个问题中还没有解决的如何归纳考虑浏览量和点赞量来打分的问题进行讨论。 要是您感兴趣请戳下方

www.cnblogs.com/gogoSandy/p…

To be Continue.


Reference

  1. www.evanmiller.org/rank-hotnes…
  2. www.ruanyifeng.com/blog/2012/0…
  3. medium.com/hacking-and…