Skip to content

评分设计

当前评分模型组合了四类信号:

  • 总反向依赖包数
  • 180 天滚动窗口内的近期反向依赖数
  • 可选的下载量快照
  • 基于最新发布时间的活跃度乘数

为什么使用这些信号

  • 总反向依赖代表已经形成的生态采用度。
  • 近期反向依赖用于捕捉新增集成速度,而不只看历史积累。
  • 下载量在可用时提供额外的人气线索。
  • 发布时间乘数用于抑制长期停更包长期霸榜,但不会让“新”成为唯一优势。

当前公式

text
score =
  (ln(dependents + 1) * 38
   + ln(recent_dependents + 1) * 27
   + ln(downloads + 1) * 22)
  * activity_multiplier(days_since_release)

这里使用对数是为了压缩超大包的量级差异,避免榜单退化成单纯的依赖数排序。

当前活跃度乘数

  • <= 30 天:1.12
  • <= 90 天:1.06
  • <= 180 天:1.00
  • <= 365 天:0.94
  • > 365 天:0.88

分档与动量标签

分档是对分数的粗粒度映射:

  • S >= 260
  • A >= 180
  • B >= 110
  • C >= 50
  • D < 50

动量标签规则由 MoonBit 导出,并在 Python 构建流程里物化为服务层数据:

  • Rising:增长值 >= 35、增长比 >= 0.35、近期反向依赖 >= 3
  • Hot:增长值 >= 18、增长比 >= 0.18、近期反向依赖 >= 2
  • Stable:其余情况

因此动量标签会作为索引与服务层数据持久化,但规则定义以 MoonBit 为准。

数据流

  1. scripts/build_index.py 从本地 MoonBit 注册表快照读取 *.index 记录。
  2. 构建器在 SQLite 中重建 packages、versions、dependencies、package_edges 和全文检索索引。
  3. Python 管线通过本地 MoonBit CLI 计算评分快照、等级标签、活动系数和动量标签。
  4. src/score 对外暴露评分、等级和动量相关逻辑,src/cli 通过本地 CLI 形式把这些规则提供给 Python 构建流程。
  5. lib/query.ts 定义了服务端与前端共用的查询 AST、原生表达式解析器、序列化器和兼容辅助逻辑。
  6. Next.js 应用读取生成后的 SQLite 数据库,提供榜单、搜索、图形化高级检索和包分析页面与 API。

实现约束

仓库当前让 Python 保留索引与 SQLite 物化职责,但将评分快照、等级映射和动量 分类规则集中到 MoonBit,并通过本地 CLI 供构建流程调用。