$cat ~/posts/aprendendo-nlp-sem-dsa

bilíngue · en / pt

← /blog

aprendendo NLP sem uma base sólida em DSA (e pagando o preço disso)


Escolhi NLP como primeiro tópico sério da minha trilha de AI Engineering. Fazia sentido: eu já ia usar spaCy no trabalho, tinha curso de NLP andando na Udemy em paralelo com o tutorial oficial da documentação, e o assunto conectava direto com o que eu precisava entregar. O problema apareceu um pouco depois, quando percebi que estava conseguindo chegar no resultado sem entender por que aquilo funcionava daquele jeito.

o sintoma

No começo, tudo parecia ir bem. doc = nlp(texto), itera nos tokens, pega .pos_, .dep_, .ent_type_, monta a lógica em cima disso. O curso avançava, os exercícios passavam, o código rodava. Só que na hora de aplicar isso em manipulação de token de verdade: filtrar, reagrupar, navegar pela árvore de dependência, otimizar uma varredura que precisava rodar em cima de volumes reais de texto, eu travava. Não porque não entendia NLP. Porque não entendia estrutura de dados.

E aí caiu a ficha: um Doc do spaCy é uma estrutura de dados otimizada. Os tokens vivem como views sobre um buffer contíguo de dados numéricos (o Vocab e os hashes de string), e cada Token é essencialmente um índice nessa estrutura. Manipular isso com eficiência é, na prática, o mesmo tipo de raciocínio que manipular um array em DSA pura: entender custo de acesso, custo de slicing, quando você está copiando dado e quando está só apontando pra ele, quando uma iteração é O(n) e quando ela vira O(n²) porque você não percebeu que enfiou uma busca linear dentro de um loop.

Só que eu nunca tive isso solidificado. E o motivo é bem direto: minha faculdade não entregou uma base decente de DSA. Passei pela disciplina, tirei nota, segui em frente, mas o conteúdo real de "como pensar em complexidade, estruturas e trade-offs" simplesmente não ficou.

DSA e NLP em paralelo

A solução que encontrei não foi pausar o NLP pra "voltar depois com uma base melhor". Isso empurraria a aplicação prática pra um futuro incerto, e eu já tinha entrega no trabalho. Em vez disso, passei a estudar as duas coisas em paralelo, de propósito:

  • NLP/spaCy continua andando: curso, documentação, aplicação direta no projeto.
  • DSA entrou como trilha própria, estudada em paralelo, especificamente pra sustentar o que o spaCy exige na prática: entender como uma sequência de tokens se comporta como estrutura de dados, o que significa manipular um Span, por que fatiar um Doc é diferente de fatiar uma lista Python comum, e como pensar em complexidade quando a entrada é texto real, não um array de brinquedo de curso introdutório.

Nessa frente, o curso de DSA do Augusto Galego tem sido a peça que mais está ajudando até agora. É o material que está realmente preenchendo o buraco que a faculdade deixou, não só ensinando estrutura de dados no abstrato, mas de um jeito que eu consigo puxar direto pra dentro do raciocínio que uso no spaCy.

Isso significa estudar os dois assuntos com o outro em mente o tempo todo. Toda vez que um conceito de DSA aparece (arrays, ponteiros, janelas deslizantes, buscas), eu tento imediatamente mapear pra alguma operação real que faço em cima de tokens do spaCy. E toda vez que esbarro numa limitação na hora de manipular tokens, esse é o sinal de qual buraco de DSA eu preciso fechar primeiro.

por que isso importa

Dá pra usar uma biblioteca como o spaCy sem entender nada disso: ela é feita pra isso, é de alto nível o suficiente pra funcionar assim. O problema é que sem essa base, você fica refém do que a biblioteca já resolveu pra você. No momento em que a aplicação real pede algo fora do caminho feliz da documentação: uma extração de padrão que precisa ser eficiente em volume, uma manipulação de span que não é trivial, uma decisão entre reconstruir uma estrutura ou navegar in-place, a ausência de DSA vira um teto bem baixo, bem rápido.

E isso é especialmente verdade quando o contexto é aplicado, não acadêmico. É sobre um pipeline que processa documento real, com volume real, dentro de um prazo real de sprint.

onde isso me deixa agora

Ainda estou nesse meio-termo pouco confortável: sólido o suficiente em NLP pra ser produtivo, mas reconstruindo por baixo a estrutura que deveria ter vindo antes. A trilha de DSA anda junto com o trabalho, e o critério é internalizar o raciocínio de estrutura e complexidade que devia ter sido a base antes de qualquer coisa de IA.

Se tem algo que essa fase está deixando bem claro é que "aprender IA" sem essa base é dívida técnica pessoal, e ela cobra juros exatamente na hora em que você mais precisa que o código funcione bem: em produção, com dado de verdade.

Uma coisa boa que já está saindo desse processo: vou começar um clube de DSA no trabalho com um especialista em Android do meu departamento que virou amigo no caminho. Ele sente o mesmo buraco que eu, só que do lado Android, e estudar isso em grupo tem mais chance de virar hábito de verdade do que estudar sozinho.