Aller au contenu
OneKitly

Compter les mots est ambigu, et chaque outil répond autrement

Publié le 06/10/2025 · 13 min de lecture · Outils texte & langage

Daniel Okonkwo

Daniel OkonkwoDéveloppeur front-end et rédacteur Tech chez OneKitly

Performance web · Formats de fichiers

Vérifié à partir de 5 sources

Voir le profil
En bref

Un compte de mots est la réponse à une question sur laquelle personne ne s'est mis d'accord : différents outils donnent donc des nombres différents pour le même texte, et tous se défendent. Nous avons pris un paragraphe technique de 188 caractères et l'avons compté de quatre façons. La découpe sur les blancs a donné 25. Une règle tenant compte des traits d'union et des apostrophes a donné 28. La segmentation Unicode via Intl.Segmenter a donné 33. La fameuse expression régulière qui reconnaît des caractères de mot entre frontières a donné 38 — la moitié de plus que le compte sur les blancs. L'écart n'est pas aléatoire : la découpe sur les blancs traite state-of-the-art et une URL entière comme un mot chacun, la regex les casse en quatre, et la segmentation atterrit entre les deux en gardant contractions et séparateurs de milliers mais en coupant les composés à traits d'union. Sur de la prose vraiment simple, les quatre méthodes s'accordent exactement — nous avons lancé un paragraphe de 160 caractères et toutes ont renvoyé 29 — et sur 50 000 caractères de texte d'article ordinaire elles sont restées à 4,5 % les unes des autres. L'écart ne s'ouvre que là où un texte est dense en composés, en chiffres, en adresses et en jetons liés par ponctuation. En chinois il s'ouvre entièrement : la découpe sur les blancs renvoie 1 pour une phrase entière et la regex de caractères de mot renvoie 0.

Un compte de mots est une définition, pas une mesure. Nous avons compté le même paragraphe de quatre façons et obtenu 25, 28, 33 et 38 — puis compté 50 000 caractères de prose ordinaire et obtenu un accord à 4,5 % près. L'écart tient entièrement aux composés, aux chiffres et aux URL.

Quatre méthodes, un paragraphe, quatre réponses

Voici le paragraphe employé, long de 188 caractères et typique de l'écriture technique : « 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. » Rien n'y est artificiel ; chacun de ses traits apparaît dans une documentation produit ordinaire.

La découpe sur des suites de blancs donne 25 jetons. C'est la définition la plus simple possible et celle à laquelle la plupart des gens arrivent sans aide : un mot, c'est ce qui se trouve entre deux espaces. Elle traite state-of-the-art comme un mot, l'URL entière comme un mot, et tokens—it comme un mot, car le tiret cadratin n'a pas d'espaces autour.

L'expression régulière qui reconnaît des caractères de mot entre frontières de mot donne 38. Elle coupe state-of-the-art en quatre, doesn't en deux, 1,234 en deux, 98.6 en deux, et l'URL en https, example, com et docs. Chacune de ces coupes est exactement ce que le motif prescrit : un caractère de mot y est une lettre, un chiffre ou un souligné ; trait d'union, apostrophe et virgule sont donc tous des frontières. Le résultat dépasse de moitié le compte sur les blancs.

La segmentation Unicode, disponible dans le navigateur et dans Node sous Intl.Segmenter avec granularity « word », donne 33. C'est la seule des quatre à reposer sur une spécification, et ses choix sont nettement plus humains : elle garde doesn't et That's entiers, garde 1,234 entier, garde example.com entier, et coupe state-of-the-art en quatre car le standard traite le trait d'union comme une rupture. Une quatrième règle, écrite pour garder lettres et chiffres ensemble à travers traits d'union, apostrophes, points et virgules internes, donne 28 — la plus proche, parmi les règles machine, de ce qu'une personne dirait si on lui demandait de compter à voix haute.

La correction honnête : sur de la prose simple, elles s'accordent toutes

Il serait plus commode d'affirmer que les comptes de mots divergent partout, et c'est faux. Nous avons compté un paragraphe de 160 caractères de prose narrative ordinaire — sans composés, sans chiffres, sans adresses — et les quatre méthodes ont renvoyé exactement 29. Puis nous avons compté 49 616 caractères du texte anglais des articles de ce site : 8 622 pour la découpe sur les blancs, 8 537 pour la règle à traits d'union, 8 729 pour la segmentation et 8 917 pour l'expression régulière. Du plus bas au plus haut, l'écart est de 4,5 %.

