BM25
BM25 è una funzione di classificazione utilizzata nell'information retrieval per stimare la rilevanza dei documenti rispetto a una determinata query di ricerca. Migliora l'approccio di base alla frequenza dei termini incorporando la normalizzazione della lunghezza dei documenti e la saturazione della frequenza dei termini. BM25 è in grado di generare embedding sparsi rappresentando i documenti come vettori di punteggi di importanza dei termini, consentendo un efficiente recupero e classificazione in spazi vettoriali sparsi.
Milvus si integra con il modello BM25 utilizzando la classe BM25EmbeddingFunction. Questa classe gestisce il calcolo delle incorporazioni e le restituisce in un formato compatibile con Milvus per l'indicizzazione e la ricerca. Essenziale per questo processo è la costruzione di un analizzatore per la tokenizzazione.
Per utilizzare questa funzione, installare le dipendenze necessarie:
pip install --upgrade pymilvus
pip install "pymilvus[model]"
Per creare facilmente un tokenizer, Milvus offre un analizzatore predefinito che richiede solo di specificare la lingua del testo.
Esempio:
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)
Parametri:
lingua(stringa)
La lingua del testo da tokenizzare. Le opzioni valide sono en (inglese), de (tedesco), fr (francese), ru (russo), sp (spagnolo), it (italiano), pt (portoghese), zh (cinese), jp (giapponese), kr (coreano).
Il risultato atteso è simile al seguente:
tokens: ['artifici', 'intellig', 'found', 'academ', 'disciplin', '1956']
L'algoritmo BM25 elabora il testo scomponendolo prima in token utilizzando un analizzatore integrato, come mostrato con token in lingua inglese come "artifici", "intellig" e "academ". Quindi raccoglie statistiche su questi token, valutandone la frequenza e la distribuzione nei documenti. Il cuore di BM25 calcola il punteggio di rilevanza di ogni token in base alla sua importanza, con i token più rari che ricevono punteggi più alti. Questo processo conciso consente di classificare efficacemente i documenti in base alla loro rilevanza per una query.
Per raccogliere le statistiche sul corpus, utilizzare il metodo 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)
Quindi, utilizzare encode_documents() per creare le incorporazioni dei documenti:
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)
Il risultato atteso è simile al seguente:
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)
Per creare embeddings per le query, utilizzare il metodo 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)
L'output previsto è simile al seguente:
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)
Note:
Quando si usa BM25EmbeddingFunction, si noti che le operazioni di encoding_queries() e encoding_documents() non possono essere scambiate matematicamente. Pertanto, non è disponibile un'implementazione di bm25_ef(testi).