6 puntos por GN⁺ 2024-02-08 | 1 comentarios | Compartir por WhatsApp

Un motor de búsqueda de 80 líneas hecho en Python

  • En septiembre pasado me uní a Wallapop como científico de datos de búsqueda, trabajando con un motor de búsqueda de código abierto llamado Solr.
  • Para entender los principios básicos de un motor de búsqueda, decidí crear uno desde cero usando Python.
  • El objetivo es resolver la "crisis de descubribilidad de los sitios web pequeños", haciendo que los sitios web pequeños que no se pueden encontrar con motores de búsqueda como Google vuelvan a ser grandiosos.
  • En este artículo se guía el proceso de crear un motor de búsqueda con Python, y todo el código escrito se puede revisar en el repositorio microsearch de GitHub.
  • El motor de búsqueda implementado no es un motor listo para producción, sino un ejemplo de juguete funcional que muestra cómo opera internamente un motor de búsqueda.

microsearch

  • Se revisan los componentes que conforman microsearch y cómo se construyó cada uno: (1) crawler, (2) índice invertido, (3) ranking, (4) interfaz.

Crawler

  • El primer paso para crear un motor de búsqueda es conseguir los datos sobre los que se va a buscar.
  • Con la idea de crear un "Google local", se construyó el motor de búsqueda usando los datos de los blogs que sigo.
  • El crawling incluye el proceso de descargar y depurar todos los posts de una lista específica de blogs.
  • Para hacerlo más rápido, se usó la biblioteca de Python asyncio y se redujo el tiempo de crawling de 20 minutos a 20 segundos.
  • Se usaron 642 feeds RSS; de ellos, alrededor de 100 son blogs que leo con frecuencia y los otros 500 fueron tomados del proyecto de blogs surprisetalk.

Índice invertido

  • El índice invertido es una estructura de datos que mapea palabras clave a documentos, lo que permite encontrar fácilmente los documentos donde aparece una palabra específica.
  • Cuando el usuario busca una consulta, se usa el índice invertido para recuperar todos los documentos que coinciden con las palabras clave de la consulta.
  • La lógica del índice invertido está definida dentro de una clase llamada SearchEngine, y se implementa inicializando dos diccionarios.

Ranking

  • Una vez que se tiene un conjunto de documentos que coinciden con una consulta dada, hace falta una forma de ordenarlos.
  • El método de ranking más famoso es PageRank de Google, pero también existen otras opciones como BM25, que clasifica documentos con base en el contenido.
  • Se implementa la parte faltante de la clase SearchEngine, incluyendo cómo calcular la puntuación BM25.

Interfaz

  • Después de construir el motor de búsqueda, se quiere publicarlo de alguna manera.
  • Se construyó una app con FastAPI para ofrecer endpoints que expongan el motor de búsqueda y renderizar una página web sencilla donde se pueda buscar.
  • Para que la salida sea fácil de leer, se decidió seleccionar solo las primeras N URL.

Funciones faltantes

  • Si eres un lector que trabaja seguido con motores de búsqueda, podrás notar que faltan muchas funciones en la implementación.
  • Faltan operadores de consulta, indexación n-gram, expansión de consultas o documentos, y la capacidad de hacer crawling e indexación al mismo tiempo.

Conclusión

  • Al avanzar con este proyecto, logré entender mejor cómo funciona Solr por dentro y aprendí lo sorprendente que puede ser escribir código asíncrono.
  • Como siguiente paso para crear un motor de búsqueda personal, planeo implementar búsqueda semántica en el motor.

Opinión de GN⁺

  • Lo más importante de este artículo es que una persona puede crear directamente su propio motor de búsqueda para mejorar la descubribilidad de sitios web pequeños.
  • La experiencia de simplificar e implementar un motor de búsqueda con funciones complejas usando Python y bibliotecas de código abierto puede inspirar incluso a ingenieros de software principiantes.
  • Al mostrar la eficiencia de la programación asíncrona y la importancia de las estructuras de datos mediante un ejemplo real, este artículo ofrece ideas técnicas y oportunidades prácticas de aprendizaje.

1 comentarios

 
GN⁺ 2024-02-08
Comentarios en Hacker News
  • Desarrollo de un motor de búsqueda BM25 con Pandas

    • El desarrollador está creando un motor de búsqueda BM25 rápido que funciona sobre Pandas.
    • La razón para usar Pandas es que, además del algoritmo BM25, permite combinar fácilmente otros factores como actualidad y popularidad.
    • En la coincidencia de frases hay muchos casos especiales, y es importante comprimir la información de posición usando la menor memoria posible.
  • Revisión de código: clase SearchEngine

    • No queda claro qué significan los parámetros k1 y b, y el código no tiene comentarios.
    • Se supone que _documents usa la URL como clave y el contenido de esa URL como valor.
    • Es una lástima que el código no esté bien documentado. Si lo estuviera, podría haber sido un material útil para aprender a construir motores de búsqueda.
  • La complejidad de los motores de búsqueda

    • La principal dificultad de un motor de búsqueda es manejar el volumen de datos.
    • La lógica en sí es sorprendentemente simple, y el proyecto tiene éxito al eliminar la mayoría de las partes innecesarias.
    • Más que hacer el motor de búsqueda más grande, lo importante es hacer los datos más pequeños o aumentar la relación señal-ruido.
  • Opiniones sobre el número de líneas de código

    • Se cuestiona qué sentido tiene presumir la cantidad de líneas de código cuando se usan dependencias externas.
    • Aunque no existe una unidad SI para una base de código, se comenta que de algún modo habría que medir la carga cognitiva.
  • Broma sobre una expresión en el código

    • Al ver la expresión chunk for chunk in chunks if chunk en el código, a alguien le vino a la mente un chiste sobre leñadores.
  • Ejemplo de código para un motor de recomendación

    • Se ofrece código de menos de 20 líneas en Python para un motor de recomendación que puede usarse junto con el motor de búsqueda.
    • Genera recomendaciones a partir de las URL clicadas en los registros de sesión.
    • Si se mezclan las consultas registradas con las URL clicadas, también se pueden obtener sugerencias de corrección ortográfica.
  • Comparación de rendimiento de bibliotecas de parsing

    • Se menciona que lxml.html y lxml.html.clean pueden ser mucho más rápidos que BeautifulSoup.
  • Consejo sobre el uso de palabras clave

    • Se recomienda usar 2-gram y 3-gram en lugar de 1-gram para mejorar la calidad de los resultados de búsqueda en inglés.
    • Los n-gram ayudan a mantener el contexto.
  • Opinión sobre el proyecto como herramienta educativa

    • Se comenta que el proyecto es muy bueno y educativo, pero se recomienda no desplegarlo en producción.
    • Para proyectos de mayor escala que manejan decenas de miles de documentos, la respuesta es usar FTS5 de SQLite.
  • Duda sobre usar Python para procesar grandes volúmenes de datos

    • Se plantea la duda de si realmente es buena idea usar Python (un lenguaje lento) para trabajos que requieren procesar grandes volúmenes de datos con rapidez.