热点排序算法设计方法详解(TF-IDF 与时间衰减打分实战)

AI 热点监控工具把采集到的内容按”热度得分”排序展示,核心是用一个可解释的打分函数,平衡互动量、时效性与内容质量。项目参考 Hacker News 的重力衰减模型,热度 = 互动量 / (时间+2)^G,再叠加 TF-IDF 提取的关键词权重与质量系数,让新内容有曝光机会、老内容自然下沉,而不是被历史爆款长期霸榜。

一、排序要平衡哪几个维度

排序不是单纯比票数。投票多的内容未必值得推,刚发布的内容也需要冷启动流量。系统把打分拆成四个维度:

维度 衡量方式 起的作⽤
互动量 转发/评论/点赞加权求和 反映受欢迎程度
时效性 距发布经过的小时数 控制新鲜度衰减
内容质量 标题分 + 正文分 抑制标题党与低质
领域多样性 领域权重 V 提升榜单多样性

互动量决定基础热度,时间因子决定衰减速度,质量系数与领域权重做纠偏,四者相乘或相除得到最终得分。

二、时间衰减:重力模型

Hacker News 的排序公式足够简洁且有效:Score = (P-1) / (T+2)^G。其中 P 是得票数,减 1 用于剔除作者自投的一票;T 是从发布至今的小时数,加 2 防止新帖分母过小;G 是重力因子,默认 1.8,值越大内容掉榜越快。

import math, time

def hn_score(votes, created_ts, gravity=1.8):
    t = (time.time() - created_ts) / 3600.0  # 换算成小时
    return (votes - 1) / math.pow(t + 2, gravity)

Reddit 采用对数削弱大票仓的影响:Score = log10(|ups-downs|) + sign * order / 45000,时间项用秒计,新帖天然获得更高基线分。两种思路可组合:互动量取对数防刷票,时间取幂次做衰减。

三、用 TF-IDF 提取关键词权重

TF-IDF 衡量一个词在文档中的重要性,等于词频乘以逆文档频率。某词在当前正文出现多、却在全库出现少,说明它区分度高、权重高。系统用它给热点打标签,并计算与用户兴趣向量的相似度。

  1. 对正文分词,统计每个词在当前文档的词频 TF;
  2. 统计包含该词的文档数,算 IDF = log(总文档数 / 含词文档数);
  3. 词权重 = TF × IDF,取 Top-N 作为该热点的关键词;
  4. 把多文关键词向量聚簇,向量相近即判为”同一事件”的不同来源,辅助去重。
from collections import Counter
import math

def tfidf(docs):
    n = len(docs)
    df = Counter()
    for d in docs:
        for w in set(d):
            df[w] += 1
    scores = []
    for d in docs:
        tf = Counter(d)
        vec = {w: (tf[w] / len(d)) * math.log(n / df[w]) for w in tf}
        scores.append(vec)
    return scores

TF-IDF 不依赖训练数据,部署成本低,适合做实时热点关键词提取与事件聚簇。

四、综合打分函数

把各维度收敛成一个分数,常用形式:S = C × V × CH × P / (T+2)^1.1。C 是内容得分(标题分与正文分加权),V 是领域得分,CH 是同作者连续上榜的衰减因子,P 是互动得分,分母做温和时间衰减。

def hotspot_score(C, V, CH, P, created_ts, gravity=1.1):
    t = (time.time() - created_ts) / 3600.0
    return C * V * CH * P / math.pow(t + 2, gravity)

内容得分 C 可由标题质量与正文信息密度加权得出,标题党或正文过短都拉低 C;领域得分 V 给小众领域加权,避免榜单被少数过热领域垄断。

权重标定不能拍脑袋。系统先用历史点击数据做离线回放:固定一组候选参数,回放过去一周的热点流,看哪种参数下”被推上去的内容”后续互动更高,就往那个方向调。在线阶段再保留小流量做 A/B,确认新参数不伤害长尾曝光。这套闭环让排序公式随业务演进,而不是上线一次就锁死。

4.1 重力因子怎么调

重力因子 G 不是技术常量,而是”社区节奏控制器”。新闻类平台取 G≈1.0 追求时效,技术问答类取 G≈2.0 保留经典内容。系统按榜单更新频率反向标定 G:希望榜单每小时大换血就调大,希望长尾内容多停留就调小。

常见问题(FAQ)

Q1:为什么分子要减 1?

剔除作者自己投的一票,避免新帖靠自投虚高;也是 HN 公式的通用惯例。

Q2:TF-IDF 能识别同事件吗?

可把多文关键词向量聚簇,向量相近即判为同一事件不同来源,辅助去重。

Q3:重力因子 G 调大会怎样?

G 越大内容掉榜越快、榜单更新越频繁;调小则老内容停留更久。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 qiqicto@qq.com 举报,一经查实,本站将立刻删除。
赞 (0)
小码农的头像小码农认证作者

相关推荐

返回顶部