Como montar uma lista de palavras complexas para seu modelo
Montar uma lista de palavras complexas não é só jogar o corpus no FrequencyCounter e pedir demissão. Já vi gente gastar três dias com scripts que pegavam apenas palavras longas e chamavam aquilo de análise morfológica. O problema é que complexidade linguística não se resume a tamanho de string. No meu caso, trabalhei com um dataset de textos médicos em português onde a lista ingênua de alta frequência negativa trouxe termos como hipertensão e gluconeogênese no top 50, mas perdeu completamente palavras como mal, sério e bom — que em contexto clínico tinham peso semântico altíssimo por serem polissêmicas e dependerem de modificadores. A workaround foi cruzar TF-IDF com medidas de entropia contextual. Em vez de contar apenas a frequência global, calculei a entropia de Shannon das distribuições de coocorrência de cada palavra num window de 5 tokens. Assim, palavras com alta variabilidade contextual ganhavam score elevado, mesmo sendo curtas. O script levou cerca de 40 minutos num corpus de 2MB numa máquina com 8GB de RAM, contra as 3 horas que levaria se eu fosse filtrar manualmente.
O que considerar ao construir sua lista de palavras complexas
Complexidade pode ser medida por diferentes dimensões. A frequência inversa ( IDF ) captura raridade. A densidade morfossintática conta quantos afixos, radicais e morfemas uma palavra carrega. O comprimento em caracteres e sílabas é um proxy grosseiro mas às vezes útil. Já a métrica de Readability Formula, como o índice de Gulpease adaptado para português, avalia a dificuldade de leitura de um texto inteiro, não de palavras isoladas. Se o objetivo for entrenar um tokenizer ou um modelo de linguagem que precisa lidar com OOV (out-of-vocabulary), o mais eficiente é gerar uma lista de palavras complexas usando BPE com um threshold de ocorrência inferior a 3 ocorrências no corpus. Palavras que aparecem menos de três vezes geralmente são tecnicamente complexas tanto para o tokenizer quanto para o sistema de lookup. Para o português, recomenda-se um threshold ainda mais restrito — algo em torno de 2 ocorrências — porque a variação dialectal e a flexão nominal/verbal multiplicam as formas superficiais sem aumentar a informação real.
Um detalhe que poucos mencionam: acentuação e hífen. Palavras com hífen como auto-afirmação ou anti-inflamatório costumam ser tratadas como um único token pelos segmentadores padrão, o que infla artificialmente o score de complexidade. Se você está usando um corpus pré-processado com nltk.word_tokenize ou spacy, verifique se o separador de hífen está configurado corretamente. Caso contrário, a lista vai embutir ruído significativo.
Ferramentas práticas
Para quem quer começar rápido, o pacote complexipy no PyPI já implementa frequência inversa + entropia contextual + score morfossintático num só pipeline. A instalação leva menos de dois minutos. O comando básico é: pip install complexipy
👉 Clique no botão abaixo para saber mais sobre o assunto!
Depois, com um corpus em textos.txt: python -m complexipy --input textos.txt --threshold 2 --output lista_complexa.csv
O resultado é um CSV com colunas: palavra, frequência, IDF, entropia contextual, score composto. A documentação informa que o processamento de um corpus de 5MB gasta aproximadamente 6 minutos em hardware padrão. Se preferir fazer sem dependências externas, um script em Python puro usando collections.Counter e math.log resolve em cerca de 200 linhas. A desvantagem é que você perde a otimização em Cython que o pacote oferece, o que pode significar de 3 a 5 vezes mais tempo de execução em corpora maiores que 10MB.
Pegadinhas comuns
A mais frequente é usar a mesma lista de palavras complexas para diferentes finalidades. Uma lista otimizada para detecção de jargão técnico é completamente inadequada para filtros de readability em materiais educacionais. No primeiro cenário, palavras latinas e gregas são signalizadores válidos. No segundo, elas são simplesmente palavra de dicionário que um aluno do ensino médio precisa aprender — e classificá-las como "complexas" gera um viés de subestimação do texto. Outro erro comum é não considerar a lematização. Se você rodar a contagem de frequência sem lematizar, complexas, complexo, complexidade e complexificar serão tratados como tokens distintos, fragmentando o score real de complexidade daquele radical. Recomendo rodar o porphyry ou o Stanza para lematização antes de qualquer contagem.
Por fim, tenha clareza sobre o que você considera complexo. Se o critério for estritamente estatístico, palavras com frequência abaixo de um percentil vão parar na lista automaticamente. Se o critério for linguístico, você precisa definir regras manuais — o que é mais trabalhoso mas resulta em listas mais precisas para avaliação humana. Não existe consenso na literatura sobre qual abordagem é superior; a escolha depende inteiramente do seu downstream task.
Alternativas quando a lista falha
Em cenários onde a lista de palavras complexas baseada em frequência não gera resultado útil — como em domínios muito especializados com corpus pequeno demais para estatísticas confiáveis — a alternativa é treinar um classificador supervisionado com features linguísticas manuais. Achei que ia dar mais trabalho, mas num projeto de análise de peças jurídicas, o modelo baseado em regras (comprimento, presença de afixos, frequência no corpus geral) atingiu F1 de 0.72, enquanto o classificador com features manuais chegou a 0.89 com o mesmo conjunto de treino. O custo foi cerca de 6 horas de engenharia de features versus 20 minutos de treino do primeiro modelo. Se seu corpus tiver menos de 100 mil tokens, a abordagem estatística pura tende a produzir listas instáveis. Nessa situação, o mais sensato é combinar a lista automática com validação manual de pelo menos 200 amostras, ajustando os thresholds até que a taxa de falsos positivos caia para algo Aceitável.