热搜算法的实际应用
  50GY8TCJlRDR 2023年11月25日 70 0

热搜算法的几种方案:

  • 简单的词频统计
  • 牛顿冷却算法
  • 高斯(正态)分布

热搜的应用

现代的互联网产品大部分拥有热搜的功能,如豆瓣、腾讯新闻、今日头条、知乎、微博、bilibili、小红书,会使用热搜的形式来推送一些热点数据,以达到吸引用户,提高信息获取效率,增加信息曝光与互动,提高用户使用产品的体验,提升用户粘性。

热搜算法

每个产品都采取不同的热搜算法,如微博的热搜更考虑短期内对热点事件的搜索量、B站的热榜会考虑时投币数,播放量,点赞量,评论量等因素......因此,在考虑热搜和热榜的算法的时候,从自己产品的特点入手,引入产品中自有的因素,如时间、搜索量、评论数、点赞数等。

热点数据的算法可以根据几个重要特征分为:1. 按时间维度;2. 按访问量(搜索量、点击量、播放量、评论量);3. 按评分;4. 以上两种或以上的综合考虑。

1、简单的词频统计

这个方案很简单,就是对于每个词统计其搜索频率。打开es的搜索日志,通过搜索日志来统计词频,词频高的也就是所要的热搜词。虽然简单直观,但是缺点也很明显,就是不能考虑时间因素,会导致某个搜索词在一段时间被大量搜索后,在随后一直占据热搜榜首,新来的搜索词无法凸显出来。

2、牛顿冷却算法

为了考虑进时间这个因素,并且热度最好随着时间跨度而下降。牛顿冷却算法就是这么一种考虑进时间因素的算法,并且能够随着时间推移,热度可以快速下降。

原理:物体的冷却速度,与其当前温度与室温之间的温差成正比。简单点说我们可以将热词排名想象成一个即自然冷却的过程。可以利用物理学定律,建立“温度”与“时间”之间的函数关系,构建一个“指数式衰减”的过程。可用以下式子表示:

热搜算法的实际应用_正态分布

其中w_freq表示词频,△t表示时间差。为了避免除数为0,结果出现负数的情况,以及实现随着时间差越大,热度下降越快的效果(最后趋于0),笔者对上式进行改造。得到如下式子:

热搜算法的实际应用_搜索_02

为了能够更加直观的表示,笔者尝试用上面的公式绘制了下图:

热搜算法的实际应用_搜索_03

上图中,词频取区间[0-1000],时间差为[0-6]天。我们可以看到,词频越高最后的分数也就越高。且随着时间差越大,分数也能够快速下降。达到了符合笔者期望的结果。

牛顿冷却算法虽然达到了笔者最初的预想效果,但是本算法在计算热度的时候,前一两天的热度分数会比较高,而后面下降得太快,可能会导致无法很好考虑最近连续几天都出现的搜索词。

代码(Go版):

// NewtonsLawOfCooling
// 本算法是以牛顿冷却定律为基础,根据兔小巢热搜词的特点,改造出来的搜索词热度计算算法
// 原公式及原理:见参考文献
// @param: temperature 温度,即单词出现的频率,单位:次
// @param: deltaTime 时间差,单位:天
func NewtonsLawOfCooling(temperature float64, deltaTime float64) float64 {
  deltaTime += 1.0                                          // 加1,避免时间作为除数的时候为0
  index := 4.0                                              // 幂指数,index数值越大,随着时间差越大,最终结果会下降得更快
  deltaTime = math.Pow(deltaTime, index)                    // 求幂
  result := math.Log((temperature + deltaTime) / deltaTime) // 取对数,使得结果更平滑一些
  return result
}

3、高斯(正态)分布算法

上面的牛顿冷却算法有个小问题就是下降过快,如果对于某个产品,最近几个小时或者最近几天的热度都比较重要,那么牛顿冷却算法可能不再适用。因此,可以考虑引入高斯(正态)分布算法来解决这一问题。

原理:从统计学的意义上来看,很多数据的分布都会遵循类似下图的概率分布。其公式为:我们可以将某天中的一个词的搜索频度看作一个在时间跨度上的正态分布,也就是热度看作词频乘以一个时间跨度上正态分布概率,再做稍微改造得到下式:

热搜算法的实际应用_正态分布_04

热搜算法的实际应用_词频_05

我们可以将某天中的一个词的搜索频度看作一个在时间跨度上的正态分布,也就是热度看作词频乘以一个时间跨度上正态分布概率,再做稍微改造得到下式:

热搜算法的实际应用_词频_06

上式中w_freq是词的搜索频次、△t表示时间跨度以及△t_max表示数据中最大的时间跨度。取词频为[0-1000]、△t为[0-7]、△t_max为7,依据上述公式,可以绘制如下图:

热搜算法的实际应用_词频_07

对比牛顿冷却算法,可以从图中看到前几天热度随时间下降得更加平缓。

代码(Go版):

// GaussianDistribution 高斯分布(正态分布)
// 本算法是利用高斯分布算法来计算热搜,相对于牛顿冷却算法,前面几天的热度下降会比较缓慢
// 原公式及原理:见参考文献
// fr=aladdin
// @param: frequency 温度,即单词出现的频率,单位:次
// @param: deltaTime 时间差,单位:天
// @param: deltaMaxTime 最大时间差,比如计算最近两个月的热搜词,那么该值应该是60.0 单位:天
func GaussianDistribution(frequency float64, deltaTime float64, deltaMaxTime float64) float64 {
  index := 2.0                                       // 幂指数,index数值越大,随着时间差越大,最终结果会下降得更快
  x := -math.Pow(2*deltaTime/deltaMaxTime, index)    // 自然数e的幂指数
  distribution := math.Pow(math.E, x)          // 求高斯分布值
  return frequency * distribution                    // 返回结果
}

牛顿冷却算法和高斯分布算法实验比较

假设以下是某产品一周的搜索记录:

热搜算法的实际应用_词频_08

计算结果(按得分从高到低):

热搜算法的实际应用_正态分布_09

分析上面的结果,最明显的是支付失败常见问题两个搜索词在不同算法下,其最终热度也是不一样的。可以看出牛顿冷却算法更加考虑最近一天的数据,对于时间跨度较长的搜索词,其计算出来的分数下降得比较快。而高斯分布算法会将近几天的搜索量的热度提高,这点在常见问题支付识别热度得分高近两倍可以比较明显的看出。

其他的如时间干预法,反对票算法(适用于有点赞和踩的产品)、贝叶斯平均法(适用于避免某个因素对最后影响过大)、今日头条热榜算法等。

不同的业务,具有不同的特征,因此读者在设计热搜算法时应该从产品业务的客观特征出发,选用或设计更符合产品特征的热搜算法。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月25日 0

暂无评论

推荐阅读
50GY8TCJlRDR
作者其他文章 更多