实现一个内容系统的问答排名,了解一下几个经典的算法
hacker news的排名算法
hacker news上面的热度排名多年以来能够很好的反映绝大多数用户的喜好,热度比较高的的文章也不会一直出现在前列,从而导致没有新的内容被关注,
他们会按照文章的票数多少和发布时间对文章进行一些逻辑处理得到对应的热度排序。
Score=(P−1)(T+2)G S c o r e = ( P − 1 ) ( T + 2 ) G
- P:投票数,-1是把自己投的过滤掉
- T:发布到现在的时间间隔,单位小时,+2防止除数太小
- G:重力加速度,它的数值大小决定了排名随时间下降的速度快慢
通俗点的例子
- 热度=(浏览量-1)/(发布到现在的时间间隔+2)乖以G的平方
列表排序由热度决定,热度是由浏览量、作品发布的时间间隔、G值共同决定
为什么这样好呢?
能够根据浏览量过滤出同时发布的一批作品集中的热度作品,因为他们的分母相同,而分子大的热度肯定大。
能够过滤出不同时间段热度高的作品,避免误差
举例:
a在1号发表了作品aa,aa被点击了101次, b在2号发表了作品bb,bb被点击了51次,在3号比较他们的热度,此处G取2 aa的热度=(101-1)/(48+2)^2 = 0.04 bb的热度=(51-1)/(24+2)^2=0.07
这里bb热度>aa热度 ,但是我们会感觉2个其实热度应该一样
当然,不同情况需要根据实际数据调整好G值,达到最优效果
Reddit的排名算法
∫(ts,y,z)=log10z+yts4500 ∫ ( t s , y , z ) = log 10 z + y t s 4500
- x : 为点赞数与被踩数之差(辅助变量)
- t : 发布时间到现在的时间间隔,单位秒
- z : 作为x和1的绝对值的最大值
y : x>0 取 1 , x<0 取 -1 ,x=0 取 0
举例:
86400/45000=1.92 一天权重调整则为1.92 10^1.92 =83 投票差要涨83倍 赞成票加分,投票差前10和接下来的100等权
从上图可以看的出来时间是最重要的权重,由于流量比较大,所以对于高赞文章有所优势,适合新闻类排序
StackOverflow 排名算法
(logQviews∗4)+Qanswers∗Qscore5+sum(Ascores)(QageInHours+1)−(QageInHours−Qupdated2)1.5 ( log Q v i e w s ∗ 4 ) + Q a n s w e r s ∗ Q s c o r e 5 + s u m ( A s c o r e s ) ( Q a g e I n H o u r s + 1 ) − ( Q a g e I n H o u r s − Q u p d a t e d 2 ) 1.5
- Qviews:问题浏览数,通过log来平滑
- Qanswer:问题回答数,有回答的题目才是好问题
- Qscore:问题赞踩差,赞的越多,问题越好
- sum(Ascores):回答赞踩差,回答的越多问题越好
- QageInHours:题目发布时间差,时间越久排名越后
- Qupdated:最新的回答时间,越新关注度越高
IMDB排名算法
(WR)=vv+m∗R+mv+m∗C ( W R ) = v v + m ∗ R + m v + m ∗ C
- R = 某电影投票平均分
- v = 有效投票人数
- m = 最低投票人数,1250
- C = 所有电影平均值
投票人数越多,越偏向于用户打分值,防止冷门电影小数人高分导致的高分
总结
这里我们只是大概的了解一下他们的公式具体含义,使用场景,具体实践还需要结合业务和场景来挑选。