用 OpenAlex 的公开发表数据,看一位导师是否倾向于在师生合著论文上挂一作。
👉 在线试用:avoidmeanboss.linkbyfree.com
纯静态网页,零后端、零依赖、零构建。全部分析在你的浏览器里完成,本站不存储任何数据。
Warning
这个工具会把一个数字放在一个真实在世的人的名字旁边。
而「抢一作」在任何数据库里都是看不见的。公开数据只能证明谁挂了一作,无法证明这篇本该属于谁。所以这个指数必然是代理指标——它可能是错的,而错的代价由被评价的那个人承担。
整个设计的重心不在于把分数做准,而在于让代理指标不误伤真实的人。这也是为什么它在很多情况下会拒绝回答。
输入导师英文姓名 → 消歧选人 → 得到:
- 抢一作指数——师生合著论文中导师挂一作的比例本身。不是黑箱加权,就是
16/384 → 4。因为分数旁边必须同屏摆着算它的原材料,而黑箱分数没法和证据对账。 - 强制证据——逐年发表曲线、师生合著逐人明细、可交互的 3D 合作网络。点开任意一位学生,看到你俩合著的每一篇论文谁挂了一作。
- 置信度——字母序学科、样本不足时拒答,而不是猜。
三个真实作者,由本仓库的代码算出(不是估算):
| 作者 | 领域 | 指数 | 结论 |
|---|---|---|---|
| Jiawei Han | CS | 4 🟢 | 384 篇师生合著中挂一作 16 篇 · 57 位学生 |
| Philip S. Yu | CS | 2 🟢 | —— |
| Terence Tao | 数学 | 拒答 | 其 276 篇三作者以上论文中 70% 按姓氏字母排序 |
Tao 那条是这个工具最重要的一次自证:数学界按字母署名,作者位置根本不表示贡献,所以本指标对他无意义。CS 的字母序比例是 5–12%,数学是 70%——两个领域之间隔着一条宽阔的空白带,而拒答阈值 0.5 落在正中。这不是拍脑袋定的,是真实数据标定的。
flowchart LR
W[导师的全部论文] --> B[信号 B<br/>生涯轨迹]
W --> C[合作者网络]
C --> P[抓合作者履历]
P --> S[学生识别]
S --> A[信号 A<br/>师生一作率]
B --> X{双信号交叉}
A --> X
X --> R[分数 + 证据 + 置信度]
信号 A(师生一作率)精确,但依赖「认出谁是他的学生」——而那是整条链最脆的一环。
信号 B(生涯轨迹)只用导师自己的发表记录,完全不需要识别学生,因而绕开了那个脆弱点,是学生识别失灵时的兜底。
信号 B 的定义有个坑值得说,因为踩过:
直觉版本是「过了巅峰期,个人发文该越来越少,抢学生一作的人则会越来越多」。实测发现字面版本会冤枉好人——Jiawei Han 的绝对一作数从 0.8/年涨到 2.2/年,按字面版本会被判「反常」。真相是他早年一年才发 2 篇、现在一年发 60 篇,产出规模变了 30 倍,绝对数根本不可跨阶段比较。
所以实现的是归一化版本 signalB = 资深期一作率 / 早期一作率。Han 归一化后是 0.128,Yu 是 0.0586——都是正常的崩塌。那行除法存在的唯一理由,就是不给一个真实的人扣上他不配的帽子。
OpenAlex 的中文姓名消歧不可靠,这是最大的问题。实测:
| 真实博士生 | 与 Han 合著 | OpenAlex 称其生涯始于 | 判定 |
|---|---|---|---|
| Xiang Ren | 86 篇(全部合作者第 1) | 2004(记录被同名者合并) | 外部同行 ❌ |
| Yizhou Sun | 70 篇(第 2) | 2001(同上) | 外部同行 ❌ |
漏掉的不是边角料,恰恰是合作最密集的第一、第二名。 而且识别对的 57 位里,有 18 位(32%) 压在容差边界上——距离被误判只差一年的数据漂移。
这个洞不能靠调参修:要捞回 Xiang Ren 就得把容差从 1 放到 9,那会把大批真正的外部同行错划成学生,等于用假阳性换假阴性。所以它靠信号 B 兜底,并且让你在证据表里手工勾选修正——取消勾选后分数和 3D 网络会实时重算。
好消息是这个缺陷主要吞掉的是证据量而非结论:把这两人手工加回后,Han 的样本从 384 涨到 458,指数仍是 4。
抓取中途失败会报错重来,而不是给你一个基于残缺数据的分数。实测:分页截断丢的是随机一批论文而非最近一批——完整 1263 篇算出生涯起点 1988,只抓到 600 篇会算出 1994(错 6 年),一路污染后续所有信号。「已抓到的先渲染」看起来体贴,实际是把残缺样本当完整结论展示,与本产品的核心原则直接冲突。
机构标签不可信:OpenAlex 把 UIUC 的 Jiawei Han 标成了 Beijing Institute of Technology。所以消歧选人页以代表作为主要线索——用代表作认人远比用机构可靠。
原始需求是用 Google Scholar。实测后否决,两条独立理由:
- 封锁——本机对
scholar.google.com的第一个请求就返回403 Sorry。机房 IP 属预先拉黑段,不是抓多了才封。 - 结构不适配(就算不封也不行)——Scholar 主页的作者行是截断的(
Y Sun, J Han, X Yan ...)。3D 合作网络需要每篇论文的完整作者列表,这要求每篇单独请求一次,一个导师就是上百次。
OpenAlex 免费、无需 key、authorships[].author_position 直接给出 first/middle/last,且完整。1263 篇论文 7 个请求约 10 秒。
不是偷懒,是加了后端产品就死了。
OpenAlex 的信用点按 IP 计(1000 点/天)。单次分析最多约 36 点。
| 架构 | 后果 |
|---|---|
| 后端代理 | 全站用户共用服务器那一个 IP → 全站每天最多约 27 次查询 |
| 浏览器直连 | 每个用户用自己的 IP → 人均最多约 27 位导师/天 |
配合 OpenAlex 的 access-control-allow-origin: *,浏览器直连是唯一可行架构。附带收益:托管成本 $0。
无构建步骤、无后端、无依赖。克隆下来就能跑(或直接用在线版)。
python3 -m http.server 8000 # 然后开 http://localhost:8000node --test # 跑测试(104 个)
⚠️ 是node --test,不是node --test test/。后者在 Node 22 上会把test/当成要require()的目录,报Cannot find module,0 pass / 1 fail。
node scripts/fetch-fixtures.mjs # 刷新测试 fixture(会消耗 OpenAlex 额度)| 模块 | 职责 |
|---|---|
src/normalize.js |
原始 JSON → 内部形状(含同一篇论文内重复作者的去重——OpenAlex 真的会这样) |
src/openalex.js |
唯一碰网络的模块:分页、额度记账 |
src/students.js |
学生识别(最脆的一环) |
src/score.js |
信号 A + 等级分档 |
src/trajectory.js |
信号 B(刻意不依赖 students.js) |
src/confidence.js |
拒答判定(伦理承诺的执行者) |
src/analyze.js |
编排:两阶段评估、渐进渲染 |
src/render/* |
选人页 / 分数卡 / 曲线 / 证据表 / 3D 网络 |
四个纯函数模块(students/score/trajectory/confidence)不碰网络,用真实数据 fixture 离线测试。
测试 fixture 的伦理约束:阴性用例用真实数据(Jiawei Han、Philip S. Yu),阳性与拒答用例一律用合成数据——绝不把任何真实在世人物标注为「抢一作导师」并提交进仓库。
docs/superpowers/specs/2026-07-15-first-author-index-design.md 与 docs/superpowers/plans/2026-07-15-first-author-index.md。
它们不只是设计文档,还是病历:记着开发过程中发现的 20 个自身 bug、每一个的实测数字、以及「为什么测试没抓到它」。其中有一节值得单独读——「真实感不等于有判别力」:同一个错误犯了五次,全都是 fixture 落在了被测参数不敏感的位置。
一个 fixture 只有落在「参数的值能改变输出」的位置上,才算测到了那个参数。 而恰恰是真实感让那五个 fixture 全都看起来是对的。
数据来源:OpenAlex。本站不存储任何数据,全部分析在你的浏览器内完成。