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 衡量一个词在文档中的重要性,等于词频乘以逆文档频率。某词在当前正文出现多、却在全库出现少,说明它区分度高、权重高。系统用它给热点打标签,并计算与用户兴趣向量的相似度。
- 对正文分词,统计每个词在当前文档的词频 TF;
- 统计包含该词的文档数,算 IDF = log(总文档数 / 含词文档数);
- 词权重 = TF × IDF,取 Top-N 作为该热点的关键词;
- 把多文关键词向量聚簇,向量相近即判为”同一事件”的不同来源,辅助去重。
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 越大内容掉榜越快、榜单更新越频繁;调小则老内容停留更久。