📚 Criando uma API open-source para questões do ENEM
Olá turma do TabNews! Hoje gostaria de compartilhar com vocês um pouco sobre a origem e processo de criação do projeto enem.dev, uma API pública e open-source para listagem de provas e questões do ENEM.
Atualmente a API conta com 2700+ questões, dos anos de 2009 a 2023. Mas também planejo mantê-la atualizada com os dados dos anos subsequentes.
Como o projeto surgiu
A cerca de 6 meses atrás, recebi uma demanda na empresa onde eu trabalho, na qual seria necessário montar alguns quizzes utilizando os dados de questões do ENEM. Para minha surpresa, não havia nenhum lugar onde esses dados estivessem disponíveis de forma simples, e que pudessem ser acessados de forma programática, como uma API ou mesmo alguns arquivos JSON.
O que eu encontrei como fonte de dados foram alguns PDFs disponibilizados pelo INEP, da aplicação de cada prova em seu respectivo ano. Com isso, inicializou-se um longo e cansativo processo de tratamento de dados, com a finalidade de transformá-los em algo “utilizável”, programaticamente falando.
Ao fim deste processo, surgiu a ideia de criar uma API, com a intenção de facilitar o acesso a esses dados, para que outros desenvolvedores no futuro não precisassem gastar a mesma energia que eu gastei.
Os desafios e o que aprendi com eles
Visto que meus inputs seriam alguns PDFs, a ideia central era transformá-los em arquivos JSON, nos quais eu pudesse usar de forma mais simples na hora da criação dos quizzes. No entanto, esse processo é mais fácil na teoria do que na pratica.
Minha primeira tentativa foi transformar esses PDFs em texto e extrair os dados utilizando algumas RegEx. Apesar de ter sucesso em separar as questões e quais seriam as alternativas de cada questão, eu logo esbarrei no meu primeiro desafio: obter as imagens da questão e as alternativas corretas.
Além disso, a conversão de PDF para texto não era confiável e frequentemente trazia alguns caracteres especiais. Foi então que passei a transformar cada página do PDF em uma imagem, e editá-la de forma programática, transformando-as no que eu denominei de “stripes”.
Isso tornou a extração de texto um pouco mais assertiva, e permitiu a extração das imagens através de uma fórmula, que julgava se havia ou não uma imagem na questão baseado no espaçamento entre as linhas.
Ainda assim, havia outros desafios a serem enfrentados, como a formatação e layout de cada prova, que mudava conforme o ano em que a prova era aplicada. Mas o principal problema ainda era o fato de que eu não tinha confiança na assertividade do script, o que me fez mudar para a próxima (e última) estratégia: um bom e velho web scraper.
Apesar de trabalhoso, essa foi uma oportunidade de aprender sobre (ou aprofundar em) vários assuntos: como OCR, RegEx e manipulação de imagens utilizando sharp.
O que eu gostaria de deixar como recado aqui é: não tenha medo de embarcar nessas “aventuras”, apesar do código das primeiras tentativas não ter sido utilizado para a task final, há muito conhecimento valioso a ser absorvido ao longo do caminho.
Ideias de projetos
Afinal, agora que temos essa API, o que podemos construir com isso? Bom, aqui estão algumas ideias de projetos:
- Flashcards — Uma ideia para treinar um pouco de UI/UX e aprofundar seus conhecimentos em front-end. A frente do card pode conter a questão e o verso a alternativa correta.
- SDK para a linguagem X — Pra quem nunca criou e/ou publicou uma biblioteca em um package manager, essa pode ser uma oportunidade de aprender mais sobre esse processo. Além é claro, de lidar com CI/CD e os desafios de manter um projeto open-source.
- Análise de dados — Se você tem interesse em aprender sobre machine learning e possivelmente tornar-se um analista de dados, sinta-se livre para fazer um estudo em cima dos dados brutos, quem sabe encontrar algum padrão nas questões, identificar os assuntos que são cobrados com mais frequência e até mesmo sugerir uma rotina de estudo mais otimizada.
- Inteligência Artificial — Que tal embarcar no hype da IA e treinar um modelo em cima desses dados? Imagine os prompts que o usuário poderia fazer nesse modelo, como por exemplo, pedir uma questão sobre geometria plana e a explicação de como resolvê-la.
Se você não planeja construir algo, mas tem alguma ideia interessante, considere compartilhar ela nos comentários, pois algum desenvolvedor motivado pode transformá-la em realidade.
Caso você venha a construir algo, considere compartilhar no repositório do GitHub através de uma issue. Dependendo da quantidade de submissões, posso criar uma seção no site para divulgá-los.
Conclusão
Por fim, agradeço por terem lido até aqui e espero que essa API possa mexer um pouquinho no ponteiro da educação brasileira. Para isso, gostaria muito de contar com a sua colaboração, seja através de um projeto que utilize da API, feedback nos comentários, compartilhando o projeto com amigos, ou deixando uma estrelinha no GitHub :)