6 pontos por GN⁺ 2024-02-08 | 1 comentários | Compartilhar no WhatsApp

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

 
GN⁺ 2024-02-08
Opiniões do Hacker News
  • Desenvolvimento de um mecanismo de busca BM25 com Pandas

    • O desenvolvedor está trabalhando em um mecanismo de busca BM25 rápido que funciona no Pandas.
    • O motivo de usar Pandas é que, além do algoritmo BM25, ele facilita combinar outros fatores como atualidade e popularidade.
    • Há muitos casos excepcionais em correspondência de frases, e é importante comprimir as informações de posição usando o mínimo possível de memória.
  • Revisão de código: classe SearchEngine

    • Não está claro o significado dos parâmetros k1 e b, e não há absolutamente nenhum comentário no código.
    • Presume-se que _documents use a URL como chave e o conteúdo dessa URL como valor.
    • É uma pena que o código não esteja bem documentado. Se estivesse, poderia ter sido um material útil para aprender a construir um mecanismo de busca.
  • A complexidade dos mecanismos de busca

    • A principal dificuldade de um mecanismo de busca é lidar com o volume de dados.
    • A lógica em si é surpreendentemente simples, e o projeto foi bem-sucedido ao eliminar a maior parte do que era desnecessário.
    • Em vez de tornar o mecanismo de busca maior, é importante adotar uma abordagem de reduzir os dados ou aumentar a relação sinal-ruído.
  • Opinião sobre número de linhas de código

    • Questiona-se qual é o sentido de se gabar do número de linhas de código quando há uso de dependências externas.
    • Não existe uma unidade SI para uma base de código, mas há a opinião de que a carga cognitiva deveria ser medida de alguma forma.
  • Piada sobre uma expressão no código

    • Ao ver a expressão chunk for chunk in chunks if chunk no código, veio à mente uma piada sobre lenhadores.
  • Exemplo de código de mecanismo de recomendação

    • É fornecido um código de mecanismo de recomendação com menos de 20 linhas em Python para usar junto com o mecanismo de busca.
    • Ele gera recomendações com base nas URLs clicadas nos logs de sessão.
    • Se misturar as consultas inseridas nos logs com as URLs clicadas, também é possível obter sugestões de correção ortográfica.
  • Comparação de desempenho de bibliotecas de parsing

    • É mencionado que lxml.html e lxml.html.clean podem ser muito mais rápidos que BeautifulSoup.
  • Conselho sobre uso de palavras-chave

    • Recomenda-se usar 2-gram e 3-gram em vez de 1-gram para melhorar a qualidade dos resultados de busca em inglês.
    • N-grams ajudam a preservar o contexto.
  • Opinião sobre um projeto educacional

    • O projeto é muito legal e educativo, mas recomenda-se não colocá-lo em produção.
    • Para projetos maiores que lidam com dezenas de milhares de documentos, a solução é usar o FTS5 do SQLite.
  • Dúvida sobre o uso de Python para processamento de grandes volumes de dados

    • Questiona-se se realmente é uma boa ideia usar Python (uma linguagem lenta) em trabalhos que precisam processar grandes volumes de dados rapidamente.