Contar palavras é ambíguo, e cada ferramenta responde de forma diferente
Publicado a 06/10/2025 · 12 min de leitura · Ferramentas de texto e idioma
Daniel Okonkwo — Programador front-end e redator de Tecnologia na OneKitly
Desempenho web · Formatos de ficheiro
Verificado a partir de 5 fontes
Uma contagem de palavras é a resposta a uma pergunta que ninguém acordou, por isso ferramentas diferentes dão números diferentes para o mesmo texto e todos são defensáveis. Pegámos num parágrafo técnico de 188 caracteres e contámo-lo de quatro maneiras. Dividir por espaços deu 25. Uma regra atenta a hífenes e apóstrofos deu 28. A segmentação Unicode através de Intl.Segmenter deu 33. A conhecida expressão regular que reconhece caracteres de palavra entre fronteiras deu 38 — metade a mais do que a contagem por espaços. A divergência não é aleatória: dividir por espaços trata state-of-the-art e um URL inteiro como uma palavra cada, a regex parte-os em quatro, e a segmentação fica no meio mantendo contrações e separadores de milhares mas partindo os compostos com hífen. Em prosa realmente simples os quatro métodos coincidem exatamente — corremos um parágrafo de 160 caracteres e todos devolveram 29 — e sobre 50 000 caracteres de texto de artigo vulgar mantiveram-se dentro de 4,5 % uns dos outros. A distância só se abre onde um texto é denso em compostos, algarismos, endereços e fichas ligadas por pontuação. Em chinês abre-se por completo: dividir por espaços devolve 1 para uma frase inteira e a regex de caracteres de palavra devolve 0.
Uma contagem de palavras é uma definição, não uma medição. Contámos o mesmo parágrafo de quatro maneiras e obtivemos 25, 28, 33 e 38; depois contámos 50 000 caracteres de prosa vulgar e obtivemos acordo dentro de 4,5 %. A diferença deve-se inteiramente a compostos, algarismos e URL.
Quatro métodos, um parágrafo, quatro respostas
Eis o parágrafo que usámos, com 188 caracteres e típico da escrita 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 nele é artificial; cada uma das suas características aparece em documentação de produto vulgar.
Dividir por sequências de espaços dá 25 fichas. É a definição mais simples possível e aquela a que a maioria chega sem ajuda: uma palavra é o que está entre dois espaços. Trata state-of-the-art como uma palavra, o URL inteiro como uma palavra e tokens—it como uma palavra, porque o travessão não tem espaços à volta.
A expressão regular que reconhece caracteres de palavra entre fronteiras de palavra dá 38. Parte state-of-the-art em quatro, doesn't em dois, 1,234 em dois, 98.6 em dois e o URL em https, example, com e docs. Cada um desses cortes é exatamente o que o padrão manda: um carácter de palavra ali é uma letra, um algarismo ou um sublinhado, portanto hífen, apóstrofo e vírgula são todos fronteiras. O resultado ultrapassa em metade a contagem por espaços.
A segmentação Unicode, disponível no navegador e no Node como Intl.Segmenter com granularity «word», dá 33. É a única das quatro com uma especificação por trás, e as suas escolhas são bem mais humanas: mantém doesn't e That's inteiros, mantém 1,234 inteiro, mantém example.com inteiro, e parte state-of-the-art em quatro porque o padrão trata o hífen como uma rutura. Uma quarta regra, escrita para manter letras e algarismos juntos através de hífenes, apóstrofos, pontos e vírgulas internos, dá 28 — a mais próxima, entre as regras de máquina, do que uma pessoa diria se lhe pedisse para contar em voz alta.
A correção honesta: em prosa simples todos coincidem
Seria mais cómodo afirmar que as contagens de palavras divergem em toda a parte, e não é verdade. Contámos um parágrafo de 160 caracteres de prosa narrativa vulgar — sem compostos, sem algarismos, sem endereços — e os quatro métodos devolveram exatamente 29. Depois contámos 49 616 caracteres do texto inglês dos artigos deste site e obtivemos 8622 pela divisão por espaços, 8537 pela regra com hífenes, 8729 pela segmentação e 8917 pela expressão regular. Do mais baixo ao mais alto a diferença é de 4,5 %.
Portanto a afirmação real é mais estreita e mais útil do que «as contagens de palavras não são fiáveis». São fiáveis em prosa e pouco fiáveis assim que um texto mistura prosa com material legível por máquina. O nosso parágrafo técnico estende-se de 25 a 38, uma diferença de 52 %, em 188 caracteres. Uma cláusula contratual com um algarismo, um adjetivo composto, um URL e uma hora estende-se de 24 a 33, 38 %. O preditor não é o comprimento do texto, mas a densidade daquilo que não são palavras vulgares.
Onde os métodos se separam exatamente
Os compostos com hífen são a maior fonte isolada de desacordo. state-of-the-art conta como um com a divisão por espaços e com a regra de hífenes, e como quatro tanto com a expressão regular como com a segmentação Unicode. Qualquer texto com vários compostos assim — uma especificação, uma ficha de produto, um documento legal — mostrará uma diferença visível entre ferramentas só por isso.
As contrações dividem o campo de outro modo. doesn't vale uma palavra para a divisão por espaços, uma para a segmentação e uma para a regra de hífenes, mas duas para a expressão regular, que trata o apóstrofo como fronteira e deixa um t solto. O apóstrofo curvo comporta-se do mesmo modo, portanto passar um documento a aspas tipográficas não o resolve. O plural possessivo é mais discreto: the students' work conta três com todos os métodos, porque o apóstrofo está no fim da ficha e não dentro.
Os números e os endereços fazem o resto. 1,234 e 98.6 valem cada um um para três métodos e dois para a expressão regular, incapaz de distinguir um separador de milhares ou uma vírgula decimal da pontuação. Um endereço de correio vale um, dois ou três consoante o método; um URL vale um, três ou quatro. E uma sigla escrita com pontos — U.S.A. — vale uma palavra para a divisão por espaços, a segmentação e a regra de hífenes, mas três para a expressão regular. A pontuação que une duas palavras sem espaço à volta parte tudo menos a divisão por espaços: tokens—it, 2024–2026, and/or e wait…what valem todos dois para três métodos e um para o quarto.
Chinês e japonês, onde a divisão por espaços devolve 1
Pegue numa frase chinesa de dezasseis caracteres sem espaços, como as frases chinesas geralmente não têm. Dividir por espaços devolve 1: a frase toda é uma ficha. A expressão regular de caracteres de palavra devolve 0, porque a classe de caracteres de palavra num padrão sem a bandeira Unicode cobre apenas letras ASCII, algarismos e sublinhado, e um carácter chinês não é nenhum deles. A regra Unicode com hífenes devolve 2, porque a frase tem uma vírgula interna e a regra vê duas sequências de letras.
A segmentação Unicode devolve 8, e as oito fichas que encontra são as palavras que um leitor identificaria. A frase japonesa equivalente, de vinte e um caracteres, segmenta-se em onze. Isto é trabalho de dicionário e não de padrões, e é por isso que vale a pena recorrer à segmentação mesmo num produto em alfabeto latino: é o único método da lista que não devolve em silêncio uma resposta errada sobre texto para o qual não foi concebido. Também não exige conhecer a língua de antemão — segmentar a frase chinesa com a localização inglesa deu as mesmas oito fichas.
Porque a contagem de um editor e a de um processador de texto diferem
Um processador de texto conta o que o seu autor decidiu que é uma palavra, o que na prática se aproxima da divisão por espaços com alguns ajustes: está otimizado para uma pessoa que escreve prosa e quer que o número na barra de estado pareça certo. Um sistema de gestão de conteúdos conta muitas vezes com uma expressão regular, porque era o que havia na linguagem em que foi escrito. Um editor que paga à palavra pode não contar nenhuma das duas, e dividir antes o número de caracteres por um valor fixo, porque isso elimina por completo a discussão sobre os compostos.
Nenhuma faz batota. São três respostas a uma pergunta sem forma canónica, e a única coisa que corre mal é compará-las. Se lhe disserem que um texto tem 1500 palavras, esse número não tem sentido até saber que contagem o produziu. No nosso parágrafo de teste, mil palavras significam 7520 caracteres se a contagem for por espaços e 4947 caracteres se for por regex — a mesma quantidade nominal a entregar metade a mais numa leitura do que na outra.
As contagens de caracteres não escapam ao problema, deslocam-no. Um carácter é uma unidade tão disputada como uma palavra: unidades de código, pontos de código e grupos de grafemas dão três números diferentes para a mesma cadeia, e qualquer texto com um emoji ou um acento combinante produzirá os três. Desmontámos isso num artigo à parte sobre limites de caracteres; em resumo, ambas as contagens são definições, e um limite enunciado em qualquer delas está incompleto enquanto não nomear a definição.
O que fazer quando o limite é contratual
Nomeie o contador, não apenas o número. «Não mais de 2000 palavras» não é uma especificação; «não mais de 2000 palavras conforme contadas por X» é. Basta acordar uma ferramenta: ambas as partes colam o texto no mesmo contador e obtêm a mesma resposta, seja qual for a definição que implementa. O que não pode acontecer é cada parte usar a sua e descobrir a diferença depois da entrega.
Se não puder nomear uma ferramenta, enuncie uma regra em prosa: se os compostos com hífen contam como um ou como vários, se um URL conta como um, se os algarismos contam sequer. Essas três frases eliminam quase todo o desacordo, porque essas três categorias explicam quase toda a diferença de 52 % que medimos. E se quiser uma unidade realmente difícil de discutir, use caracteres sem espaços e diga que carácter quer dizer: é pior indicador do esforço e muito melhor da extensão.
| Fragmento | Divisão por espaços | Regex de caracteres de palavra | Segmentação Unicode | Regra com hífenes |
|---|---|---|---|---|
| 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 (travessão, sem espaços) | 1 | 2 | 2 | 2 |
| Uma frase chinesa de 16 caracteres | 1 | 0 | 8 | 2 |
Perguntas frequentes
- Qual é a contagem de palavras correta?
- Não há uma correta, apenas uma adequada. Se a contagem existe para que um leitor saiba que extensão tem um texto, a divisão por espaços e a segmentação Unicode servem ambas, e a segmentação abrange mais línguas. Se existe para que uma máquina indexe ou trunque, a segmentação é a única com uma especificação publicada por trás. Se existe para que dinheiro mude de mãos, a correta é aquela que ambas as partes nomearam antecipadamente.
- Porque é que a minha contagem de palavras salta quando colo de um site?
- Normalmente porque o texto colado trouxe URL, algarismos e termos com hífen, que são as três categorias em que os métodos mais divergem. O nosso parágrafo técnico de teste varia 52 % entre o método mais baixo e o mais alto, ao passo que um parágrafo narrativo vulgar dá o mesmo número com os quatro. Uma segunda causa são os caracteres invisíveis — espaços inquebráveis de um número formatado, um juntor de largura nula de um emoji — que podem fundir ou partir fichas sem mostrar nada no ecrã.
- A regex de caracteres de palavra funciona em línguas com acentos?
- Não sem ajuda. Na sua forma simples, a classe de caracteres de palavra cobre letras ASCII, algarismos e sublinhado, o que significa que uma letra acentuada é uma fronteira e não parte de uma palavra. Um texto francês ou português ficará portanto sobrecontado, com cada palavra acentuada partida no acento. O remédio é escrever o padrão sobre as propriedades Unicode de letra e número, que é o que a regra com hífenes deste artigo faz, ou usar segmentação e saltar a pergunta.
- O Intl.Segmenter está disponível em toda a parte?
- Faz parte do padrão de internacionalização do ECMAScript e está presente nos navegadores atuais e no Node, onde produzimos todos os números deste artigo. A ressalva prática não é a disponibilidade mas os dados: a qualidade da segmentação depende dos dados de localização com que o motor foi distribuído, pelo que dois ambientes podem divergir ligeiramente sobre o mesmo texto. Para contar prosa em alfabeto latino a diferença é desprezável; para o japonês, onde a segmentação é um verdadeiro problema de dicionário, não é.
- Como deve um contador de palavras tratar os emoji?
- De forma coerente, e normalmente não os contando como palavras. No nosso teste, «Great work 👍 thanks» dá quatro com a divisão por espaços, que conta o emoji como palavra, e três com os outros métodos, que não. Nenhuma está errada, mas um contador que indique quatro devia dizê-lo, porque de outro modo quem escreve com um limite reservará uma palavra que não transporta texto nenhum. Seja qual for a sua escolha, aplique-a a todo o documento e não emoji a emoji.
- Posso converter entre contagens de palavras com uma razão fixa?
- Apenas muito grosseiramente, e apenas para prosa. Sobre 50 000 caracteres de texto de artigo vulgar os quatro métodos mantiveram-se dentro de 4,5 % uns dos outros, portanto uma única razão é ali uma aproximação viável. Num parágrafo técnico esses mesmos quatro afastam-se 52 %, e nenhuma razão sobrevive a isso. Se tiver de estimar, estime a partir dos caracteres: a nossa prosa de artigo em inglês ronda os 5,75 caracteres por palavra à conta dos espaços, e esse valor é muito mais estável entre tipos de texto do que a razão entre duas regras de contagem.
Artigos que podem interessar-lhe
Todos os guias →Ferramentas relacionadas
Fontes
- 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)
Detetaste um erro neste artigo?