6 points par GN⁺ 2024-02-08 | 1 commentaires | Partager sur WhatsApp

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

 
GN⁺ 2024-02-08
Avis Hacker News
  • Développement d’un moteur de recherche BM25 avec Pandas

    • Le développeur travaille sur un moteur de recherche BM25 rapide fonctionnant dans Pandas.
    • La raison d’utiliser Pandas est qu’en plus de l’algorithme BM25, cela permet de combiner facilement d’autres facteurs comme la fraîcheur ou la popularité.
    • La correspondance de chaînes comporte de nombreux cas particuliers, et il est important de compresser les informations de position en utilisant le moins de mémoire possible.
  • Revue de code : classe SearchEngine

    • On ne comprend pas la signification des paramètres k1 et b, et il n’y a absolument aucun commentaire dans le code.
    • On suppose que _documents utilise les URL comme clés, et le contenu correspondant de ces URL comme valeurs.
    • Il est regrettable que le code ne soit pas bien documenté. Avec une bonne documentation, cela aurait pu être utile comme support d’apprentissage pour construire un moteur de recherche.
  • La complexité des moteurs de recherche

    • La principale difficulté d’un moteur de recherche réside dans la gestion du volume de données.
    • La logique elle-même est étonnamment simple, et le projet réussit à éliminer l’essentiel du superflu.
    • L’approche importante n’est pas de rendre le moteur de recherche plus gros, mais de réduire les données ou d’augmenter le ratio signal/bruit.
  • Avis sur le nombre de lignes de code

    • Certains remettent en question l’intérêt de se vanter du nombre de lignes de code lorsqu’on utilise des dépendances externes.
    • Il n’existe pas d’unité SI pour une base de code, mais selon un avis, il faudrait tout de même mesurer d’une manière ou d’une autre la charge cognitive.
  • Blague sur une expression dans le code

    • En voyant l’expression chunk for chunk in chunks if chunk dans le code, cela a rappelé à quelqu’un une blague sur les bûcherons.
  • Exemple de code pour un moteur de recommandation

    • Un exemple de moteur de recommandation en Python, utilisable avec le moteur de recherche, est fourni en moins de 20 lignes.
    • Il génère des recommandations à partir des URL cliquées dans les journaux de session.
    • En mélangeant les requêtes saisies dans les logs et les URL cliquées, on peut aussi obtenir des suggestions de correction orthographique.
  • Comparaison des performances de bibliothèques de parsing

    • Il est mentionné que lxml.html et lxml.html.clean peuvent être bien plus rapides que BeautifulSoup.
  • Conseil sur l’usage des mots-clés

    • Pour améliorer la qualité des résultats de recherche en anglais, il est recommandé d’utiliser des 2-grammes et 3-grammes plutôt que des 1-grammes.
    • Les n-grammes aident à préserver le contexte.
  • Avis sur un projet pédagogique

    • Le projet est jugé très sympa et pédagogique, mais il est conseillé de ne pas le déployer en production.
    • Pour un projet de plus grande ampleur traitant plusieurs dizaines de milliers de documents, la réponse est d’utiliser FTS5 de SQLite.
  • Doute sur l’usage de Python pour le traitement de gros volumes de données

    • Certains s’interrogent sur la pertinence d’utiliser Python, un langage lent, pour des tâches qui doivent traiter rapidement de grands volumes de données.