Contar palabras es ambiguo, y cada herramienta responde distinto
Publicado el 6/10/2025 · 12 min de lectura · Herramientas de texto e idioma
Daniel Okonkwo — Desarrollador front-end y redactor de Tecnología en OneKitly
Rendimiento web · Formatos de archivo
Verificado con 5 fuentes
Un recuento de palabras es la respuesta a una pregunta que nadie acordó, así que distintas herramientas dan números distintos para el mismo texto y todos son defendibles. Tomamos un párrafo técnico de 188 caracteres y lo contamos de cuatro formas. Partir por espacios dio 25. Una regla consciente de guiones y apóstrofos dio 28. La segmentación Unicode mediante Intl.Segmenter dio 33. La conocida expresión regular que reconoce caracteres de palabra entre fronteras dio 38: la mitad más que el recuento por espacios. La divergencia no es aleatoria: partir por espacios trata state-of-the-art y una URL entera como una palabra cada uno, la regex los rompe en cuatro, y la segmentación aterriza en medio manteniendo contracciones y separadores de millares pero partiendo los compuestos con guion. En prosa realmente simple los cuatro métodos coinciden exactamente —ejecutamos un párrafo de 160 caracteres y todos devolvieron 29— y sobre 50 000 caracteres de texto de artículo corriente se mantuvieron dentro del 4,5 % entre sí. La brecha solo se abre donde un texto es denso en compuestos, cifras, direcciones y fichas unidas por puntuación. En chino se abre del todo: partir por espacios devuelve 1 para una frase entera y la regex de caracteres de palabra devuelve 0.
Un recuento de palabras es una definición, no una medida. Contamos el mismo párrafo de cuatro formas y obtuvimos 25, 28, 33 y 38; luego contamos 50 000 caracteres de prosa corriente y obtuvimos acuerdo dentro del 4,5 %. La diferencia se debe por completo a compuestos, cifras y URL.
Cuatro métodos, un párrafo, cuatro respuestas
Este es el párrafo que usamos, de 188 caracteres y típico de la escritura técnica: «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.» Nada en él es artificioso; cada uno de sus rasgos aparece en documentación de producto corriente.
Partir por secuencias de espacios da 25 fichas. Es la definición más simple posible y a la que llega la mayoría sin ayuda: una palabra es lo que hay entre dos espacios. Trata state-of-the-art como una palabra, la URL entera como una palabra y tokens—it como una palabra, porque la raya no lleva espacios alrededor.
La expresión regular que reconoce caracteres de palabra entre fronteras de palabra da 38. Parte state-of-the-art en cuatro, doesn't en dos, 1,234 en dos, 98.6 en dos y la URL en https, example, com y docs. Cada uno de esos cortes es exactamente lo que el patrón manda: un carácter de palabra ahí es una letra, un dígito o un guion bajo, así que guion, apóstrofo y coma son todos fronteras. El resultado supera en la mitad al recuento por espacios.
La segmentación Unicode, disponible en el navegador y en Node como Intl.Segmenter con granularity «word», da 33. Es la única de las cuatro con una especificación detrás, y sus decisiones son notablemente más humanas: mantiene doesn't y That's enteros, mantiene 1,234 entero, mantiene example.com entero, y parte state-of-the-art en cuatro porque el estándar trata el guion como una ruptura. Una cuarta regla, escrita para mantener letras y dígitos juntos a través de guiones, apóstrofos, puntos y comas internos, da 28: la más cercana, entre las reglas de máquina, a lo que diría una persona si le pidieras contar en voz alta.
La corrección honesta: en prosa simple todos coinciden
Sería más cómodo afirmar que los recuentos de palabras discrepan en todas partes, y no es cierto. Contamos un párrafo de 160 caracteres de prosa narrativa corriente —sin compuestos, sin cifras, sin direcciones— y los cuatro métodos devolvieron exactamente 29. Luego contamos 49 616 caracteres del texto inglés de los artículos de este sitio y obtuvimos 8622 por división de espacios, 8537 por la regla con guiones, 8729 por segmentación y 8917 por la expresión regular. De menor a mayor la diferencia es del 4,5 %.
Así que la afirmación real es más estrecha y más útil que «los recuentos de palabras no son fiables». Son fiables en prosa y poco fiables en cuanto un texto mezcla prosa con material legible por máquina. Nuestro párrafo técnico se extiende de 25 a 38, un 52 % de diferencia, en 188 caracteres. Una cláusula contractual con una cifra, un adjetivo compuesto, una URL y una hora se extiende de 24 a 33, un 38 %. El predictor no es la longitud del texto, sino la densidad de lo que no son palabras corrientes.
Dónde se separan exactamente los métodos
Los compuestos con guion son la mayor fuente aislada de desacuerdo. state-of-the-art cuenta como uno con la división por espacios y con la regla de guiones, y como cuatro tanto con la expresión regular como con la segmentación Unicode. Cualquier texto con varios compuestos así —una especificación, una ficha de producto, un documento legal— mostrará una brecha visible entre herramientas solo por eso.
Las contracciones dividen el campo de otro modo. doesn't vale una palabra para la división por espacios, una para la segmentación y una para la regla de guiones, pero dos para la expresión regular, que trata el apóstrofo como frontera y deja una t suelta. El apóstrofo curvo se comporta igual, así que pasar un documento a comillas tipográficas no lo arregla. El plural posesivo es más discreto: the students' work cuenta tres con todos los métodos, porque el apóstrofo está al final de la ficha y no dentro.
Los números y las direcciones hacen el resto. 1,234 y 98.6 valen cada uno uno para tres métodos y dos para la expresión regular, incapaz de distinguir un separador de millares o una coma decimal de la puntuación. Una dirección de correo vale uno, dos o tres según el método; una URL vale uno, tres o cuatro. Y una sigla escrita con puntos —U.S.A.— vale una palabra para la división por espacios, la segmentación y la regla de guiones, pero tres para la expresión regular. La puntuación que une dos palabras sin espacio alrededor parte todo salvo la división por espacios: tokens—it, 2024–2026, and/or y wait…what valen todos dos para tres métodos y uno para el cuarto.
Chino y japonés, donde la división por espacios devuelve 1
Toma una frase china de dieciséis caracteres sin espacios, como suelen ser las frases chinas. Partir por espacios devuelve 1: toda la frase es una ficha. La expresión regular de caracteres de palabra devuelve 0, porque la clase de caracteres de palabra en un patrón sin la bandera Unicode cubre solo letras ASCII, dígitos y guion bajo, y un carácter chino no es ninguno de ellos. La regla Unicode con guiones devuelve 2, porque la frase tiene una coma interna y la regla ve dos secuencias de letras.
La segmentación Unicode devuelve 8, y las ocho fichas que encuentra son las palabras que un lector identificaría. La frase japonesa equivalente, de veintiún caracteres, se segmenta en once. Esto es trabajo de diccionario más que de patrones, y por eso vale la pena recurrir a la segmentación incluso en un producto en alfabeto latino: es el único método de la lista que no devuelve en silencio una respuesta errónea sobre texto para el que no fue diseñado. Tampoco exige conocer el idioma de antemano: segmentar la frase china con la locale inglesa dio las mismas ocho fichas.
Por qué el recuento de un editor y el de un procesador de textos difieren
Un procesador de textos cuenta lo que su autor decidió que es una palabra, lo cual en la práctica se acerca a la división por espacios con algunos ajustes: está optimizado para una persona que escribe prosa y quiere que el número de la barra de estado parezca correcto. Un gestor de contenidos cuenta a menudo con una expresión regular, porque es lo que había en el lenguaje en que se escribió. Un editor que paga por palabra puede no contar ninguna de las dos, y dividir en cambio el número de caracteres por una cifra fija, porque eso elimina del todo la discusión sobre los compuestos.
Ninguno hace trampa. Son tres respuestas a una pregunta sin forma canónica, y lo único que sale mal es compararlas. Si te dicen que un texto tiene 1500 palabras, ese número carece de sentido hasta que sepas qué recuento lo produjo. En nuestro párrafo de prueba, mil palabras significan 7520 caracteres si el recuento se basa en espacios y 4947 caracteres si se basa en la regex: la misma cantidad nominal entrega la mitad más en una lectura que en la otra.
Los recuentos de caracteres no escapan al problema, lo reubican. Un carácter es una unidad tan disputada como una palabra: unidades de código, puntos de código y grupos de grafemas dan tres números distintos para la misma cadena, y cualquier texto con un emoji o un acento combinante producirá los tres. Lo desmontamos en un artículo aparte sobre límites de caracteres; en resumen, ambos recuentos son definiciones, y un límite enunciado en cualquiera de ellos está incompleto mientras no nombre la definición.
Qué hacer cuando el límite es contractual
Nombra el contador, no solo el número. «No más de 2000 palabras» no es una especificación; «no más de 2000 palabras según las cuenta X» sí lo es. Basta con acordar una herramienta: ambas partes pegan el texto en el mismo contador y obtienen la misma respuesta, sea cual sea la definición que implemente. Lo que no debe pasar es que cada parte use la suya y descubra la diferencia tras la entrega.
Si no puedes nombrar una herramienta, enuncia una regla en prosa: si los compuestos con guion cuentan como uno o como varios, si una URL cuenta como una, si las cifras cuentan siquiera. Esas tres frases eliminan casi todo el desacuerdo, porque esas tres categorías explican casi toda la diferencia del 52 % que medimos. Y si quieres una unidad realmente difícil de discutir, usa caracteres sin espacios y di qué carácter quieres decir: es peor indicador del esfuerzo y mucho mejor de la extensión.
| Fragmento | División por espacios | Regex de caracteres de palabra | Segmentación Unicode | Regla con guiones |
|---|---|---|---|---|
| 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 (raya, sin espacios) | 1 | 2 | 2 | 2 |
| Una frase china de 16 caracteres | 1 | 0 | 8 | 2 |
Preguntas frecuentes
- ¿Cuál es el recuento de palabras correcto?
- No hay uno correcto, solo uno adecuado. Si el recuento existe para que un lector sepa cuánto ocupa un texto, la división por espacios y la segmentación Unicode sirven ambas, y la segmentación abarca más idiomas. Si existe para que una máquina indexe o trunque, la segmentación es la única con una especificación publicada detrás. Si existe para que cambie dinero de manos, el correcto es el que ambas partes nombraron de antemano.
- ¿Por qué salta mi recuento de palabras al pegar desde una web?
- Normalmente porque el texto pegado trajo URL, cifras y términos con guion, que son las tres categorías en las que más discrepan los métodos. Nuestro párrafo técnico de prueba varía un 52 % entre el método más bajo y el más alto, mientras que un párrafo narrativo corriente da el mismo número con los cuatro. Una segunda causa son los caracteres invisibles —espacios duros de un número formateado, un juntor de ancho cero de un emoji— que pueden fusionar o partir fichas sin mostrar nada en pantalla.
- ¿Funciona la regex de caracteres de palabra en lenguas con acentos?
- No sin ayuda. En su forma simple, la clase de caracteres de palabra cubre letras ASCII, dígitos y guion bajo, lo que significa que una letra acentuada es una frontera y no parte de una palabra. Un texto francés o portugués quedará por tanto sobrecontado, con cada palabra acentuada partida en el acento. El remedio es escribir el patrón contra las propiedades Unicode de letra y número, que es lo que hace la regla con guiones de este artículo, o usar segmentación y saltarse la pregunta.
- ¿Está Intl.Segmenter disponible en todas partes?
- Forma parte del estándar de internacionalización de ECMAScript y está presente en los navegadores actuales y en Node, donde produjimos todos los números de este artículo. La reserva práctica no es la disponibilidad sino los datos: la calidad de la segmentación depende de los datos de locale con los que se distribuyó el motor, así que dos entornos pueden discrepar levemente sobre el mismo texto. Para contar prosa en alfabeto latino la diferencia es despreciable; para el japonés, donde la segmentación es un verdadero problema de diccionario, no lo es.
- ¿Cómo debe tratar los emoji un contador de palabras?
- De forma coherente, y normalmente sin contarlos como palabras. En nuestra prueba, «Great work 👍 thanks» da cuatro con la división por espacios, que cuenta el emoji como palabra, y tres con los demás métodos, que no. Ninguna se equivoca, pero un contador que informe cuatro debería decirlo, porque de lo contrario quien escribe con un límite reservará una palabra que no lleva texto alguno. Sea cual sea tu elección, aplícala a todo el documento y no emoji por emoji.
- ¿Puedo convertir entre recuentos de palabras con una proporción fija?
- Solo muy a grandes rasgos, y solo para prosa. Sobre 50 000 caracteres de texto de artículo corriente los cuatro métodos se mantuvieron dentro del 4,5 % entre sí, así que una única proporción es ahí una aproximación viable. En un párrafo técnico esos mismos cuatro se separan un 52 %, y ninguna proporción sobrevive a eso. Si has de estimar, estima desde los caracteres: nuestra prosa de artículo en inglés ronda los 5,75 caracteres por palabra según espacios, y esa cifra es mucho más estable entre tipos de texto que la proporción entre dos reglas de recuento.
Artículos que podrían interesarte
Todas las guías →Herramientas relacionadas
Fuentes
- 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)
¿Has detectado un error en este artículo?