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
Comentarios en Hacker News
Desarrollo de un motor de búsqueda BM25 con Pandas
Revisión de código: clase
SearchEnginek1yb, y el código no tiene comentarios._documentsusa la URL como clave y el contenido de esa URL como valor.La complejidad de los motores de búsqueda
Opiniones sobre el número de líneas de código
Broma sobre una expresión en el código
chunk for chunk in chunks if chunken 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
Comparación de rendimiento de bibliotecas de parsing
lxml.htmlylxml.html.cleanpueden ser mucho más rápidos queBeautifulSoup.Consejo sobre el uso de palabras clave
Opinión sobre el proyecto como herramienta educativa
Duda sobre usar Python para procesar grandes volúmenes de datos