L'énoncé exact est donc plus étroit et plus utile que « les comptes de mots ne sont pas fiables ». Ils sont fiables sur la prose et non fiables dès qu'un texte mêle prose et matière lisible par machine. Notre paragraphe technique s'étale de 25 à 38, soit 52 % d'écart, sur 188 caractères. Une clause contractuelle contenant un chiffre, un adjectif composé, une URL et une heure s'étale de 24 à 33, soit 38 %. Le prédicteur n'est pas la longueur du texte, mais la densité de ce qui n'est pas un mot ordinaire.

Là où les méthodes se séparent exactement

Les composés à traits d'union sont la plus grosse source unique de désaccord. state-of-the-art compte pour un avec la découpe sur les blancs et avec la règle à traits d'union, et pour quatre avec l'expression régulière comme avec la segmentation Unicode. Tout texte comportant plusieurs composés de ce genre — une spécification, une fiche produit, un document juridique — montrera un écart visible entre outils pour cette seule raison.

Les contractions divisent autrement. doesn't vaut un mot pour la découpe sur les blancs, un pour la segmentation et un pour la règle à traits d'union, mais deux pour l'expression régulière, qui traite l'apostrophe comme une frontière et laisse un t orphelin. L'apostrophe courbe se comporte pareil : passer un document aux apostrophes typographiques n'y change rien. Le pluriel possessif est plus discret : the students' work vaut trois avec toutes les méthodes, car l'apostrophe est en fin de jeton et non à l'intérieur.

Les nombres et les adresses font le reste. 1,234 et 98.6 valent chacun un pour trois méthodes et deux pour l'expression régulière, incapable de distinguer un séparateur de milliers ou une virgule décimale d'une ponctuation. Une adresse électronique vaut un, deux ou trois selon la méthode ; une URL vaut un, trois ou quatre. Et un sigle écrit avec des points — U.S.A. — vaut un mot pour la découpe sur les blancs, la segmentation et la règle à traits d'union, mais trois pour l'expression régulière. Une ponctuation qui joint deux mots sans espace autour coupe tout sauf la découpe sur les blancs : tokens—it, 2024–2026, and/or et wait…what valent tous deux pour trois méthodes et un pour la quatrième.

Chinois et japonais, où la découpe sur les blancs renvoie 1

Prends une phrase chinoise de seize caractères sans aucune espace, comme en ont généralement les phrases chinoises. La découpe sur les blancs renvoie 1 : toute la phrase est un jeton. L'expression régulière de caractères de mot renvoie 0, car la classe de caractères de mot dans un motif sans drapeau Unicode ne couvre que lettres ASCII, chiffres et souligné, et un caractère chinois n'en est aucun. La règle Unicode à traits d'union renvoie 2, car la phrase comporte une virgule interne et la règle voit deux suites de lettres.

La segmentation Unicode renvoie 8, et les huit jetons trouvés sont les mots qu'un lecteur identifierait. La phrase japonaise équivalente, de vingt et un caractères, se segmente en onze. C'est un travail de dictionnaire plutôt que de motifs, et c'est pourquoi la segmentation vaut la peine même dans un produit en alphabet latin : c'est la seule méthode de la liste qui ne renvoie pas silencieusement une réponse fausse sur un texte pour lequel elle n'a pas été conçue. Elle n'exige pas non plus de connaître la langue à l'avance — segmenter la phrase chinoise avec la locale anglaise a donné les mêmes huit jetons.

Pourquoi le compte d'un éditeur et celui d'un traitement de texte diffèrent

Un traitement de texte compte ce que son auteur a décidé qu'était un mot, ce qui en pratique se rapproche de la découpe sur les blancs avec quelques ajustements — il est optimisé pour une personne qui écrit de la prose et veut que le nombre en barre d'état paraisse juste. Un système de gestion de contenu compte souvent avec une expression régulière, parce que c'est ce qui était disponible dans le langage où il a été écrit. Un éditeur qui paie au mot ne compte peut-être ni l'un ni l'autre, et divise plutôt le nombre de caractères par un chiffre fixe, car cela supprime toute discussion sur les composés.

