← 全部文章

阅读时长该怎么算

200 词每分钟是英文语料的经验值。中文没有空格,按空格分词会把三千字的文章算成两分钟。

一只特立独行的熊猫 · · 约 2 分钟读完 · · #writing #javascript

几乎每个博客都显示「5 分钟读完」。这类数字大多来自一个流传很广的公式:总词数除以 200。

这个 200 出自英文阅读研究,针对的是以空格分词的语言。直接搬到中文内容上,会得到一个严重偏低的结果——因为按空格切分,一整段中文可能会被算成一个「词」。

两种语言,两种计量单位

中文的信息密度和英文不同。一个汉字承载的信息量,大致相当于英文的零点几个词。要得到可比较的数字,得先把两种字符折算到同一个量纲上。

我的做法是:汉字按字计,英文按词计并乘一个折算系数

export function readingMinutes(body: string | undefined): number {
  if (!body) return 1;

  // 汉字逐字计数
  const cjk = (body.match(/[\u4e00-\u9fa5]/g) ?? []).length;

  // 连续的字母/数字算一个词
  const latin = (body.match(/[A-Za-z0-9_'-]+/g) ?? []).length;

  // 一个英文词的信息量约等于 1.6 个汉字
  const total = cjk + latin * 1.6;

  // 中文阅读速度取 380 字/分钟
  return Math.max(1, Math.round(total / 380));
}

Math.max(1, ...) 是必要的。一篇两句话的短文不应该显示「0 分钟读完」。

关于那个 380

这个数字来自中文阅读速度的常见测量区间(每分钟 300 到 500 字),取中位数偏保守一点。它不是精确值,也不可能是——同样的文字,读技术文档和读叙事散文的速度差一倍。

值得一提的是另一个更重要的偏差:代码块会显著拉长实际阅读时间。一段三十行的代码,按字数可能只贡献二十个字,但理解它需要的时间远超读一百字的散文。想更准的话,可以给代码块一个额外权重:

const codeBlocks = (body.match(/```[\s\S]*?```/g) ?? []).length;
const total = cjk + latin * 1.6 + codeBlocks * 120;

我没有这么做。因为一旦开始调权重,就会想继续调——表格要不要算?图片要不要算?引用呢?

它的实际用途

我最终接受了这个数字只是个量级提示。它回答的不是「你需要几分钟」,而是「这是一篇短文还是长文」。

读者真正用来判断要不要读的,是标题和摘要。阅读时长只是让「要不要现在读」这个决定多一个参考——三分钟的可以在等电梯时看完,十五分钟的要留到有时间的时候。

把这个数字用到这个程度就够了。再精确下去,投入的复杂度会超过它带来的价值。

全文完