Volver a la Galería de Conceptos
Recuperación Tradicional
Maestría IA — AI Wiki

BM25 (Best Matching 25)

Algoritmo probabilístico estándar para búsqueda léxica basado en TF-IDF con saturación de frecuencia.

Lexical SearchTF-IDFElasticsearchKeyword Search

Definición Técnica & Formal

BM25 calcula la relevancia de un documento frente a palabras clave buscando coincidencia exacta de términos. Modifica TF-IDF introduciendo parámetros de saturación de frecuencia de término ($k_1$) y normalización por longitud del documento ($b$).

Puntos Clave & Aplicaciones

Excelente para términos exactos, códigos, números de pieza o nombres propios.
Saturación de frecuencia evita la penalización por "term stuffing".
Pilar fundamental de motores como Elasticsearch, OpenSearch y Lucene.
Intuición Visual para Mente Gráfica

"Si la palabra "inteligencia" aparece 1 vez es relevante; si aparece 5 veces es muy relevante; pero si aparece 50 veces en una página corta, ¡ya no aporta 10 veces más relevancia! BM25 aplana ese beneficio."

💡 Tip: Puedes presionar el botón "Dibujar / Apuntes" en la barra superior para hacer anotaciones gráficas sobre este diagrama.

Fórmula Matemática

Score(D, Q) = sum( IDF(q_i) * (f(q_i, D) * (k1 + 1)) / (f(q_i, D) + k1 * (1 - b + b * (|D| / avgdl))) )

Demostración Visual e Interactiva

Interactúa con los controles para simular dinámicamente el funcionamiento de BM25 (Best Matching 25).

Visualizador de la Arquitectura "BM25 (Best Matching 25)"

Si la palabra "inteligencia" aparece 1 vez es relevante; si aparece 5 veces es muy relevante; pero si aparece 50 veces en una página corta, ¡ya no aporta 10 veces más relevancia! BM25 aplana ese beneficio.

Categoría: Recuperación Tradicional

Ejemplo de Código & Demostración

python
from rank_bm25 import BM25Okapi

corpus = [
    "búsqueda vectorial en bases de datos",
    "modelos de lenguaje y embeddings RAG",
    "algoritmo BM25 para recuperación léxica"
]

tokenized_corpus = [doc.split(" ") for doc in corpus]
bm25 = BM25Okapi(tokenized_corpus)

query = "algoritmo BM25".split(" ")
scores = bm25.get_scores(query)
print("Scores BM25:", scores)
💡 Demostración práctica de scoring BM25 sobre un corpus de texto.

Conceptos Relacionados