Methodology and tests
Every number on this site comes from three small JavaScript files that run in your browser. The build runs the same files through a test suite each week; this page shows the results of the latest run (2026-11-01).
Summary
| Syllable counter, hand-checked list | 346/354 (97.7%) | Rules alone: 93.2% |
|---|---|---|
| Readability references | 7/7 pass | Published worked examples and a published score |
| Counter edge cases | 33/33 pass | Emoji, CJK, hyphens, numbers, abbreviations |
| X and SMS counts | 21/21 pass | twitter-text v3 weights, GSM-7 and UCS-2 |
| Passive-voice finder | precision 96.6%, recall 90.3% | 61 labelled sentences |
| Words-per-page model | 1.75% mean error | Against LibreOffice Writer, 30 layouts |
Words, characters, sentences, paragraphs
- Words. A word is a run of letters or digits. Internal apostrophes and hyphens keep it together ("don't", "well-known"), as do full stops, commas and colons between digits ("3.50", "1,000", "10:30"). Initialisms written with full stops ("U.S.", "e.g.") are one word. A web address or email address is one word. Dashes, slashes and spaces separate words. Each Chinese or Japanese character counts as one word, which matches how Microsoft Word's total behaves; Korean words are separated by spaces and counted normally. Emoji are not words.
- Characters. We count what a reader sees as one character (Unicode grapheme clusters, using your browser's
Intl.Segmenter). A family emoji made of five code points is one character, and so is "é" typed as "e" plus a combining accent. The character counter also shows UTF-16 code units and UTF-8 bytes, which some platforms count instead. - Sentences. A sentence ends at
.,!,?or…followed by a space and a word that does not start in lowercase, or at a Chinese or Japanese full stop. Titles such as "Dr." and "Mrs.", single-letter initials and list numbers ("1.") do not end a sentence. A line break ends a sentence unless the next line starts in lowercase, so headings and list items count as sentences and hard-wrapped prose does not split. - Paragraphs. Blocks separated by a blank line. If the text has no blank lines, each line is a paragraph.
- Reading and speaking time. Words ÷ 238 per minute (average silent reading of English non-fiction; Brysbaert, 2019, Journal of Memory and Language 109) and ÷ 130 per minute (a measured presentation pace; our choice, adjustable in the calculator).
Edge cases
| Text | Expected | Got | Note | |
|---|---|---|---|---|
Hello, world. | words 2, chars 13, sentences 1 | words 2, chars 13, sentences 1 | pass | |
Don't stop. | words 2, chars 11 | words 2, chars 11 | pass | contraction = 1 word |
A well-known e-mail. | words 3 | words 3 | pass | hyphenated words = 1 word |
self‐aware | words 1 | words 1 | pass | Unicode hyphen U+2010 |
pre- and post-war | words 3 | words 3 | pass | |
It costs $3.50, or 1,000 yen. | words 6 | words 6 | pass | 3.50 and 1,000 are one word each |
Meet at 10:30 today. | words 4 | words 4 | pass | |
The U.S. Army arrived. Dr. Smith left. | words 7, sentences 2 | words 7, sentences 2 | pass | initialisms and Dr. do not end sentences |
J. R. R. Tolkien wrote books. | words 6, sentences 1 | words 6, sentences 1 | pass | initials |
Use a pen, e.g. a quill, i.e. a feather. | words 9, sentences 1 | words 9, sentences 1 | pass | |
Wait... what? Yes! | words 3, sentences 2 | words 3, sentences 2 | pass | ellipsis before lowercase continues |
She said, "Stop." Then she left. | words 6, sentences 2 | words 6, sentences 2 | pass | closing quote after the full stop |
It's 5 p.m. now. | words 4, sentences 1 | words 4, sentences 1 | pass | |
and/or | words 2 | words 2 | pass | slash separates |
plan—if | words 2 | words 2 | pass | em dash separates |
rock 'n' roll | words 3 | words 3 | pass | |
’90s music | words 2 | words 2 | pass | |
I ❤️ 🍕 | words 1, chars 5 | words 1, chars 5 | pass | emoji are characters, not words |
👨👩👧 family | words 1, chars 8 | words 1, chars 8 | pass | a family emoji (5 code points) is 1 character |
🇫🇷 France | words 1, chars 8 | words 1, chars 8 | pass | a flag (2 regional indicators) is 1 character |
Press 1️⃣ now | words 2 | words 2 | pass | keycap emoji are not numbers |
café naïve résumé | words 3, chars 17 | words 3, chars 17 | pass | |
café | words 1, chars 4 | words 1, chars 4 | pass | decomposed accent: e + combining acute = 1 character |
私は学生です。 | words 6, chars 7, sentences 1 | words 6, chars 7, sentences 1 | pass | each CJK character = 1 word |
我爱北京。你好! | words 6, sentences 2 | words 6, sentences 2 | pass | |
안녕하세요 세계 | words 2, chars 8 | words 2, chars 8 | pass | Korean uses spaces between words |
Visit https://example.com/a-b?c=1 now. | words 3 | words 3 | pass | a URL is 1 word |
Email me@example.org today | words 3 | words 3 | pass | an email address is 1 word |
1. First item↵2. Second item | words 6, sentences 2 | words 6, sentences 2 | pass | list numbers do not end sentences |
Introduction↵This is the text. | sentences 2, paragraphs 2 | sentences 2, paragraphs 2 | pass | a heading line is its own sentence |
One.↵↵Two.↵↵Three. | sentences 3, paragraphs 3 | sentences 3, paragraphs 3 | pass | |
a line that wraps↵onto the next line. | sentences 1 | sentences 1 | pass | a lowercase line start continues the sentence |
The end.The start. | words 4, sentences 1 | words 4, sentences 1 | pass | no space after the full stop: read as one sentence |
Syllables
Three of the six readability formulas need syllable counts, and no spelling rule gets English syllables right every time. Op-Ed Insight counts vowel groups, then applies about thirty spelling rules: silent final e (make, hope), sounded -le (table), silent and sounded -ed and -es (jumped, wanted; makes, boxes), vowel pairs that are usually two syllables (radio, actual, diet, idea), silent e before suffixes (lovely, statement), compounds (someone, therefore), and so on. A short exception list then fixes 462 frequent words where the rules disagree with the CMU Pronouncing Dictionary (words that appear at least 3 times among the 20,000 most frequent in 15 public-domain Project Gutenberg books).
Test. We wrote a list of 354 words with syllable counts checked by hand against standard American dictionary pronunciations, chosen to include the hard cases: silent letters, vowel pairs, -ed and -es endings, compounds, and words with two accepted pronunciations (for those, either count passes). This list is never used to build the exception list.
- With the exception list: 346 of 354 (97.7%).
- Rules alone: 330 of 354 (93.2%).
- The first time we ran the finished list (before a last round of rule fixes made with it in view) the scores were 96.9% and 89.5%. We report both because the later rules were written while looking at these words.
- Against the whole CMU dictionary (117,493 plain words), the rules alone agree with at least one listed pronunciation for 93.7%. Weighted by how often words occur in running text, agreement is above 99%.
Words we still miss: Wednesday (3, should be 2), patio (2, should be 3), karate (2, should be 3), cafe (1, should be 2), acne (1, should be 2), simile (2, should be 3), hyperbole (3, should be 4), epitome (3, should be 4).
Readability formulas
W = words, S = sentences, Sy = syllables. Web addresses, email addresses and Chinese or Japanese characters count as words but are left out of the formulas, which were built for English. Numbers stay in, with syllables counted as spoken ("2026" as "twenty twenty-six").
- Flesch Reading Ease = 206.835 − 1.015 × (W/S) − 84.6 × (Sy/W). Rudolf Flesch, 1948.
- Flesch–Kincaid Grade = 0.39 × (W/S) + 11.8 × (Sy/W) − 15.59. Kincaid, Fishburne, Rogers and Chissom, 1975, Naval Technical Training Command Research Branch Report 8-75.
- Gunning Fog = 0.4 × [(W/S) + 100 × complex words/W]. Complex words have three or more syllables; we do not count capitalized words inside a sentence (likely proper nouns), hyphenated compounds, or a syllable added by -es, -ed or -ing. Robert Gunning, 1952.
- SMOG = 1.0430 × √(polysyllables × 30/S) + 3.1291. G. Harry McLaughlin, 1969 (the paper's regression equation, scaled to 30 sentences). The tools warn below 30 sentences, the sample size SMOG was built for.
- Coleman–Liau = 0.0588 × L − 0.296 × S100 − 15.8, where L is letters per 100 words and S100 sentences per 100 words. Meri Coleman and T. L. Liau, 1975. We count letters and digits, as the published example does.
- Automated Readability Index = 4.71 × (characters/W) + 0.5 × (W/S) − 21.43, counting letters and digits. E. A. Smith and R. J. Senter, 1967. We show the unrounded value.
Reference values
For each published example we check the formula against the source's own counts ("formula"), then run the whole pipeline on the text ("end to end") to see how much our counting changes the result.
| Example | Check | Published | Op-Ed Insight | |
|---|---|---|---|---|
| Wikipedia, Flesch–Kincaid readability tests (example sentence) | Reading Ease, formula | 116 | 116.15 | pass |
| Reading Ease, end to end | 116 | 116.15 | pass | |
| Wikipedia, Flesch–Kincaid readability tests The source counts 24 syllables. Dictionaries give Aus-tra-lian (3) and rep-til-i-an (4), 25 in all; our counter finds 26. In a 13-word sentence each syllable moves Reading Ease by 6.5 points, so we report our end-to-end score but do not test it. | Reading Ease, formula | 37.5 | 37.46 | pass |
| Flesch–Kincaid, formula | 11.3 | 11.26 | pass | |
| Reading Ease, end to end (not tested) | 37.5 | 24.44 | info | |
| Flesch–Kincaid, end to end (not tested) | 11.3 | 13.08 | info | |
| Wikipedia, Flesch–Kincaid readability tests The source gives no counts. 16 words and 23 syllables reproduce 69. | Reading Ease, formula | 69 | 68.98 | pass |
| Reading Ease, end to end | 69 | 68.98 | pass | |
| Wikipedia, Flesch–Kincaid readability tests (lowest possible grade; highest possible Reading Ease) | Flesch–Kincaid, formula | -3.4 | -3.4 | pass |
| Reading Ease, formula | 121.22 | 121.22 | pass | |
| Flesch–Kincaid, end to end | -3.4 | -3.4 | pass | |
| Reading Ease, end to end | 121.22 | 121.22 | pass | |
| Wikipedia, Coleman–Liau index (abstract of Coleman and Liau, 1975) The source counts letters and digits (639) and 119 words. | Coleman–Liau, formula | 14.5 | 14.53 | pass |
| Coleman–Liau, end to end | 14.5 | 14.23 | pass | |
| McLaughlin (1969), SMOG Grading, Journal of Reading 12(8), Table 1 equation (d) g = 1.0430 × √95 + 3.1291 = 13.29; the paper's quick method (nearest perfect square, 100) gives 13. | SMOG, formula | 13.29 | 13.3 | pass |
| Lit2Go (University of South Florida), The Gettysburg Address: Flesch–Kincaid 10.9 Lit2Go does not state its counter or counts; treated as a ballpark check (±0.6 grade). | Flesch–Kincaid, end to end | 10.9 | 10.96 | pass |
No published worked example with counts was found for the Gunning Fog index or ARI; we check their arithmetic against the published coefficients only. Tolerances: formula checks to the published rounding; end-to-end checks ±0.6 grade or the stated tolerance.
Style highlights
- Long sentences: 25 words or more is marked long, 35 or more very long.
- Passive voice (a heuristic): a form of be or get, then up to three words such as not, already or an -ly adverb, then a past participle (an -ed word or one of 222 irregular participles), skipping 109 adjective-like words such as tired, interested and based.
- Adverbs: words ending in -ly, except 203 that are not adverbs (family, friendly, only).
- Hedges, clichés, wordy phrases, plainer words, nominalizations: whole-phrase matches against our published word lists.
- Repeated words: the same content word (four letters or more, not a common function word, plural folded into singular) used again within 40 words.
Passive-voice test
61 sentences we labelled by hand: 28 passives found, 3 missed, 1 false alarm, 29 correctly left alone. Precision 96.6%, recall 90.3%.
| Sentence | Passive? | Flagged? | Note |
|---|---|---|---|
| The vase was quickly and carefully wrapped. | yes | no | more words between the verb and the participle than the heuristic allows |
| The house, built in 1900, is still standing. | yes | no | reduced passive with no form of be |
| She had her bag stolen. | yes | no | have-passive |
| The door was closed when we arrived. | no | no | a state, not an action; the heuristic flags it |
| The lake was frozen solid. | no | yes | adjectival participle: the heuristic flags it |
Only the cases we get wrong are listed; the other 57 are right.
X (Twitter) and SMS counts
The X count follows the open-source twitter-text v3 configuration: weight 1 for code points in four ranges (U+0000–10FF, U+2000–200D, U+2010–201F, U+2032–2037), weight 2 for everything else, 2 for each emoji (including multi-part emoji), and 23 for each link. SMS uses the GSM 03.38 basic alphabet (1 unit each) and extension table (2 units: form feed, ^ { } \ [ ~ ] | €); any other character switches the message to UCS-2, counted in UTF-16 units. Single messages hold 160 GSM-7 or 70 UCS-2 units; split messages 153 or 67 per part.
| Input | Expected | Got | |
|---|---|---|---|
280 × “a” | X 280 | 280 | pass |
281 × “a” | X 281 | 281 | pass |
日本語 CJK characters weigh 2 | X 6 | 6 | pass |
😀 | X 2 | 2 | pass |
👨👩👧 a ZWJ sequence counts as one emoji | X 2 | 2 | pass |
see https://example.com/very/long/path?with=query links count 23 | X 27 | 27 | pass |
café | X 4 | 4 | pass |
a—b em dash U+2014 is in a weight-1 range | X 3 | 3 | pass |
a… ellipsis U+2026 is outside the weight-1 ranges | X 3 | 3 | pass |
160 × “a” | enc GSM-7 parts 1 | enc GSM-7 parts 1 | pass |
161 × “a” | enc GSM-7 parts 2 | enc GSM-7 parts 2 | pass |
306 × “a” | enc GSM-7 parts 2 | enc GSM-7 parts 2 | pass |
307 × “a” | enc GSM-7 parts 3 | enc GSM-7 parts 3 | pass |
80 × “€” € is in the extension table: 2 septets | enc GSM-7 units 160 parts 1 | enc GSM-7 units 160 parts 1 | pass |
Price: 5€ [ok] | enc GSM-7 units 17 | enc GSM-7 units 17 | pass |
Café à la carte | enc GSM-7 | enc GSM-7 | pass |
It’s here a curly apostrophe forces UCS-2 | enc UCS-2 | enc UCS-2 | pass |
Hello 😀 | enc UCS-2 units 8 parts 1 | enc UCS-2 units 8 parts 1 | pass |
70 × “é” | enc GSM-7 parts 1 | enc GSM-7 parts 1 | pass |
70 × “ó” | enc UCS-2 parts 1 | enc UCS-2 parts 1 | pass |
71 × “ó” | enc UCS-2 parts 2 | enc UCS-2 parts 2 | pass |
Words per page
The words-per-page calculator lays text out line by line. It uses the advance width of every character in fonts that are metric-compatible with the common office fonts (Liberation Serif for Times New Roman, Liberation Sans for Arial, Carlito for Calibri, Caladea for Cambria, Liberation Mono for Courier New), breaks lines at spaces without hyphenation, and keeps at least two lines of a paragraph together at page breaks (widow and orphan control, on by default in Word and LibreOffice). Line height is the font's own single-spacing height, fitted to LibreOffice.
We generated 30 test documents (five fonts; 12 pt single, 12 pt double, 11 pt at 1.15 with 8 pt after; Letter and A4; 3,000 words of The Federalist No. 10) and laid them out in LibreOffice Writer. Our words per full page differ from Writer's by 1.75% on average and 5.1% at most (Courier New); the page count differed by one page in 3 of 30 documents. Microsoft Word's own layout can differ slightly from Writer's.
| Words | Times New Roman 12 pt single | Times New Roman 12 pt double | Arial 12 pt single | Arial 12 pt double | Calibri 11 pt Word default (1.08, 8 pt after) | Calibri 12 pt double | Courier New 12 pt double |
|---|---|---|---|---|---|---|---|
| 250 | 0.3 | 0.7 | 0.4 | 0.7 | 0.4 | 0.7 | 1.1 |
| 500 | 0.7 | 1.4 | 0.8 | 1.6 | 0.7 | 1.5 | 2.2 |
| 750 | 1.1 | 2.2 | 1.2 | 2.4 | 1.1 | 2.3 | 3.3 |
| 1,000 | 1.4 | 2.8 | 1.6 | 3.2 | 1.5 | 3.1 | 4.5 |
| 1,500 | 2.1 | 4.3 | 2.4 | 4.7 | 2.2 | 4.6 | 6.6 |
| 2,000 | 2.8 | 5.7 | 3.1 | 6.3 | 2.9 | 6.1 | 8.7 |
| 2,500 | 3.4 | 7.2 | 3.9 | 7.9 | 3.7 | 7.6 | 10.9 |
| 3,000 | 4.1 | 8.6 | 4.7 | 9.5 | 4.4 | 9.1 | 13.1 |
| 5,000 | 6.9 | 14.4 | 7.8 | 15.9 | 7.3 | 15.2 | 21.7 |
| Words per full page | ≈ 729 | ≈ 350 | ≈ 645 | ≈ 318 | ≈ 683 | ≈ 330 | ≈ 229 |
Pages of continuous essay prose (The Federalist No. 10, about 4.8 letters per word, 130-word paragraphs) on US Letter with 1-inch margins; double-spaced rows use a 0.5-inch first-line indent. Computed by our layout model, which matches LibreOffice Writer within 1.75% on average. Headings, lists and short paragraphs mean fewer words per page. A4 pages hold slightly more: try the words-per-page calculator.