Aucune n'est malhonnête. Ce sont trois réponses à une question sans forme canonique, et la seule chose qui tourne mal, c'est de les comparer. Si l'on te dit qu'un texte fait 1 500 mots, ce nombre n'a aucun sens tant que tu ne sais pas quel compte l'a produit. Sur notre paragraphe de test, mille mots signifient 7 520 caractères si le compte est fondé sur les blancs et 4 947 caractères s'il est fondé sur la regex — la même quantité nominale livrant moitié plus dans une lecture que dans l'autre.

Les comptes de caractères n'échappent pas au problème, ils le déplacent. Un caractère est une unité aussi disputée qu'un mot — unités de code, points de code et groupes de graphèmes donnent trois nombres différents pour la même chaîne, et tout texte contenant un emoji ou un accent combinant produira les trois. Nous avons démonté cela dans un article distinct sur les limites de caractères ; en bref, les deux comptes sont des définitions, et une limite énoncée dans l'un ou l'autre est incomplète tant qu'elle ne nomme pas la définition.

Que faire quand la limite est contractuelle

Nomme le compteur, pas seulement le nombre. « Pas plus de 2 000 mots » n'est pas une spécification ; « pas plus de 2 000 mots tels que comptés par X » en est une. S'accorder sur un outil suffit : les deux parties collent le texte dans le même compteur et obtiennent la même réponse, quelle que soit la définition qu'il implémente. Ce qu'il ne faut pas, c'est que chacun utilise le sien et découvre l'écart après la livraison.

Si tu ne peux pas nommer d'outil, énonce une règle en clair : les composés à traits d'union comptent-ils pour un ou pour plusieurs, une URL compte-t-elle pour un, les chiffres comptent-ils tout court. Ces trois phrases éliminent l'essentiel du désaccord, car ces trois catégories expliquent presque tout l'écart de 52 % que nous avons mesuré. Et si tu veux une unité vraiment difficile à contester, prends les caractères hors espaces en précisant de quel caractère tu parles : c'est un moins bon indicateur de l'effort et un bien meilleur de la longueur.

Regex de caractères de mot
Le même fragment compté de quatre façons — Node 26, Intl.Segmenter avec granularity "word"
FragmentDécoupe sur les blancsRegex de caractères de motSegmentation UnicodeRègle à traits d'union
state-of-the-art1441
doesn't1211
1,2341211
U.S.A.1311
https://example.com/docs1433
tokens—it (tiret cadratin, sans espaces)1222
Une phrase chinoise de 16 caractères1082
Compter les occurrencesCompte combien de fois un mot ou une expression apparaît dans ton texte.Essayer l'outil

Questions fréquentes

Quel compte de mots est le bon ?
Il n'y en a pas de bon, seulement un adapté. Si le compte existe pour qu'un lecteur sache quelle longueur fait un texte, la découpe sur les blancs et la segmentation Unicode conviennent toutes deux, et la segmentation couvre plus de langues. S'il existe pour qu'une machine indexe ou tronque, la segmentation est la seule à reposer sur une spécification publiée. S'il existe pour qu'un paiement ait lieu, le bon compte est celui que les deux parties ont nommé d'avance.
Pourquoi mon compte de mots bondit-il quand je colle depuis un site ?
En général parce que le texte collé a apporté des URL, des chiffres et des termes à traits d'union, les trois catégories sur lesquelles les méthodes divergent le plus. Notre paragraphe de test technique varie de 52 % entre la méthode la plus basse et la plus haute, alors qu'un paragraphe narratif ordinaire donne le même nombre avec les quatre. Deuxième cause : les caractères invisibles — espaces insécables issues d'un nombre formaté, jointeur de largeur nulle issu d'un emoji — qui peuvent fusionner ou scinder des jetons sans rien montrer à l'écran.
La regex de caractères de mot fonctionne-t-elle pour les langues accentuées ?
Pas sans aide. Dans sa forme nue, la classe de caractères de mot couvre lettres ASCII, chiffres et souligné : une lettre accentuée est donc une frontière et non une partie du mot. Un texte français ou portugais sera par conséquent surcompté, chaque mot accentué étant coupé à l'accent. Le remède est d'écrire le motif à partir des propriétés Unicode de lettre et de nombre, ce que fait la règle à traits d'union de cet article, ou d'employer la segmentation et de sauter la question.
Intl.Segmenter est-il disponible partout ?
Il fait partie du standard d'internationalisation ECMAScript et est présent dans les navigateurs actuels et dans Node, où nous avons produit tous les nombres de cet article. La réserve pratique ne porte pas sur la disponibilité mais sur les données : la qualité de la segmentation dépend des données de locale livrées avec le moteur, si bien que deux environnements peuvent diverger légèrement sur le même texte. Pour compter de la prose en alphabet latin, l'écart est négligeable ; pour le japonais, où la segmentation est un vrai problème de dictionnaire, il ne l'est pas.
Comment un compteur de mots doit-il traiter les emoji ?
De façon cohérente, et en général en ne les comptant pas comme des mots. Dans notre test, « Great work 👍 thanks » donne quatre avec la découpe sur les blancs, qui compte l'emoji comme un mot, et trois avec les autres méthodes, qui ne le comptent pas. Aucune n'a tort, mais un compteur qui annonce quatre devrait le dire, car un auteur soumis à une limite de mots réserverait sinon un mot qui ne porte aucun texte. Quel que soit ton choix, applique-le à tout le document plutôt qu'emoji par emoji.
Puis-je convertir entre comptes de mots avec un rapport fixe ?
Très grossièrement seulement, et seulement pour la prose. Sur 50 000 caractères de texte d'article ordinaire, les quatre méthodes sont restées à 4,5 % les unes des autres : un rapport unique y est une approximation viable. Sur un paragraphe technique, les mêmes quatre s'étalent de 52 %, ce qu'aucun rapport ne survit. S'il faut estimer, estime à partir des caractères : notre prose d'article en anglais tourne à 5,75 caractères par mot au sens des blancs, et ce chiffre est bien plus stable d'un type de texte à l'autre que le rapport entre deux règles de comptage.

