Un moteur de recherche de 80 lignes écrit en Python
- En septembre dernier, l’auteur a rejoint Wallapop comme data scientist spécialisé en recherche, avec pour mission de travailler sur Solr, un moteur de recherche open source.
- Pour comprendre les principes fondamentaux d’un moteur de recherche, il a décidé d’en créer un depuis zéro en Python.
- L’objectif est de résoudre la « crise de découvrabilité des petits sites web » en redonnant de la visibilité aux petits sites introuvables via des moteurs comme Google.
- Cet article explique le processus de création d’un moteur de recherche en Python, et tout le code écrit est disponible dans le dépôt GitHub
microsearch.
- Le moteur de recherche implémenté n’est pas un moteur prêt pour la production, mais un exemple jouable et fonctionnel qui montre comment un moteur de recherche fonctionne en interne.
microsearch
- L’article passe en revue les composants de
microsearch et explique comment chacun a été construit : (1) le crawler, (2) l’index inversé, (3) le classement, (4) l’interface.
Le crawler
- La première étape pour créer un moteur de recherche consiste à récupérer les données à interroger.
- Dans l’idée de créer un « Google local », l’auteur a construit le moteur de recherche à partir des données des blogs qu’il suit.
- Le crawling consiste à télécharger et organiser tous les articles d’une liste donnée de blogs.
- Pour accélérer le processus, il a utilisé la bibliothèque Python
asyncio, réduisant le temps de crawling de 20 minutes à 20 secondes.
- 642 flux RSS ont été utilisés, dont environ 100 blogs régulièrement lus, et les 500 autres provenant du projet de blog surprisetalk.
L’index inversé
- L’index inversé est une structure de données qui associe des mots-clés à des documents, ce qui permet de retrouver facilement les documents dans lesquels un mot donné apparaît.
- Lorsqu’un utilisateur lance une requête, le moteur utilise l’index inversé pour récupérer tous les documents correspondant aux mots-clés de la requête.
- La logique de l’index inversé est définie dans une classe appelée
SearchEngine, implémentée en initialisant deux dictionnaires.
Le classement
- Une fois qu’on dispose d’un ensemble de documents correspondant à une requête donnée, il faut une méthode pour les trier.
- La méthode de classement la plus connue est le PageRank de Google, mais il existe aussi d’autres options basées sur le contenu, comme BM25.
- L’auteur implémente les parties manquantes de la classe
SearchEngine, y compris la manière de calculer le score BM25.
L’interface
- Une fois le moteur de recherche construit, l’auteur a voulu l’exposer d’une manière ou d’une autre.
- Il a créé une application FastAPI fournissant un endpoint pour exposer le moteur, ainsi qu’une simple page web permettant d’effectuer des recherches.
- Pour rendre les résultats plus faciles à lire, il a choisi de ne conserver que les N URL les mieux classées.
Fonctionnalités manquantes
- Les lecteurs qui manipulent souvent des moteurs de recherche remarqueront que de nombreuses fonctionnalités manquent dans cette implémentation.
- Il manque notamment les opérateurs de requête, l’indexation n-gram, l’expansion de requête ou de document, ainsi que la capacité à effectuer crawling et indexation en parallèle.
Conclusion
- Ce projet lui a permis de mieux comprendre le fonctionnement interne de Solr et de découvrir à quel point l’écriture de code asynchrone peut être puissante.
- Comme prochaine étape vers la création d’un moteur de recherche personnel, il prévoit d’ajouter une fonctionnalité de recherche sémantique.
L’avis de GN⁺
- Le point le plus important de cet article est qu’un individu peut créer lui-même un moteur de recherche pour améliorer la découvrabilité des petits sites web.
- L’expérience consistant à simplifier et implémenter un moteur de recherche aux fonctionnalités complexes à l’aide de Python et de bibliothèques open source peut aussi inspirer les ingénieurs logiciel débutants.
- En montrant, à travers un exemple concret, l’efficacité de la programmation asynchrone et l’importance des structures de données, cet article offre à la fois des éclairages techniques et une occasion d’apprentissage pratique.
1 commentaires
Avis Hacker News
Développement d’un moteur de recherche BM25 avec Pandas
Revue de code : classe
SearchEnginek1etb, et il n’y a absolument aucun commentaire dans le code._documentsutilise les URL comme clés, et le contenu correspondant de ces URL comme valeurs.La complexité des moteurs de recherche
Avis sur le nombre de lignes de code
Blague sur une expression dans le code
chunk for chunk in chunks if chunkdans le code, cela a rappelé à quelqu’un une blague sur les bûcherons.Exemple de code pour un moteur de recommandation
Comparaison des performances de bibliothèques de parsing
lxml.htmletlxml.html.cleanpeuvent être bien plus rapides queBeautifulSoup.Conseil sur l’usage des mots-clés
Avis sur un projet pédagogique
Doute sur l’usage de Python pour le traitement de gros volumes de données