milvus-logo
LFAI
Home
  • Modelos

BM25

BM25 es una función de clasificación utilizada en la recuperación de información para estimar la relevancia de los documentos en relación con una consulta de búsqueda determinada. Mejora el enfoque básico de la frecuencia de términos incorporando la normalización de la longitud de los documentos y la saturación de la frecuencia de términos. El BM25 puede generar incrustaciones dispersas representando los documentos como vectores de puntuaciones de importancia de términos, lo que permite una recuperación y clasificación eficaces en espacios vectoriales dispersos.

Milvus se integra con el modelo BM25 mediante la clase BM25EmbeddingFunction. Esta clase gestiona el cálculo de las incrustaciones y las devuelve en un formato compatible con Milvus para la indexación y la búsqueda. Un elemento esencial de este proceso es la construcción de un analizador para la tokenización.

Para utilizar esta función, instale las dependencias necesarias:

pip install --upgrade pymilvus
pip install "pymilvus[model]"

Para crear fácilmente un tokenizador, Milvus ofrece un analizador por defecto que sólo requiere especificar el idioma del texto.

Ejemplo:

from pymilvus.model.sparse.bm25.tokenizers import build_default_analyzer
from pymilvus.model.sparse import BM25EmbeddingFunction

# there are some built-in analyzers for several languages, now we use 'en' for English.
analyzer = build_default_analyzer(language="en")

corpus = [
    "Artificial intelligence was founded as an academic discipline in 1956.",
    "Alan Turing was the first person to conduct substantial research in AI.",
    "Born in Maida Vale, London, Turing was raised in southern England.",
]

# analyzer can tokenize the text into tokens
tokens = analyzer(corpus[0])
print("tokens:", tokens)

Parámetros:

  • language(cadena)

    El idioma del texto que se va a tokenizar. Las opciones válidas son en (inglés), de (alemán), fr (francés), ru (ruso), sp (español), it (italiano), pt (portugués), zh (chino), jp (japonés), kr (coreano).

El resultado esperado es similar al siguiente:

tokens: ['artifici', 'intellig', 'found', 'academ', 'disciplin', '1956']

El algoritmo BM25 procesa el texto dividiéndolo primero en tokens mediante un analizador integrado, como se muestra con tokens en inglés como "artifici", "intellig" y "academ". A continuación, recopila datos estadísticos sobre estos símbolos, evaluando su frecuencia y distribución en los documentos. El núcleo de BM25 calcula la puntuación de relevancia de cada token en función de su importancia, y los tokens más raros reciben puntuaciones más altas. Este proceso conciso permite clasificar eficazmente los documentos en función de su pertinencia para una consulta.

Para obtener estadísticas sobre el corpus, utilice el método fit():

# Use the analyzer to instantiate the BM25EmbeddingFunction
bm25_ef = BM25EmbeddingFunction(analyzer)

# Fit the model on the corpus to get the statstics of the corpus
bm25_ef.fit(corpus)

A continuación, utilice encode_documents() para crear incrustaciones para los documentos:

docs = [
    "The field of artificial intelligence was established as an academic subject in 1956.",
    "Alan Turing was the pioneer in conducting significant research in artificial intelligence.",
    "Originating in Maida Vale, London, Turing grew up in the southern regions of England.",
    "In 1956, artificial intelligence emerged as a scholarly field.",
    "Turing, originally from Maida Vale, London, was brought up in the south of England."
]

# Create embeddings for the documents
docs_embeddings = bm25_ef.encode_documents(docs)

# Print embeddings
print("Embeddings:", docs_embeddings)
# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
print("Sparse dim:", bm25_ef.dim, list(docs_embeddings)[0].shape)

El resultado esperado es similar al siguiente:

Embeddings:   (0, 0)        1.0208816705336425
  (0, 1)        1.0208816705336425
  (0, 3)        1.0208816705336425
...
  (4, 16)        0.9606986899563318
  (4, 17)        0.9606986899563318
  (4, 20)        0.9606986899563318
Sparse dim: 21 (1, 21)

Para crear incrustaciones para consultas, utilice el método encode_queries():

queries = ["When was artificial intelligence founded", 
           "Where was Alan Turing born?"]

query_embeddings = bm25_ef.encode_queries(queries)

# Print embeddings
print("Embeddings:", query_embeddings)
# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
print("Sparse dim:", bm25_ef.dim, list(query_embeddings)[0].shape)

El resultado esperado es similar al siguiente:

Embeddings:   (0, 0)        0.5108256237659907
  (0, 1)        0.5108256237659907
  (0, 2)        0.5108256237659907
  (1, 6)        0.5108256237659907
  (1, 7)        0.11554389108992644
  (1, 14)        0.5108256237659907
Sparse dim: 21 (1, 21)

Notas:

Cuando utilice BM25EmbeddingFunction, tenga en cuenta que las operaciones encoding_queries() y encoding_documents() no pueden intercambiarse matemáticamente. Por lo tanto, no se dispone de bm25_ef(texts) implementado.

Traducido porDeepLogo

Tabla de contenidos

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

¿Fue útil esta página?