Contare le parole è ambiguo, e ogni strumento risponde in modo diverso
Pubblicato il 06/10/2025 · 12 min di lettura · Strumenti testo e lingua
Daniel Okonkwo — Sviluppatore front-end e redattore Tech presso Allin
Performance web · Formati di file
Verificato su 5 fonti
Un conteggio di parole è la risposta a una domanda su cui nessuno si è messo d'accordo, quindi strumenti diversi danno numeri diversi per lo stesso testo e tutti sono difendibili. Abbiamo preso un paragrafo tecnico di 188 caratteri e lo abbiamo contato in quattro modi. Dividere sugli spazi ha dato 25. Una regola attenta a trattini e apostrofi ha dato 28. La segmentazione Unicode tramite Intl.Segmenter ha dato 33. La nota espressione regolare che riconosce caratteri di parola fra confini ha dato 38: la metà in più del conteggio sugli spazi. La divergenza non è casuale: dividere sugli spazi tratta state-of-the-art e un URL intero come una parola ciascuno, la regex li spezza in quattro, e la segmentazione atterra in mezzo tenendo insieme contrazioni e separatori delle migliaia ma spezzando i composti con trattino. Su prosa davvero semplice i quattro metodi coincidono esattamente — abbiamo eseguito un paragrafo di 160 caratteri e tutti hanno restituito 29 — e su 50.000 caratteri di testo d'articolo ordinario sono rimasti entro il 4,5 % l'uno dall'altro. Il divario si apre solo dove un testo è denso di composti, cifre, indirizzi e unità legate dalla punteggiatura. In cinese si apre del tutto: dividere sugli spazi restituisce 1 per una frase intera e la regex di caratteri di parola restituisce 0.
Un conteggio di parole è una definizione, non una misura. Abbiamo contato lo stesso paragrafo in quattro modi ottenendo 25, 28, 33 e 38; poi abbiamo contato 50.000 caratteri di prosa ordinaria ottenendo accordo entro il 4,5 %. Lo scarto dipende interamente da composti, cifre e URL.
Quattro metodi, un paragrafo, quattro risposte
Ecco il paragrafo che abbiamo usato, lungo 188 caratteri e tipico della scrittura tecnica: «The state-of-the-art model doesn't stop at 1,234 tokens—it reads the whole page, including https://example.com/docs, and re-runs the check twice. That's 98.6% coverage, up from two-thirds.» Nulla in esso è artificioso; ogni sua caratteristica compare nella documentazione di prodotto ordinaria.
Dividere su sequenze di spazi dà 25 unità. È la definizione più semplice possibile e quella a cui la maggioranza arriva da sola: una parola è ciò che sta fra due spazi. Tratta state-of-the-art come una parola, l'URL intero come una parola e tokens—it come una parola, perché la lineetta lunga non ha spazi intorno.
L'espressione regolare che riconosce caratteri di parola fra confini di parola dà 38. Spezza state-of-the-art in quattro, doesn't in due, 1,234 in due, 98.6 in due e l'URL in https, example, com e docs. Ognuna di quelle divisioni è esattamente ciò che il pattern prescrive: un carattere di parola lì è una lettera, una cifra o un trattino basso, quindi trattino, apostrofo e virgola sono tutti confini. Il risultato supera di metà il conteggio sugli spazi.
La segmentazione Unicode, disponibile nel browser e in Node come Intl.Segmenter con granularity «word», dà 33. È l'unica delle quattro ad avere una specifica alle spalle, e le sue scelte sono nettamente più umane: tiene doesn't e That's interi, tiene 1,234 intero, tiene example.com intero, e spezza state-of-the-art in quattro perché lo standard tratta il trattino come una rottura. Una quarta regola, scritta per tenere insieme lettere e cifre attraverso trattini, apostrofi, punti e virgole interni, dà 28: fra le regole macchina, la più vicina a ciò che direbbe una persona a cui si chiedesse di contare ad alta voce.
La correzione onesta: su prosa semplice concordano tutti
Sarebbe più ordinato affermare che i conteggi di parole discordano ovunque, e non è vero. Abbiamo contato un paragrafo di 160 caratteri di prosa narrativa ordinaria — nessun composto, nessuna cifra, nessun indirizzo — e i quattro metodi hanno restituito esattamente 29. Poi abbiamo contato 49.616 caratteri del testo inglese degli articoli di questo sito e abbiamo ottenuto 8622 dalla divisione sugli spazi, 8537 dalla regola con trattini, 8729 dalla segmentazione e 8917 dall'espressione regolare. Dal più basso al più alto lo scarto è del 4,5 %.
Quindi l'affermazione vera è più stretta e più utile di «i conteggi di parole non sono affidabili». Sono affidabili sulla prosa e inaffidabili non appena un testo mescola prosa e materiale leggibile dalla macchina. Il nostro paragrafo tecnico si estende da 25 a 38, uno scarto del 52 %, su 188 caratteri. Una clausola contrattuale con una cifra, un aggettivo composto, un URL e un orario si estende da 24 a 33, il 38 %. Il predittore non è la lunghezza del testo, ma la densità di ciò che non sono parole comuni.
Dove esattamente i metodi si separano
I composti con trattino sono la maggiore singola fonte di disaccordo. state-of-the-art conta come uno con la divisione sugli spazi e con la regola dei trattini, e come quattro sia con l'espressione regolare sia con la segmentazione Unicode. Qualsiasi testo con più composti simili — una specifica, una scheda prodotto, un documento legale — mostrerà un divario visibile fra strumenti già solo per questo.
Le contrazioni dividono il campo in altro modo. doesn't vale una parola per la divisione sugli spazi, una per la segmentazione e una per la regola dei trattini, ma due per l'espressione regolare, che tratta l'apostrofo come confine e lascia una t orfana. L'apostrofo curvo si comporta allo stesso modo, quindi passare un documento agli apostrofi tipografici non lo risolve. Il plurale possessivo è più discreto: the students' work conta tre con ogni metodo, perché l'apostrofo sta a fine unità e non al suo interno.
Numeri e indirizzi fanno il resto. 1,234 e 98.6 valgono ciascuno uno per tre metodi e due per l'espressione regolare, incapace di distinguere un separatore delle migliaia o una virgola decimale dalla punteggiatura. Un indirizzo di posta vale uno, due o tre a seconda del metodo; un URL vale uno, tre o quattro. E una sigla scritta con i punti — U.S.A. — vale una parola per la divisione sugli spazi, la segmentazione e la regola dei trattini, ma tre per l'espressione regolare. La punteggiatura che unisce due parole senza spazio intorno spezza tutto tranne la divisione sugli spazi: tokens—it, 2024–2026, and/or e wait…what valgono tutti due per tre metodi e uno per il quarto.
Cinese e giapponese, dove la divisione sugli spazi restituisce 1
Prendi una frase cinese di sedici caratteri senza spazi, come le frasi cinesi generalmente non ne hanno. Dividere sugli spazi restituisce 1: l'intera frase è un'unità. L'espressione regolare di caratteri di parola restituisce 0, perché la classe di caratteri di parola in un pattern senza flag Unicode copre solo lettere ASCII, cifre e trattino basso, e un carattere cinese non è nessuno di questi. La regola Unicode con trattini restituisce 2, perché la frase ha una virgola interna e la regola vede due sequenze di lettere.
La segmentazione Unicode restituisce 8, e le otto unità che trova sono le parole che un lettore individuerebbe. La frase giapponese equivalente, di ventuno caratteri, si segmenta in undici. È lavoro da dizionario più che da pattern, ed è per questo che vale la pena ricorrere alla segmentazione anche in un prodotto in alfabeto latino: è l'unico metodo dell'elenco che non restituisce in silenzio una risposta sbagliata su testo per cui non è stato progettato. Non richiede neppure di conoscere la lingua in anticipo: segmentare la frase cinese con la lingua inglese ha dato le stesse otto unità.
Perché il conteggio di un editore e quello di un elaboratore di testi differiscono
Un elaboratore di testi conta ciò che il suo autore ha deciso sia una parola, il che in pratica si avvicina alla divisione sugli spazi con qualche aggiustamento: è ottimizzato per una persona che scrive prosa e vuole che il numero nella barra di stato sembri giusto. Un sistema di gestione dei contenuti conta spesso con un'espressione regolare, perché era ciò che c'era nel linguaggio in cui è stato scritto. Un editore che paga a parola può non contare nessuna delle due, e dividere invece il numero di caratteri per una cifra fissa, perché così la discussione sui composti sparisce del tutto.
Nessuno bara. Sono tre risposte a una domanda senza forma canonica, e l'unica cosa che va storta è confrontarle. Se ti dicono che un pezzo è di 1500 parole, quel numero è privo di senso finché non sai quale conteggio lo ha prodotto. Sul nostro paragrafo di prova, mille parole significano 7520 caratteri se il conteggio è sugli spazi e 4947 caratteri se è sulla regex: la stessa quantità nominale consegna metà in più in una lettura rispetto all'altra.
I conteggi di caratteri non sfuggono al problema, lo spostano. Un carattere è un'unità contesa quanto una parola: unità di codice, punti di codice e gruppi di grafemi danno tre numeri diversi per la stessa stringa, e qualsiasi testo con una emoji o un accento combinante li produrrà tutti e tre. Lo abbiamo smontato in un pezzo a parte sui limiti di caratteri; in breve, entrambi i conteggi sono definizioni, e un limite espresso in uno dei due resta incompleto finché non nomina la definizione.
Che fare quando il limite è contrattuale
Nomina il contatore, non solo il numero. «Non più di 2000 parole» non è una specifica; «non più di 2000 parole come contate da X» lo è. Accordarsi su uno strumento basta: entrambe le parti incollano il testo nello stesso contatore e ottengono la stessa risposta, qualunque definizione implementi. Ciò che non deve accadere è che ciascuna parte usi il proprio e scopra il divario dopo la consegna.
Se non puoi nominare uno strumento, enuncia una regola in prosa: se i composti con trattino contano come uno o come più, se un URL conta come uno, se le cifre contano affatto. Quelle tre frasi eliminano quasi tutto il disaccordo, perché quelle tre categorie spiegano quasi tutto lo scarto del 52 % che abbiamo misurato. E se vuoi un'unità davvero difficile da contestare, usa i caratteri esclusi gli spazi e di' quale carattere intendi: come misura dello sforzo è peggiore, come misura della lunghezza molto migliore.
| Frammento | Divisione sugli spazi | Regex di caratteri di parola | Segmentazione Unicode | Regola con trattini |
|---|---|---|---|---|
| state-of-the-art | 1 | 4 | 4 | 1 |
| doesn't | 1 | 2 | 1 | 1 |
| 1,234 | 1 | 2 | 1 | 1 |
| U.S.A. | 1 | 3 | 1 | 1 |
| https://example.com/docs | 1 | 4 | 3 | 3 |
| tokens—it (lineetta lunga, senza spazi) | 1 | 2 | 2 | 2 |
| Una frase cinese di 16 caratteri | 1 | 0 | 8 | 2 |
Domande frequenti
- Quale conteggio di parole è quello giusto?
- Non ce n'è uno giusto, solo uno adatto. Se il conteggio esiste perché un lettore sappia quanto è lungo un pezzo, la divisione sugli spazi e la segmentazione Unicode vanno entrambe bene, e la segmentazione copre più lingue. Se esiste perché una macchina indicizzi o tronchi, la segmentazione è l'unica con una specifica pubblicata alle spalle. Se esiste perché del denaro passi di mano, quello giusto è quello che entrambe le parti hanno nominato in anticipo.
- Perché il mio conteggio di parole salta quando incollo da un sito?
- Di solito perché il testo incollato ha portato con sé URL, cifre e termini con trattino, che sono le tre categorie su cui i metodi divergono di più. Il nostro paragrafo tecnico di prova varia del 52 % fra il metodo più basso e quello più alto, mentre un paragrafo narrativo ordinario dà lo stesso numero con tutti e quattro. Una seconda causa sono i caratteri invisibili — spazi unificatori da un numero formattato, un giuntore a larghezza zero da una emoji — che possono fondere o spezzare unità senza mostrare nulla sullo schermo.
- La regex di caratteri di parola funziona per lingue con accenti?
- Non senza aiuto. Nella sua forma semplice la classe di caratteri di parola copre lettere ASCII, cifre e trattino basso, il che significa che una lettera accentata è un confine e non parte di una parola. Un testo francese o portoghese sarà quindi sovracontato, con ogni parola accentata spezzata sull'accento. Il rimedio è scrivere il pattern sulle proprietà Unicode di lettera e numero, che è ciò che fa la regola con trattini di questo articolo, o usare la segmentazione e saltare la domanda.
- Intl.Segmenter è disponibile ovunque?
- Fa parte dello standard di internazionalizzazione di ECMAScript ed è presente nei browser attuali e in Node, dove abbiamo prodotto ogni numero di questo articolo. La riserva pratica non è la disponibilità ma i dati: la qualità della segmentazione dipende dai dati di lingua con cui il runtime è stato distribuito, quindi due ambienti possono divergere leggermente sullo stesso testo. Per contare prosa in alfabeto latino la differenza è trascurabile; per il giapponese, dove la segmentazione è un vero problema di dizionario, non lo è.
- Come dovrebbe trattare le emoji un contatore di parole?
- In modo coerente, e di solito non contandole come parole. Nel nostro test «Great work 👍 thanks» dà quattro con la divisione sugli spazi, che conta l'emoji come parola, e tre con gli altri metodi, che non lo fanno. Nessuno sbaglia, ma un contatore che riporta quattro dovrebbe dirlo, perché altrimenti chi scrive con un limite metterà a bilancio una parola che non porta testo. Qualunque scelta tu faccia, applicala all'intero documento e non emoji per emoji.
- Posso convertire fra conteggi di parole con un rapporto fisso?
- Solo molto approssimativamente, e solo per la prosa. Su 50.000 caratteri di testo d'articolo ordinario i quattro metodi sono rimasti entro il 4,5 % l'uno dall'altro, quindi lì un unico rapporto è un'approssimazione praticabile. Su un paragrafo tecnico gli stessi quattro si allargano del 52 %, e nessun rapporto ci sopravvive. Se devi stimare, stima dai caratteri: la nostra prosa d'articolo in inglese sta sui 5,75 caratteri per parola secondo gli spazi, e quel valore è molto più stabile fra tipi di testo del rapporto fra due regole di conteggio.
Articoli che potrebbero interessarti
Tutte le guide →Strumenti correlati
Fonti
- Unicode Consortium — UAX #29: Unicode Text Segmentation — word boundary rules
- Ecma International — ECMA-402: ECMAScript Internationalization API Specification — Intl.Segmenter
- Mozilla — MDN Web Docs — Intl.Segmenter and segment granularity
- Mozilla — MDN Web Docs — Word boundary assertions in regular expressions
- Unicode Consortium — CLDR — Unicode Common Locale Data Repository (segmentation and locale data)
Hai notato un errore in questo articolo?