Encontrando palavras escondidas dentro de outras palavras
Muita gente acha que isso é só um passatempo de revista, mas na verdade envolve segmentação morfológica e reconhecimento de padrões que linguistas computacionais levaram décadas para formalizar. O exercício básico é pegar uma palavra longa e identificar subsequências que também são palavras válidas no dicionário.
Como funcionam as palavras escondidas em outras palavras
A lógica é simples: você tem uma string como "programação" e precisa encontrar todas as sequências contíguas que formam palavras reais. "Pro", "gra", "ma", "mação" não valem, mas "grama", "ação", "ração" podem valer dependendo do dicionário usado. Na prática, o problema é muito mais chato do que parece. Eu passei uma tarde inteira tentando construir um gerador automático de palavras cruzadas com esse conceito e descobri que a maior armadilha é a ambiguidade de fronteiras. Onde termina uma palavra e começa outra?
👉 Clique no botão abaixo para saber mais sobre o assunto!
Por exemplo, em "estrela", você pode ler "estrela" completo, mas também "estre", "trela", "rela", "ela". O dicionário que eu usei na época não tinha "estre" como entrada válida, então eu quase descartava a palavra inteira por causa de um bug na lookup table. A solução foi adicionar um dicionário expandido com variação morphológica, não apenas formas lematizadas. O que poucos mencionam é que a densidade de palavras escondidas varia drasticamente entre línguas. Português tem vantagem porque nossas palavras frequentemente terminam em vogais ou consoantes comuns que servem como start de outras palavras. Inglês é mais restritivo com clusters consonantais.
Também existe o problema das palavras truncadas. Se você usar um dicionário padrão, vai perder centenas de combinações válidas que são aceita no uso informal mas não entram nas bases formais. Eu aprendi isso na hard way quando meu script retornava zero palavras para "extraordinário" até eu cross-reference com uma lista de morfemas port pegos de corpora linguísticos. Se você quer implementar isso de verdade, esqueça fazer split manual. Use automata finitos ou pelo menos regex com lookbehind/lookahead apropriado. E tenha um dicionário de referência robusto, senão seu output será apenas ruído.