Articles qui pourraient t'intéresser

Tous les guides
GuideFormater les nombres pour six langues : séparateurs, monnaie et le retour à la valeur1 234,56 et 1,234.56 sont le même nombre, et les confondre change la valeur que lit un lecteur. Nous avons lancé Intl.NumberFormat pour les six locales du site et imprimé chaque séparateur — dont l'invisible qu'emploie le français — puis mesuré pourquoi parseFloat ne peut rien défaire.ExplicationFréquence des mots et loi de Zipf : nous avons compté six livres en six langues et ajusté la penteLe mot de rang n apparaît environ 1/n fois moins que le premier. Nous avons compté six livres du domaine public, imprimé rang × fréquence, ajusté log fréquence contre log rang, et obtenu des pentes entre -1,02 et -1,08 dans les six langues — et les deux endroits où la loi casse.ExplicationOù une ligne peut se couper : l'algorithme Unicode derrière chaque paragraphe justifié« Couper aux espaces » échoue dans la plupart des systèmes d'écriture. UAX #14 donne à chaque caractère une classe de coupure ; nous avons cherché les nôtres dans Unicode 17.0.0 et exécuté une implémentation conforme sur espaces insécables, traits d'union conditionnels, espaces de largeur nulle, URL, japonais et thaï.ExplicationLes emoji sont plus difficiles qu'ils n'en ont l'air : pourquoi « il suffit de les retirer » n'a pas de réponse en une ligneUn emoji visible peut valoir un point de code ou quatorze unités UTF-16. Nous avons lancé trois expressions régulières répandues sur une vraie phrase : chacune a cassé différemment, l'une a supprimé les chiffres. Voici pourquoi, quelle propriété Unicode répond à quelle question, et la règle de groupes de graphèmes qui marche vraiment.GuideLes limites de caractères qui font vraiment mal : unités de code, points de code et graphèmesUn caractère, c'est trois choses à la fois. Un emoji avec teinte de peau vaut 1 graphème, 2 points de code et 4 unités UTF-16. Tous les comptages de ce guide ont été mesurés dans Node, avec en prime pourquoi un SMS tombe de 160 à 70 et pourquoi VARCHAR(255) ne fait pas 255 de quoi que ce soit de précis.ExplicationCe que mesurent réellement les scores de lisibilité (et les trois choses qu'ils ne voient pas)Le Flesch Reading Ease et le niveau Flesch-Kincaid comptent des syllabes et des longueurs de phrase. Rien d'autre. Les deux formules en entier, un passage noté de bout en bout, et l'astuce de la virgule qui offre 3,9 niveaux scolaires sans changer un mot.

Outils similaires

Sources

Tu as repéré une erreur dans cet article ?