方法
编辑部如何决定你看到什么
每一步都是确定性的,全部由本地 JSON 文件跑出:同样的输入必然得到同样的站点。这里不调用任何模型、订阅源或数据库。
演示数据
本构建里的每个机构、产品、来源和报道都是为演示虚构的。报道没有链接,因为编造的链接看起来会像真实引用。编辑部时钟冻结在 2026-03-12T09:00:00Z;所有时长、热度、趋势与新鲜度都相对它计算,因此这里的一切都不可能显得“实时”。只要有报道或来源未标记为演示,构建就会拒绝。
流程
- 校验每个来源、话题、实体、报道与人工调整;任何问题即中止。
- 去重:丢弃重复提交的条目,标记转载副本。
- 归并报道成事件,并记录每一个判定。
- 评分:在演示时钟下计算热度、趋势、状态与新鲜度。
- 编成每日期号,按规则执行。
- 渲染并审计静态站点;拒绝不安全的输出与失效链接。
运行 python3 tools/explain.py 可打印每一个判定,也可以直接读编辑日志。
重复条目与转载副本
重复条目是同一来源再次提交相同标题,通常是重新抓取。它会被丢弃,永远不计。 转载副本是另一来源在 24 小时内带有完全相同的标题与摘要,或用 via 声明了出处。它会留在事件时间线上以保留出处,但不算独立来源,因此既不加热度也不加来源数。本构建中:丢弃 1 条重复,标记 1 篇转载。
把报道归并成事件
报道按时间从早到晚处理。每一篇都与所有“最近一篇报道距今不足 14 天”的事件中的每一篇报道比较:
相似度 = 0.6 × J(实体) + 0.4 × J(用词)
J 是杰卡德指数:共同项除以全部项。用词取自标题与摘要,去掉停用词。两篇报道若没有共同实体,得分直接为零,因此仅凭措辞相近永远不会归并。得分达到 0.35 即并入最佳事件,否则这篇报道自成一个新事件。距事件首篇报道超过 24 小时到达的报道记为后续进展,更早的记为跟进报道。
0.35 这个门槛是按本演示数据定的。本构建中最低的并入得分是 0.362,最强的被拒候选是 0.283;预期的归并结果固定写在 tests/expected_events.json 里,由测试套件校验。真实数据需要用一批已标注的报道配对来定门槛。 data/overrides.json 里的人工调整在算法之后执行,且永远不会被算法覆盖;本构建有一处,记录在事件页与日志里。
实体是人工标注在演示报道上的。生产环境中它们应来自抽取步骤,候选检索也应使用向量检索,而不是两两全比。
热度
热度 = 10 × Σ 0.5距今天数 / 24 小时
求和范围是该事件的独立来源。每个来源只计入最近 48 小时内最新的一篇报道,所以一家媒体连发十条也只算一次,两天没人碰的报道会降到零。刚刚报道的来源贡献 10 分,一天后只贡献 5 分。本站的热度条在 50 分时满格。
以演示时钟下热度最高的事件为例(Orchard 3 发布:三种规模的开放权重模型):
- Orchard Labs 官方博客:19 小时前,10 × 0.519.00/24 = 5.78
- Signal Wire 通讯社:18.3 小时前,10 × 0.518.33/24 = 5.89
- Circuit Review:16.5 小时前,10 × 0.516.50/24 = 6.21
- Builders 论坛热帖:15 小时前,10 × 0.515.00/24 = 6.48
- Gradient Gazette:1.5 小时前,10 × 0.51.50/24 = 9.58
合计 33.9。这些是针对冻结时钟算出的演示数值,不是实时数据。
状态与趋势
- 新出现
- 在演示时钟前 24 小时内首次出现。
- 有后续
- 最近 24 小时内到达了一篇后续报道。
- 持续
- 最近 24 小时内又有报道,但没有后续进展。
- 较早
- 最近 24 小时内没有新内容。
趋势比较当前热度与 6 小时前的热度。升温要求至少上涨 3 且涨幅达 25%;降温要求至少下跌 3。在这 6 小时内首次出现的事件,状态记为新出现。若有参与的来源处于停滞,趋势会被标为数据不完整。
期号
每天的期号在 08:00 UTC 编成,取此前 24 小时内的报道。事件需要 2 个独立来源,或一个官方一手来源,才能成为头条;其余列为“也提请留意”。一个事件一条,按编成时的热度排序,最多 6 条。已经上过头条的事件,只有在窗口内出现后续时才会再次入选。编成时间之后的报道顺延到下一期;简报页把这类报道列在“本期之后”。
新鲜度
每个来源都声明自己的出稿节奏。最后一次检查超过 1 个间隔即为延迟,超过 3 个间隔即为停滞。简报页与来源页会如实写出,而不是让人误以为编辑部已经收全。
导出
随站点在本地生成,数据同源,每个载荷都标注为演示:
- feed.xml:RSS 2.0,每期一条。在拿到真实 HTTPS 域名之前,条目链接使用占位域名
https://news.tongjiai.icu/zh(保留域名,不可解析)。 - api/v1/index.json:列出下面的 JSON 文件。
- api/v1/events.json、api/v1/topics.json,以及
api/v1/editions/下每期一个文件。
这些是形似接口的静态文件,不是运行中的服务:没有查询参数、没有分页、没有认证。
本构建的参数
heat.window_hours | 48 |
|---|---|
heat.half_life_hours | 24 |
heat.scale | 10 |
heat.trend_hours | 6 |
heat.rising_min_delta | 3.0 |
heat.rising_min_ratio | 0.25 |
heat.series_hours | 24 |
grouping.window_days | 14 |
grouping.threshold | 0.35 |
grouping.entity_weight | 0.6 |
grouping.token_weight | 0.4 |
grouping.followup_after_hours | 24 |
grouping.syndication_window_hours | 24 |
edition.compile_hour_utc | 8 |
edition.max_items | 6 |
edition.min_independent_sources | 2 |
freshness.late_after_intervals | 1 |
freshness.stale_after_intervals | 3 |
现在能做什么,还需要什么
本构建已具备
- 校验、去重、转载识别与事件归并,附完整判定日志。
- 固定时钟下可复现的热度、趋势、状态与新鲜度。
- 按规则编成的每日期号、话题页、每事件一条时间线、搜索与筛选。
- 本地已读标记、RSS 与 JSON 导出,全部离线生成。
需要真实基础设施
- 真实订阅源与抓取调度,并按来源限速。
- 用于长期历史的数据库,文件放不下时必需。
- 用于候选检索的实体抽取与向量化,以及判断后续的模型或编辑。
- 转载任何真实来源之前的授权审查。