数据说明:本文 Star 数字取自 2026 年 11 月 6 日 GitHub API 实测快照;知识点/边/题库统计引自仓库 README 中
scripts/validate.py的实际输出(2026-10-23),功能与规则描述以 README 及 diagnose 子目录文档原文为准,未作虚构。
孩子数学考砸了,家长的第一反应通常是"哪里没学会";而真正难的问题是------不会一元二次方程,到底是哪节课埋的雷 ?市面上的学习类产品大多用"知识点标签 + 答对率"粗粒度地猜,猜不准就多推题,孩子越刷越烦。xiaoyang111222/cn-math-taxonomy 用一张开源知识图谱给出了另一种答案:答错一道高中题,系统会沿先修关系一路回溯,从高中、初中一直追到具体的小学知识点,把"没学会"定位到那一节课。
这个项目 10 月 18 日创建,19 天 Star 冲到 6,854(日均约 360),对齐教育部课标与人教版教材,覆盖数学、语文、科学、英语、物理、历史、地理、生物、化学九大学科,自带约 1.16 万道题的自适应诊断工具,纯静态、可离线运行。值得一提的是它的透明度:README 开篇就把"对齐依据"逐条列出,甚至标注"九下目录非官方、待核"------数据项目敢自我暴露不确定性,反而是可信度的来源。
一、项目概览:它到底有多大
先看规模(README 中 validate.py 的实际统计输出):
| 维度 | 数量 |
|---|---|
| 知识点总数 | 约 2,615(数学 870 + 英语 761 + 物理 269 + 科学 222 + 语文等) |
| 先修边总数 | 约 3,003 条(hard 约 1,808,soft 约 1,195) |
| 课标条目映射 | 627 条(数学 314 + 英语 116 + 物理 197) |
| 题库 | 数学 3,627 + 英语 3,164 + 语文 2,728 + 物理 1,076 + 历史 536 + 生物 264 + 地理 236 等 |
| 图谱根节点 | 9 个(带 root_reason),末端节点 320 个,平均先修 1.60 条 |
项目元信息:仓库创建于 2026-10-18,Python 脚本 + 纯静态前端,协议为 CC BY-NC 4.0(个人学习、教学、研究免费,商业使用需单独授权),提供 math.pansgo.com 在线试用和 GitHub Pages 备份,支持 PWA 离线使用。
二、数据工程:把课标和教材"焊"进 JSON 有多难
这个项目真正的价值不在代码量,而在数据工程的克制与严谨 。核心只有两个文件:topics.json(知识点节点)和 dependencies.json(先修边),但字段设计处处是细节:
- 稳定 ID 三套体系不混用 :初中
cnm_001、小学cnm_p001、高中cnm_h001,英语独立cne_*前缀;旧 ID 变更有id-aliases.json兼容表,避免引用失效; - hard/soft 双档先修边:数学 1,459 条先修边中 hard 1,220 条(不懂先修就没法学)、soft 239 条(有帮助但非必需)。诊断时 hard 先于 soft 回溯,这个分级直接决定了算法的出题顺序;
- 课标逐条映射 :627 条课标(数学 314、英语 116、物理 197)挂到知识点上,附带
docs/standards-mapping.md说明映射规则、覆盖率与未映射清单------把"对齐课标"从一句口号变成了可校验的工程产物; - 教材版本精细到小节:人教版新版教材调整时,一至六年级先修边随之多轮增补(README 按日期记录了每轮 +9、+14、+46 条的调整明细),甚至标注"九下目录非官方、待核"这类不确定性;
- 校验先行 :
scripts/validate.py(仅标准库)输出全量统计,题库答案经过自动核验加独立第二遍盲解复核,裁决与修正记录都在verification_report.json和second_pass_log.json里留痕。
每个知识点还带 domain(数与代数/图形与几何等)、grade、semester、chapter(精确到"七上 第一章 有理数 1.2.1")、type(procedural/conceptual/reasoning/application/modeling 五类)------数学 870 个点按类型分布为 325/232/129/77/39。这种粒度让"按教材章节刷题"和"按能力类型组卷"都成为可能。
跨学科的细节也处理得很干净:九个学科不是硬揉成一张大图,而是各自成图、只在必要时连边------英语单独成图不和数学连边,初中英语连回小学英语;物理用到数学知识时写在知识点的 mathLinks 字段里,不算先修边。全图只有 9 个带 root_reason 的根节点(数学、英语、初中物理的起点),平均每个知识点先修 1.60 条,说明图是稀疏、可遍历的,而不是一团乱麻。
三、自适应诊断:一套人人可读的回溯算法
diagnose/ 子目录是基于这份数据的静态诊断页面,规则在 README 里写得明明白白:
| 场景 | 判定与动作 |
|---|---|
| 同一知识点连续答对 3 题(可选 2/3/5) | 视为掌握,跳过其全部祖先 |
| 答错 | 出一道同级或更容易的确认题 |
| 确认题也错 | 判为薄弱,沿先修边回溯(hard 先于 soft) |
| 确认题答对 | 标为「不稳」,不回溯 |
| 每个知识点 | 最多问 2 题(第五轮修订后的克制设计) |
部署体验只要三条命令:
bash
git clone https://github.com/xiaoyang111222/cn-math-taxonomy
cd cn-math-taxonomy
python3 -m http.server 8000 # 访问 http://localhost:8000/diagnose/,演示 ?target=cnm_221&demo=1
这套规则里最有价值的是"确认题"环节:它把粗心 和真不会区分开了------答错未必是知识缺失(可能看错题),只有确认题也错才定性薄弱并回溯;确认题答对只是标「不稳」,记录但不武断。结果页输出四样东西:薄弱根因(回溯到的最早问题点)、不稳知识点清单、按年级从低到高排列的学习路径(同年级内先修在前)、相关课标条目原文,外加一张 Cytoscape + dagre 画的路径图(两个库随仓库分发,无需联网)。进度存 localStorage 可导出 JSON、打印或生成分享图。
工程上同样值得圈点:诊断核心算法在 diagnose/engine.js,写成浏览器与 Node 通用的纯函数,配套 node tests/test_engine.js 测试;用户数据只存本机 localStorage(孩子档案、错题盲区、一键再测),默认不发任何统计请求------这个"数据不出浏览器"的隐私姿态在教育类产品里尤其加分。
四、给开发者的可操作建议
- 要复用数据,先看清协议。CC BY-NC 4.0 允许个人学习、教学、研究免费使用,但付费课程、收费 App、机构服务属于商业使用,需按 README 的联系方式单独授权。拿它做公益工具或自家用没问题,别直接塞进商业产品。
- 做知识图谱类产品,抄它的 schema 作业 。稳定 ID 前缀分域、id-aliases 兼容旧引用、hard/soft 边分级、课标条目落
standards字段、映射规则与未映射清单写成文档------这五件事决定了知识图谱能不能长期演化而不烂尾。 - 借鉴它的质量控制流程。数据项目的可信度不靠"我觉得对",而靠 validate.py 这类可重复校验脚本加上题库的双遍盲解复核留痕。任何标注型数据集(标注、翻译、题库、规则库)都值得套这套流程。
- 纯静态 + localStorage 是教育工具的优解。零后端、零数据上传,意味着零隐私合规负担和近零部署成本(README 给了 Cloudflare Pages 部署路径),离线 PWA 还能覆盖无网环境。算法写成熟函数,Node 与浏览器共用一套测试。
五、结语
在 AI 生成内容刷榜的当下,cn-math-taxonomy 的走红路径很"反潮流":没有模型、没有发布会,靠的是把人教版教材一册一册对齐、把先修关系一条一条标注的笨功夫,以及 validate.py 和双遍复核撑起来的可信度。6,854 Star 里有教师、家长,也有做自适应学习产品的工程师------前两者找到了工具,后者找到了一份教科书级的数据工程范本。它也再次证明:教育科技的壁垒往往不在算法,而在数据。项目仍在按日期滚动迭代(README 的变更日志精确到天),使用前以仓库最新文档为准;本文数据快照为 2026-11-06,统计口径为 README 中 2026-10-23 的 validate.py 输出。