Ir para o conteúdo
OneKitly

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

Daniel OkonkwoProgramador front-end e redator de Tecnologia na OneKitly

Desempenho web · Formatos de ficheiro

Verificado a partir de 5 fontes

Ver perfil
Em resumo

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.

Regex de caracteres de palavra
O mesmo fragmento contado de quatro maneiras — Node 26, Intl.Segmenter com granularity "word"
FragmentoDivisão por espaçosRegex de caracteres de palavraSegmentação UnicodeRegra com hífenes
state-of-the-art1441
doesn't1211
1,2341211
U.S.A.1311
https://example.com/docs1433
tokens—it (travessão, sem espaços)1222
Uma frase chinesa de 16 caracteres1082
Contar ocorrênciasConte quantas vezes uma palavra ou frase aparece no seu texto.Experimentar a ferramenta

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
GuiaFormatar números para seis línguas: separadores, moeda e o regresso ao valor1 234,56 e 1,234.56 são o mesmo número, e confundi-los muda o valor que um leitor lê. Corremos Intl.NumberFormat para as seis localizações do site e imprimimos cada separador — incluindo o invisível que o francês usa — e depois medimos porque parseFloat não consegue desfazer nada disso.ExplicaçãoFrequência de palavras e lei de Zipf: contámos seis livros em seis línguas e ajustámos o decliveA palavra de posição n aparece cerca de 1/n vezes em relação à primeira. Contámos seis livros de domínio público, imprimimos posição × frequência, ajustámos log frequência contra log posição e obtivemos declives entre -1,02 e -1,08 nas seis línguas — e os dois pontos onde a lei falha.ExplicaçãoOnde uma linha pode quebrar: o algoritmo Unicode por trás de cada parágrafo ajustado«Quebrar nos espaços» falha na maioria dos sistemas de escrita. O UAX #14 dá a cada caráter uma classe de quebra de linha; procurámos as nossas no Unicode 17.0.0 e executámos uma implementação conforme sobre espaços inquebráveis, hifenes condicionais, espaços de largura zero, URL, japonês e tailandês.ExplicaçãoOs emoji são mais difíceis do que parecem: porque «basta retirá-los» não tem resposta numa linhaUm emoji visível pode valer um ponto de código ou catorze unidades UTF-16. Corremos três expressões regulares populares sobre uma frase real e cada uma falhou de maneira diferente; uma apagou os algarismos. Eis porquê, que propriedade Unicode responde a que pergunta, e a regra de grupos de grafemas que funciona mesmo.GuiaOs limites de caracteres que realmente mordem: unidades de código, pontos de código e grafemasUm caráter são três coisas ao mesmo tempo. Um emoji com tom de pele é 1 grafema, 2 pontos de código e 4 unidades UTF-16. Todas as contagens deste guia foram medidas em Node, mais porque é que um SMS cai de 160 para 70 e porque é que VARCHAR(255) não são 255 de coisa nenhuma em concreto.ExplicaçãoO que medem realmente os índices de legibilidade (e as três coisas que não veem)O Flesch Reading Ease e o nível Flesch-Kincaid contam sílabas e comprimento de frase. Mais nada. As duas fórmulas na íntegra, uma passagem pontuada de ponta a ponta e o truque da vírgula que oferece 3,9 anos de escolaridade sem mudar uma palavra.

Ferramentas relacionadas

Fontes

Detetaste um erro neste artigo?