Exercices IA & Data Science Recherche BM25
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 25 XP 0 personnes ont réussi

Recherche BM25

BM25 est un algorithme de recherche textuelle classique, utilise par les moteurs de recherche bien avant l'arrivee des embeddings. Il fonctionne par correspondance de mots-cles : il regarde quels mots de ta requête apparaissent dans chaque document et leur attribue un score de pertinence.

Contrairement aux embeddings qui capturent le sens, BM25 cherche les mots exacts. C'est complementaire : un bon système RAG combine souvent les deux approches.

La librairie rank_bm25 fournit BM25Okapi, la variante la plus utilisee :

from rank_bm25 import BM25Okapi

corpus = ["le chat dort", "le chien mange", "python est genial"]
tokenized = [doc.split() for doc in corpus]
bm25 = BM25Okapi(tokenized)

scores = bm25.get_scores("chat".split())
# scores est un array numpy avec un score par document

Il faut tokeniser les documents (les decouper en mots) avant de les donner a BM25. Ici on utilise simplement split() pour couper sur les espaces.

Écris une fonction bm25_search(corpus, query, k) qui :
- prend une liste de textes (corpus), une requête, et k le nombre de résultats
- tokenise les documents et la requête avec split()
- crée un index BM25 et récupère les scores
- renvoie les indices des k documents avec les meilleurs scores, tries du meilleur au moins bon

Exemple :

corpus = ["le chat dort", "python est genial", "le chat mange"]
bm25_search(corpus, "chat", k=2) renvoie [0, 2]

Tests (1/1)

Tests
corpus = ['le chat dort sur le tapis rouge', 'python est un langage de programmation', 'le chien mange du poisson frais', 'django framework web rapide']
# Recherche basique
result = bm25_search(corpus, 'chat dort tapis', k=2)
assert isinstance(result, list), 'Doit renvoyer une liste'
assert len(result) == 2, 'Doit renvoyer k résultats'
assert result[0] == 0, f'Le doc sur le chat doit etre premier, got {result}'
# Les indices sont des int
assert all(isinstance(i, int) for i in result), 'Les indices doivent etre des int'
# Recherche avec mot spécifique
result2 = bm25_search(corpus, 'python programmation', k=1)
assert result2 == [1], f'python programmation doit matcher le doc index 1, got {result2}'
# k=4 renvoie tout
result3 = bm25_search(corpus, 'chat', k=4)
assert len(result3) == 4, 'k=4 doit renvoyer 4 résultats'

Indices (3 disponibles)

solution.py