milvus-logo
LFAI
Home
  • Modelos

BM25

A BM25 é uma função de classificação utilizada na recuperação de informação para estimar a relevância dos documentos para uma determinada consulta de pesquisa. Melhora a abordagem básica de frequência de termos, incorporando a normalização do comprimento do documento e a saturação da frequência de termos. O BM25 pode gerar embeddings esparsos ao representar documentos como vectores de pontuações de importância de termos, permitindo uma recuperação e classificação eficientes em espaços vectoriais esparsos.

Milvus integra-se com o modelo BM25 usando a classe BM25EmbeddingFunction. Esta classe trata do cálculo dos embeddings e devolve-os num formato compatível com o Milvus para indexação e pesquisa. Essencial para este processo é a construção de um analisador para tokenização.

Para utilizar esta funcionalidade, instale as dependências necessárias:

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

Para criar facilmente um tokenizador, o Milvus oferece um analisador padrão que requer apenas a especificação do idioma do texto.

Exemplo:

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(string)

    O idioma do texto a ser tokenizado. As opções válidas são en (inglês), de (alemão), fr (francês), ru (russo), sp (espanhol), it (italiano), pt (português), zh (chinês), jp (japonês), kr (coreano).

O resultado esperado é semelhante ao seguinte:

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

O algoritmo BM25 processa o texto, começando por dividi-lo em tokens, utilizando um analisador incorporado, como mostrado com tokens da língua inglesa como 'artifici', 'intellig' e 'academ'. De seguida, reúne estatísticas sobre estes tokens, avaliando a sua frequência e distribuição pelos documentos. O núcleo do BM25 calcula a pontuação de relevância de cada token com base na sua importância, sendo que os tokens mais raros recebem pontuações mais elevadas. Este processo conciso permite uma classificação efectiva dos documentos por relevância para uma consulta.

Para recolher estatísticas sobre o corpus, utilize o 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)

De seguida, utilize encode_documents() para criar embeddings para os 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)

O resultado esperado é semelhante ao seguinte:

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 criar embeddings para consultas, utilize o 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)

O resultado esperado é semelhante ao seguinte:

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:

Ao utilizar BM25EmbeddingFunction, note que as operações encoding_queries() e encoding_documents() não podem ser intercambiadas matematicamente. Por conseguinte, não está disponível a implementação de bm25_ef(texts).

Traduzido porDeepL

Tabela de conteúdos

Try Managed Milvus for Free

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

Get Started
Feedback

Esta página foi útil?