Feed 流的排序算法:时间线、热度与个性化的融合排序
2026/7/23 5:29:25 网站建设 项目流程

Feed 流的排序算法:时间线、热度与个性化的融合排序

一、如果只按时间排序,用户看到的全是三天前的广告;如果只按热度,用户看不到朋友刚发的动态

Feed 流排序是一个经典的"三维决策"问题。三个维度分别是:时间(新的排前面)、热度(点赞多评论多的排前面)、个性化(用户可能感兴趣的排前面)。这三个维度天然存在矛盾。刚发出来的内容热度肯定低,按热度排就沉底了。朋友发的生活动态热度一般,但用户想看——个性化维度需要给这类内容加权。

单一维度的排序都会让用户体验变差。纯时间排序导致优质内容被淹没,纯热度排序让新内容没有曝光机会(马太效应),纯个性化排序需要准确的用户兴趣模型(冷启动困难)。所以 Feed 流排序的核心是把这三个维度融合成一个统一的排序公式,每个维度设置合理的权重。

二、排序公式的设计

一个典型的 Feed 流排序公式如下:

Score = w1 × TimeDecay(age) + w2 × Popularity(interactions) + w3 × Relevance(user, content)

时间衰减TimeDecay(age) = 1 / (1 + α × age_hours)。随着内容发布时间的增长,得分逐渐下降。α 控制衰减速度,α 越大衰减越快。对于新闻类 Feed,α 应该设大(几小时内就沉底);对于知识类 Feed,α 应该设小(好内容可以保持较长的曝光期)。

热度分Popularity = log(1 + likes + 2×comments + 3×shares)。评论和分享的权重高于点赞,因为这些操作的互动深度更大。取对数是为了抑制马太效应——如果直接用原始值,一篇 10000 赞的文章会把所有其他内容都压死。

个性化相关性Relevance = cosine_similarity(user_embedding, content_embedding)。通过用户的行为历史(看过哪些内容、点了哪些赞)学习用户的兴趣 embedding,计算与内容 embedding 的余弦相似度。

""" Feed 流排序引擎 核心公式:Score = w1 * time_score + w2 * hot_score + w3 * relevance_score 权重设定原则: - 社交类 Feed(朋友圈):w1 更高(时效性优先) - 资讯类 Feed(新闻):w1 很高 - 知识类 Feed(知乎):w2 更高(优质内容优先) - 推荐类 Feed(抖音):w3 更高(个性化优先) """ import math import numpy as np class FeedScorer: def __init__(self, w_time=0.4, w_hot=0.3, w_relevance=0.3): """ 三个维度的权重,根据业务场景调整 为什么总和是 1.0? - 让最终得分有明确的物理意义和范围 - 方便不同版本排序公式之间的效果对比 """ self.w_time = w_time self.w_hot = w_hot self.w_relevance = w_relevance def score(self, content, current_time, user_embedding=None): """ 对单条内容打分 Returns: float: 0~1 之间的得分 """ # 维度1:时间衰减 age_hours = (current_time - content.publish_time) / 3600.0 # α 设为 0.1,意味着 10 小时后得分降为原来的一半 time_score = 1.0 / (1.0 + 0.1 * age_hours) # 维度2:热度分(取对数抑制马太效应) # 对数底数影响热度分的增长速率 # 2 为基础互动:避免 log(0) 的情况 hot_score = math.log( 2 + content.likes + 2 * content.comments + 3 * content.shares ) / math.log(100) # 归一化到 0~1 # 维度3:个性化相关性 relevance_score = 0.5 # 默认值:未知用户兴趣时给中间分 if user_embedding is not None and content.embedding is not None: relevance_score = self._cosine_similarity( user_embedding, content.embedding ) # 映射到 0~1(cosine 范围是 [-1, 1]) relevance_score = (relevance_score + 1) / 2 # 加权融合 final_score = ( self.w_time * time_score + self.w_hot * hot_score + self.w_relevance * relevance_score ) return final_score def _cosine_similarity(self, a, b): """余弦相似度""" return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

三、排序后的业务规则干预

纯算法排序的结果有时候会出现不合理的现象:同一个用户连发 5 条动态,全部排在 Feed 流的前面。这会让其他内容完全没有曝光机会。业务规则干预的目的是修正算法排序中不合常理的结果。

打散规则:同一作者的内容之间至少间隔 3 条其他内容。实现方式是:遍历排序结果,如果当前内容的作者和上一条相同,则把它下沉到后面的位置。

去重规则:多个关注对象转发了同一内容,Feed 中只显示第一条,后面的去重。

置顶规则:运营指定的内容(活动公告、系统通知)强制排在第一位。

多样性规则:确保相邻的内容在类目上不同。如果连续 3 条都是同一类目,第 3 条下沉。

这些规则在执行上需要谨慎:过多的业务规则会让排序失去一致性,用户刷新时可能出现结果剧烈波动。

四、A/B 测试的评估框架

Feed 流排序的效果评估用传统指标(CTR、点赞率)是不够的。需要加入用户体验相关的指标:

  • 互动率:看到 Feed 后有点赞/评论/分享的用户比例。
  • 内容多样性:用户一次 Feed 刷新中看到的不同作者数量。
  • 停留时长:用户在 Feed 流上的停留时间(不是刷走的秒数)。
  • 长尾曝光率:粉丝少的用户发布的内容被看到的比例。

五、总结

Feed 流排序不是一个单一公式的问题,而是一个"加权融合 + 规则干预 + A/B 验证"的持续迭代过程。三维度的权重设定高度依赖内容平台的定位——社交型重时间、知识型重热度、推荐型重个性化。排序公式只是框架,后续的业务规则打散、多样性保障、效果评估,这些看似不属于算法的工作,往往比调权重对最终用户体验的影响更大。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询