Um mecanismo de busca de 80 linhas feito em Python
- Em setembro passado, entrei para a Wallapop como cientista de dados de busca, trabalhando com o mecanismo de busca open source Solr.
- Para entender os princípios básicos de um mecanismo de busca, decidi criar um do zero usando Python.
- O objetivo é resolver a "crise de descobribilidade de sites pequenos", tornando grandiosos novamente os pequenos sites que não podem ser encontrados com mecanismos de busca como o Google.
- Neste texto, é apresentado o processo de criação de um mecanismo de busca com Python, e todo o código escrito pode ser visto no repositório
microsearch no GitHub.
- O mecanismo de busca implementado não é um mecanismo pronto para produção, mas sim um exemplo funcional e lúdico que mostra como um mecanismo de busca funciona internamente.
microsearch
- São examinados os componentes que formam o
microsearch e explorado como cada um foi construído: (1) crawler, (2) índice invertido, (3) ranqueamento, (4) interface.
Crawler
- O primeiro passo para criar um mecanismo de busca é obter os dados que serão pesquisados.
- Com a intenção de criar um "Google local", o mecanismo de busca foi construído usando os dados dos blogs que acompanho.
- O crawling envolve o processo de baixar e organizar todos os posts de uma lista específica de blogs.
- Para ficar mais rápido, a biblioteca Python
asyncio foi usada para reduzir o tempo de crawling de 20 minutos para 20 segundos.
- Foram usados 642 feeds RSS; cerca de 100 deles são blogs que leio com frequência, e os outros 500 vieram do projeto de blog
surprisetalk.
Índice invertido
- Um índice invertido é uma estrutura de dados que mapeia palavras-chave para documentos, permitindo encontrar facilmente os documentos em que uma determinada palavra aparece.
- Quando o usuário pesquisa uma consulta, o índice invertido é usado para buscar todos os documentos que correspondem às palavras-chave da consulta.
- A lógica do índice invertido está definida dentro de uma classe chamada
SearchEngine e foi implementada inicializando dois dicionários.
Ranqueamento
- Quando há um conjunto de documentos correspondentes para uma determinada consulta, é necessário um método para ordená-los.
- O método de ranqueamento mais famoso é o PageRank do Google, mas também existem outras opções que classificam documentos com base no conteúdo, como o BM25.
- Foram implementadas as partes que faltavam da classe
SearchEngine, incluindo a forma de calcular a pontuação BM25.
Interface
- Depois de construir o mecanismo de busca, a ideia é disponibilizá-lo de alguma forma.
- Foi criado um app com FastAPI para fornecer endpoints que expõem o mecanismo de busca e renderizam uma página web simples na qual é possível realizar buscas.
- Para facilitar a leitura da saída, decidiu-se selecionar apenas as N principais URLs.
Funcionalidades ausentes
- Leitores que lidam com mecanismos de busca com frequência provavelmente perceberão que muitas funcionalidades estão ausentes na implementação.
- Estão ausentes operadores de consulta, indexação de n-gram, expansão de consulta ou de documentos, além da capacidade de executar crawling e indexação ao mesmo tempo.
Conclusão
- Ao conduzir este projeto, passei a entender melhor o funcionamento interno do Solr e aprendi o poder do código assíncrono.
- Como próximo passo para criar um mecanismo de busca pessoal, há o plano de implementar busca semântica no mecanismo.
Opinião do GN⁺
- O ponto mais importante deste texto é que uma pessoa pode criar diretamente seu próprio mecanismo de busca para melhorar a descobribilidade de sites pequenos.
- A experiência de simplificar e implementar um mecanismo de busca com funcionalidades complexas usando Python e bibliotecas open source pode inspirar até engenheiros de software iniciantes.
- Ao mostrar, por meio de um exemplo prático, a eficiência da programação assíncrona e a importância das estruturas de dados, este texto oferece insights técnicos e oportunidades reais de aprendizado.
1 comentários
Opiniões do Hacker News
Desenvolvimento de um mecanismo de busca BM25 com Pandas
Revisão de código: classe
SearchEnginek1eb, e não há absolutamente nenhum comentário no código._documentsuse a URL como chave e o conteúdo dessa URL como valor.A complexidade dos mecanismos de busca
Opinião sobre número de linhas de código
Piada sobre uma expressão no código
chunk for chunk in chunks if chunkno código, veio à mente uma piada sobre lenhadores.Exemplo de código de mecanismo de recomendação
Comparação de desempenho de bibliotecas de parsing
lxml.htmlelxml.html.cleanpodem ser muito mais rápidos queBeautifulSoup.Conselho sobre uso de palavras-chave
Opinião sobre um projeto educacional
Dúvida sobre o uso de Python para processamento de grandes volumes de dados