INTERACTIVE COMPANION · VOLUME 2, ISSUE 4 · SUMMER 2026
The Word-Counting Bench
Six of the fifty books from the study are loaded below, in six different languages, from six different centuries. Nothing here is simulated: every point on every curve is a word count, taken from the same cached Project Gutenberg text and the same fitted parameters printed in the study's raw output. The default settings on Model 1 reproduce the article's headline number for Moby-Dick exactly: \(b = 1.958\).
Model 1. Fit a book
Pick a book. The bench ranks its words by how often they occur and plots rank against count on log–log axes, exactly as the article does. Both fitted curves are computed live, in this page, by the same normalisation the Python script uses: \(p(r) = (r+q)^{-a} / Z(a,q)\) with \(Z\) the exact sum over every rank the book actually has, not an approximation.
- tokens N
- –
- word types V
- –
- hapax share
- –
- a, pure Zipf (SE)
- –
- a, Zipf-Mandelbrot / q
- –
Model 2. Six languages, six centuries, one picture
Raw counts hide the comparison, because Don Quijote has seventeen times as many tokens as Werther. So this view normalises: the x-axis is rank as a fraction of that book's own vocabulary, the y-axis is count as a fraction of that book's own tokens. Two books with the same underlying law should now trace the same line regardless of length.
What to try
Uncheck every book in Model 2 except Don Quijote and Divina Commedia, the two oldest texts here by more than two centuries, and the two Romance languages closest to each other on the list. Their curves sit closer to each other over the first two decades of rank than either sits to Seitsemän veljestä, a language from a completely different family. Then swap in Pride and Prejudice against Moby-Dick, same language, same rough century, and notice the two English curves are not obviously closer to each other than the Spanish one is to the Italian one. That is the heterogeneity result from the article's §5, in a shape you can drag.