信息流作为一种呈现内容的方式,天然地存在一些问题,为了更好地展示信息,满足用户需求,需要对信息流进行一些优化。笔者在本文中由牛顿冷却定律得到启发,对信息流的呈现提出了优化方法。 之前做社区类产品时,为了让用户能够及时看到一些比较热门的帖子,以及让一些新的内容能够及时呈现给用户,所以尝试了很多办法。 比如,简单粗暴地按照时间先后顺序展现帖子,最新发布的就在最上面的位置,实现起来最简单,但对用户而言一些热门的帖子就有可能沉在下面去了。 又考虑结合用户评价、浏览等其他维度的数据综合来进行评定,分别按一定权重计分,总分最高的排最上面,用这种方式的话从某种程度上确实可以实现热门帖子的曝光;但会导致的问题就是越是热门的帖子越是会被置顶,而新的帖子反而缺少了曝光的机会。 于是,只好想一些其他的办法,甚至考虑去借助算法进行实现,但在尝试去寻找成熟算法的过程中就发现,很多算法相对来说比较复杂,而且最主要的是很多算法都需要在大量的数据情况下才会得到相对准确的结果。 所以,最后思考解决这个问题的方式,便又回到帖子浏览这个事情的本质上来。站在用户的角度上,一方面当然是希望对于一些比较热门的帖子能够及时看到,但另外一方面还是希望能不断看到新的东西。 一、相关原理 上面的这种场景,概括起来就是新的内容总是会替代老的内容,而它又恰好类似于物理学当中的一个定律,它叫做"牛顿冷却定律"。 本质上它描述了高于周围温度的物体会向外散热,并逐渐降温的过程,同时单位时间内散热与周围温差会成正比关系。 而这个就跟我们前面提到的帖子的曝光情况是基本一致的,如果把帖子曝光或者排名情况想象成温度,随着时间的推移,最终帖子的排名也是会慢慢降下来。 二、影响因素 根据上面的描述,我们会发现,帖子的排名受到了几方面的因素影响: 1. 初始热度 既然是一个随着时间推移热度逐渐降低的过程,如果帖子刚被发布的初始情况下,没有一个默认的热度值,则会导致帖子没有办法降低热度;出现的结果就是大量帖子的热度是相同的,那就无法区分排名情况。 所以,对于帖子刚发布时,需要给出相应的热度,如果完全是模拟温度降温的情况,那么就可以把初始的热度设置为100,最终帖子的热度都会慢慢趋近于0,但不会等于0。 而且,由于当时我们有很多不同的内容分类展示在同一个帖子列表当中,而我们又有一些对于不同内容的初始情况下的不同展示倾向,于是便按照不同的内容分类划分了不同的初始热度值。 比如有科技、财经、体育、女性等不同类别的内容,而我们倾向的顺序是科技、女性、体育、财经,所以最终划分的初始热度值就不再都是100,而是划分成了100,90,80,70。当然,具体的数值,还是需要根据实际上线后的情况去反复的调整。 2. 用户行为 如果只是有上面提到的因素,那么可能会导致的问题就是,有很多相近或者同一时间段发布的帖子,热度值随着时间的推移降低的速度几乎是一致的,这就会导致帖子的排名也基本上是一致的,从而失去了我们做这个东西的目的。 所以为了解决这样的问题,还可以在除了初始热度以外,引入帖子被发布后用户对其产生的一些行为,常见的行为可以包括浏览、评价、收藏、分享、点赞等。 具体实现时,可以按照不同的维度划分权重,然后按照实际的数量乘以对应的权重后(比如浏览量、评价量、收藏量、点赞量、分享量分别对应的权重是10%、20%、20%、20%、30%),求总的得分,总分姑且称之为用户行为热度,计算方式为: 用户行为热度=浏览量*10%+评价量*20%+收藏量*20%+点赞量*20%+分享量*30% 3. 时间 最主要的毫无疑问是时间。 无论对于用户还是平台,显然是不希望一直是同样的内容霸占了排行榜或者帖子列表的最前面位置的,而是希望不断被更新的内容所替代,也可以称之为帖子的热度需要随时时间的推移而慢慢衰减,最好能呈现出下面这样的一种趋势: 在时间方面,除了上面提到的随时间推移的趋势,站在实际的场景上,对于任一帖子,最好是在某一定时间段之后,帖子顺序能够发生周期性的变化。 可以理解为刷新帖子热度的时间间隔,具体的间隔多少则需要根据平台的内容量来确定、如果内容较多,希望尽快呈现新的内容给用户,便可以把时间间隔设置的比较短;如果内容较少,则可以把间隔时间设置的比较长。 三、推导过程 确定了上面的影响因素,便可以参照牛顿冷却定律整理出对应的算法公式了,牛顿冷却定律的公式可以表示为: ΔT(t) / Δt = – k (T(t) – C) 其中T(t)表示温度随时间变化的函数,t表示当前的时间,C表示一个常量室温,ΔT(t)表示当前时间从开始到当前时间的温度随时间变化的差值,Δt则表示从开始到当前时间的间隔,而-k则是牛顿冷却定律概念当中单位时间内散热与周围温差会成正比关系的比值,又称之为冷却系数。 而将上面这个公式利用导函数、积分的知识,进行相应的转换变形后,可以变化如下(具体过程就不推导了,毕竟没太大意义): T = T0 x (1/e) ^(k(t-t0)) 而将上面这些变量和常量替换为产品设计当中的帖子情况时,则可以理解为,T代表着帖子当前的热度,T0代表着初始热度和用户行为热度的总和,k则代表着冷却系数,t-t0则代表间隔时间。 结合前面提到的关于初始热度和用户行为热度的计算方式,则相关公式可以为: T0 = H(Type)+ H(Action) H(Action) = action1* a% + action2* b% + action3* c% + …… H(Type)则为初始热度值,可以根据不同类型内容进行设置,H(Action)则为用户行为热度值,不同的行为有各自的权重,权重占比总额为1。 而从函数曲线上来说,k越大,则曲线越陡,意味着热度降低越快,k越小,则曲线越平缓,意味着热度降低越慢。 四、注意事项 针对一些异常情况,需要定义相关规则。在热度值恰好一样的情况下,需要定义相关的排序规则,比如按照某个单一维度或者综合维度排序。 上线后,还需要不断去监控数据情况,如果发现排名变化太快,则需要去对冷却系数进行相应的调整。 当然,为了更好的拓展相关业务,比如会在正常的帖子热度当中加入付费的排行,或者其他推广的业务,可以考虑优化公式,或者强行人工推荐,那么对于帖子内容可能就会考虑做一些不一样的帖子池的维护。