Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

55 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

抢一作指数

用 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[分数 + 证据 + 置信度]
Loading

信号 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。所以消歧选人页以代表作为主要线索——用代表作认人远比用机构可靠。

为什么是 OpenAlex 而不是 Google Scholar

原始需求是用 Google Scholar。实测后否决,两条独立理由:

  1. 封锁——本机对 scholar.google.com第一个请求就返回 403 Sorry。机房 IP 属预先拉黑段,不是抓多了才封。
  2. 结构不适配(就算不封也不行)——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:8000
node --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.mddocs/superpowers/plans/2026-07-15-first-author-index.md

它们不只是设计文档,还是病历:记着开发过程中发现的 20 个自身 bug、每一个的实测数字、以及「为什么测试没抓到它」。其中有一节值得单独读——「真实感不等于有判别力」:同一个错误犯了五次,全都是 fixture 落在了被测参数不敏感的位置。

一个 fixture 只有落在「参数的值能改变输出」的位置上,才算测到了那个参数。 而恰恰是真实感让那五个 fixture 全都看起来是对的。


数据来源:OpenAlex。本站不存储任何数据,全部分析在你的浏览器内完成。

About

用 OpenAlex 公开数据看导师是否倾向于在师生合著论文上挂一作。纯静态零后端,分数即百分比本身,字母序学科与样本不足时拒答而非猜测。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages