milvus-logo
LFAI
Home

BM25

BM25 ist eine Rangordnungsfunktion, die im Information Retrieval verwendet wird, um die Relevanz von Dokumenten für eine bestimmte Suchanfrage zu schätzen. Sie erweitert den grundlegenden Begriffshäufigkeitsansatz, indem sie eine Normalisierung der Dokumentlänge und eine Sättigung der Begriffshäufigkeit einbezieht. BM25 kann spärliche Einbettungen generieren, indem es Dokumente als Vektoren von Termbedeutungswerten darstellt, was ein effizientes Retrieval und Ranking in spärlichen Vektorräumen ermöglicht.

Milvus lässt sich mit dem BM25-Modell über die Klasse BM25EmbeddingFunction integrieren. Diese Klasse übernimmt die Berechnung der Einbettungen und gibt sie in einem mit Milvus kompatiblen Format für die Indizierung und Suche zurück. Wesentlich für diesen Prozess ist die Erstellung eines Analysators für die Tokenisierung.

Um diese Funktion zu nutzen, installieren Sie die notwendigen Abhängigkeiten:

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

Um einen Tokenizer einfach zu erstellen, bietet Milvus einen Standard-Analysator, der nur die Angabe der Sprache des Textes erfordert.

Beispiel:

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)

Parameter:

  • language(Zeichenkette)

    Die Sprache des Textes, der tokenisiert werden soll. Gültige Optionen sind en (Englisch), de (Deutsch), fr (Französisch), ru (Russisch), sp (Spanisch), it (Italienisch), pt (Portugiesisch), zh (Chinesisch), jp (Japanisch), kr (Koreanisch).

Die erwartete Ausgabe ist ähnlich wie die folgende:

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

Der BM25-Algorithmus verarbeitet den Text, indem er ihn zunächst mit einem eingebauten Analysator in Token zerlegt, wie bei den englischen Token "artifici", "intellig" und "academ" gezeigt . Anschließend werden statistische Daten zu diesen Token gesammelt und ihre Häufigkeit und Verteilung in den Dokumenten ausgewertet. Der Kern von BM25 berechnet die Relevanzbewertung jedes Tokens auf der Grundlage seiner Wichtigkeit, wobei seltenere Tokens eine höhere Bewertung erhalten. Dieser prägnante Prozess ermöglicht eine effektive Einstufung von Dokumenten nach ihrer Relevanz für eine Suchanfrage.

Um Statistiken über den Korpus zu sammeln, verwenden Sie die fit() -Methode:

# 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)

Verwenden Sie dann encode_documents(), um Einbettungen für Dokumente zu erstellen:

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)

Die erwartete Ausgabe ist ähnlich wie die folgende:

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)

Um Einbettungen für Abfragen zu erstellen, verwenden Sie die Methode 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)

Die erwartete Ausgabe ist ähnlich wie die folgende:

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)

Hinweise:

Bei der Verwendung von BM25EmbeddingFunction ist zu beachten, dass die Operationen encoding_queries() und encoding_documents() mathematisch nicht vertauscht werden können. Daher gibt es kein implementiertes bm25_ef(texts).

Übersetzt vonDeepL

Tabelle der Inhalte

Try Managed Milvus for Free

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

Get Started
Feedback

War diese Seite hilfreich?