项目复盘 · 2022
学科关系实验室:在论文与百科网络中观察知识结构
一个持续四年演进的研究可视化前端,用学术论文与百科链接网络探索学科距离、结构熵、小世界、幂律和颠覆性等指标。
学科之间的关系很难只用分类树表达。计算机科学与统计学可能共享大量论文引用,医学与材料科学可能通过某个新技术突然靠近;百科条目之间的链接也会形成不同于正式学科目录的知识结构。
subject-relevance 项目把这些问题做成可交互的可视化实验平台。它同时使用学术论文图谱和百科链接数据,从网络结构、距离、引用和时间变化等角度观察学科之间的关联。
从一棵学科树扩展到多种网络视角
代码包含学术领域树、论文网络和百科分类树浏览页面,也提供节点与连线数据的交互展示。用户可以从学科层级进入具体分析,而不是直接面对一张无法解释的巨大关系图。
项目逐步加入度分布、小世界、PageRank、Zipf 分布、内部引用比例、学科距离、结构熵、网络熵和颠覆性指标,并按年份比较变化。一些页面还使用桑基图、气泡图和漏斗等形式展示流向与构成。
这些指标回答的是不同问题:度分布描述连接集中程度,小世界指标观察局部聚集与全局距离,PageRank 近似网络中的结构重要性,熵衡量分布或结构的不确定性,颠覆性指标则试图描述后续工作是延续还是绕过既有知识。它们不应被合并成一个笼统的“学科相关度”。
页面实际传递了哪些实验条件
接口层表明,图表并非只传一个学科名称。典型实验会同时提交目标学科、参照学科、起止年份、入边和出边下限、D 值上限、固定节点数或百分比上限,以及结果小数精度。距离实验还区分引用方向、是否去除零引用论文、是否只保留引用量头部样本,以及只使用某个截止年以前的关系。
这些参数决定了网络本身,而不只是图表外观。例如去掉零引用节点会改变度分布和平均距离,节点数上限会改变连通结构,linksin 与 linksout 回答的是相反方向的问题。现有界面把这些条件做成可调整控件,体现了研究工具的价值;但下载结果或截图没有自动携带完整参数,离开页面后很难复核。
请求被分发到三个数据服务,浏览器也为不同数据域建立三套持久缓存。缓存键是完整请求对象的序列化值,以数据库版本号人工失效。这能避免重复运行昂贵查询,却没有过期时间、数据集版本或服务端算法版本;后端数据更新后,旧结果仍可能被长期展示。个别请求的超时时间被放宽到近似无限,也说明历史计算可能很重,但会把服务故障表现为页面一直等待。
哪些算法真的在浏览器中执行
源码可以确认一组客户端计算,而不是只能看到图名:
- 多条学科距离曲线按年份逐列求算术平均,生成可暂存的平均距离曲线;
- 节点规模先开立方,再映射到固定视觉范围,避免头部学科吞没小节点;
- 网络载入 Graphology 后计算连通分量,支持识别孤立子图;
- 度分布横轴可转为十进制对数,小世界页面计算网络规模与聚类量的对数比值;
- 三维网络根据节点到原点的距离平移标签,并让相机沿圆周旋转;
- 图表注册表把请求函数、参数控件、响应转换与图表模板绑定,使一批指标页面可以由配置生成。
下面的源码节选(已脱敏)来自论文网络页面。它按边权排序后逐条加边,并只在连通分量数量下降时记录阈值,从而得到“边逐渐加入时,网络何时合并”的曲线;与界面无关的部分已省略:
links = links.sort((x, y) => x.weight[weightId] - y.weight[weightId])
const graph = new Graph()
for (const { id } of nodes) {
graph.addNode(id)
}
let previousCount = nodes.length
for (const link of links) {
graph.addEdge(link.source, link.target)
const components = connectedComponents(graph)
if (components.length < previousCount &&
maxComponents >= components.length) {
samples.push([components.length, link.weight[weightId]])
previousCount = components.length
}
}
result.push(samples)与此同时,颠覆度、Google 距离、PageRank 和熵的主体计算并不在该仓库。熵页面加载的静态 JSON 已包含结果,前端只做层级、底数和序列选择;距离页面消费服务端返回矩阵。因而,“前端能展示某指标”只能证明接口和结果曾存在,不能证明公式、原始边或离线脚本可从当前代码复算。
同一个指标需要多个版本验证
仓库中同类页面存在多个年份和版本,例如 2019、2020 及后续修订,也保留多版直接网络、距离、Zipf 和百科结构页面。大量迭代说明分析方法在持续实验,而不是一次冻结的正式产品。
这种演进有研究价值,但也增加解释风险。若页面只显示最新图表,使用者可能不知道节点范围、边权、时间窗口、孤立点处理和归一化方法已经改变。每个图表应绑定数据版本、算法定义、参数和生成脚本,并在方法变化时保留可比较的旧结果。
可视化平台逐渐承担研究记录
除了图表,项目还有笔记板、待办、评论、目录和数据表等组件。这表明工具从纯展示页逐渐向研究工作台演进:分析者可以记录解释、整理任务并查看底层数据。
如果研究记录与图表状态绑定,复盘时就能知道一条判断基于哪个年份、筛选条件和算法版本。现有代码能够确认这些界面组件存在,但不足以证明协作权限、持久化和引用链均已完整实现。
静态数据让演示稳定,也带来版本负担
仓库直接保存多批 JSON 数据,包括学科节点与边、百科网络、论文数量、结构熵和颠覆性趋势。这样可以让页面独立演示,减少后端依赖,却会让大文件、代码和分析结果在同一仓库中不断增长。
更可持续的结构应把原始数据、派生数据和展示配置分开:数据集拥有校验和与版本,计算脚本可重复运行,前端只获取发布后的结果清单。否则一次看似简单的图表修复,可能悄悄携带一套不同口径的数据。
静态文件自身也保留了演化痕迹:节点与入边、出边按年份拆分,百科学科网络又按层级、是否连通和生成日期形成多份近似数据。它们让历史实验仍可打开,却缺少统一 manifest 将文件与生成提交、输入摘要、边定义和算法版本绑定。文件名中的版本后缀只能提示“不同”,不能解释“差在哪里”。
项目留下的经验
- 学科关系不是单一分数,应分别解释层级、引用、距离、结构和时间变化。
- 每张研究图表必须绑定数据范围、算法版本、参数和生成时间。
- 同类指标的多个实验版本应保留方法变更记录,并提供可比性说明。
- 原始数据、派生结果与前端资源应分离管理,使用校验和保证发布一致。
- 笔记和评论只有关联到具体数据与视图状态,才能成为可复核的研究记录。
- 网络指标适合提出问题,不能脱离领域知识直接得出学科价值判断。
- 缓存键必须包含数据集与算法版本,并提供主动失效和结果来源说明。
- 导出图片、数据或研究笔记时,应同时固化所有筛选参数和视图状态。
- 三维图需要覆盖空网络、单节点、相同权重和超大连通分量等边界测试。
证据边界
该项目没有明确对应的 Jira Key 或专属 Confluence 空间。GitLab 仓库有 641 次提交、182 个文件,时间从 2018 年 12 月延续到 2022 年 9 月;代码包含 Vue 前端、少量 Python 演示脚本和多批静态 JSON 数据。
仓库 README 仍保留另一项目名称和通用搭建说明,显示它可能从既有前端工程演化而来。当前证据缺少正式需求、数据生成流水线、后端实现、验收记录和线上使用指标。本文据此确认长期开展的研究可视化实验,不把任何单一图表视为经过同行评审的研究结论,也不推定所有页面构成统一发布版本。