Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
Calcul IDF (Inverse Document Frequency)
Cinquieme étape : l'IDF (Inverse Document Frequency). C'est ce qui differencie un moteur de recherche intelligent d'une simple recherche par mot-cle.
L'idee : un mot comme 'est' ou 'le' apparait dans presque tous les documents. Il n'est donc pas utile pour distinguer un document d'un autre. En revanche, un mot comme 'quantique' est rare et tres discriminant.
L'IDF penalise les mots communs et valorise les mots rares.
Formule : IDF(mot) = log(N / df) ou : N = nombre total de documents df = nombre de documents contenant ce mot log = logarithme naturel (math.log)
Exemple avec 3 documents ou 'python' est dans 2 docs et 'est' dans 3 : IDF('python') = log(3/2) = 0.405 environ IDF('est') = log(3/3) = 0 (dans tous les docs, pas discriminant)
Écris une fonction calculer_idf(documents) qui retourne un dictionnaire {mot: idf}.
Tests (2/4)
IDF calcule
import math
docs = ['python est rapide', 'python est simple', 'java est verbeux']
idf = calculer_idf(docs)
assert abs(idf['python'] - math.log(3/2)) < 0.01
IDF mot commun plus bas
docs = ['python est rapide', 'python est simple', 'java est verbeux']
idf = calculer_idf(docs)
assert idf['est'] < idf['python']
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
import re
import math
from collections import defaultdict
def tokeniser(texte):
mots = re.findall(r'[a-zA-ZÀ-ÿ0-9]+', texte.lower())
return [mot for mot in mots if len(mot) > 1]
def calculer_idf(documents):
N = len(documents)
if N == 0:
return {}
df = defaultdict(int)
for doc in documents:
mots_uniques = set(tokeniser(doc))
for mot in mots_uniques:
df[mot] += 1
return {mot: math.log(N / freq) for mot, freq in df.items()}