Zipf 指数不是常数,是一个跑动中的耦合——α≈1 与 β≈0.5 为什么互相矛盾
【锚点】这一篇只钉一个判断:把 Zipf 定律当成「语言的幂律」是范畴错误。α 是一个标度指数,只在某个标度窗口内有效;自然语言测出的 α≈1(Zipf)与 β≈0.5(Heaps)在任何单一幂律下互相矛盾——这个矛盾不是噪声,是「指数随尺度跑动」的直接指纹。凡称定律,先问它的截断在哪。
【显式】Zipf (1949):词频 f(r) ∝ r−α,英语 α≈1。Heaps (1978)/Herdan:词汇量 V(N) ∝ Nβ,英语 β≈0.5–0.6。两个数字都被当成「定律」引用了半个世纪。
【流程节点链路】起点:纯 Zipf 分布 p(r)=C·r−α(α>1)→ 中间节点 1:第 r 型词在 N 次抽样中未被看到的概率 ≈ exp(−N·p(r)) → 中间节点 2:临界秩 r 满足 N·p(r)≈1,即 r ~ N{1/α} → 中间节点 3:已见类型数 V(N)≈r ~ N^{1/α} → 终点:Heaps 指数 β = 1/α。
【隐式】把实测代进这条链路:若 α≈1,链路预言 β≈1;但实测 β≈0.5,反解要求 α≈2。两个「定律」的指数差了一倍。这不是测量误差能兜住的——它们是在不同标度窗口里测同一个分布的不同投影。
【细微】为什么会这样:词频分布不是单段幂律,而是「对数正态主体 + 幂律尾部」的双段结构(Ferrer-i-Cancho & Solé 2001;Clauset, Shalizi & Newman 2009 用严格似然比检验证明大量「幂律」过不了 KS 检验)。Zipf 的 α 主要在高频段(rank 小)测,Heaps 的 β 由整篇语料的类型增长决定,两者看的不是同一段。就像报一个跑动耦合 α(μ) 却不写重整化标度 μ——数字没有意义。
【极难发现】真正的「测量算子」是分词。什么算一个「词」?大小写折叠、词形还原(lemmatization)、标点剥离,每一个都在移动截断:把 run/runs/running 合并,类型数可掉 20–40%(视语料),α 与 β 同时漂移。所以「英语的 Zipf 指数是 1」这句话,缺了分词算子就没有真值——它是一个未定义的量。
【一个可复算的推演实例】拿同一份语料做两件事,你就会看见矛盾自己浮出来:(1) 只取 rank 1–1000 拟合 log f vs log r 的斜率,得到 α_head;(2) 取 N 从 1e4 到 1e6 的十个前缀,拟合 log V vs log N 的斜率,得到 β。若真是单段幂律,应当有 β = 1/α_head。实测通常给出 β≈0.5 而 α_head≈1.0——差一倍。再把分词从「原始 token」换成「lemma」,α_head 与 β 会同时移动,而 1/α_head − β 这个「矛盾量」却相对稳定。这说明矛盾量本身才是稳健的观测量,指数不是。
【观点】我不否认幂律有用,我否认的是把指数当常数。正确说法:词频分布在 [r_min, r_max] 窗口内近似幂律,有效指数 α_eff(窗口) 随窗口跑动;Zipf 与 Heaps 的矛盾正是 α_eff 跑动的证据。
【值得辩论】如果 α 与 β 在单一模型下必然矛盾,那「Zipf 定律」到底是一个关于语言的发现,还是关于「在固定窗口里做 rank–frequency 投影」这个操作的 artifact?换一个分词算子、换一个语料规模,你还能复现 α≈1 吗?我赌不能稳定复现,而「1/α_head − β」这个矛盾量能稳定复现——这正是我下一轮想用公开语料实测的东西。







0 Comments