BM25
BM25 adalah fungsi pemeringkatan yang digunakan dalam pencarian informasi untuk memperkirakan relevansi dokumen dengan kueri penelusuran yang diberikan. Fungsi ini meningkatkan pendekatan frekuensi term dasar dengan memasukkan normalisasi panjang dokumen dan saturasi frekuensi term. BM25 dapat menghasilkan sematan yang jarang dengan merepresentasikan dokumen sebagai vektor nilai kepentingan istilah, sehingga memungkinkan pengambilan dan pemeringkatan yang efisien dalam ruang vektor yang jarang.
Milvus berintegrasi dengan model BM25 menggunakan kelas BM25EmbeddingFunction. Kelas ini menangani komputasi penyematan dan mengembalikannya dalam format yang kompatibel dengan Milvus untuk pengindeksan dan pencarian. Hal yang penting dalam proses ini adalah membangun penganalisis untuk tokenisasi.
Untuk menggunakan fitur ini, instal dependensi yang diperlukan:
pip install --upgrade pymilvus
pip install "pymilvus[model]"
Untuk membuat tokenizer dengan mudah, Milvus menawarkan penganalisis default yang hanya perlu menentukan bahasa teks.
Contoh:
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
bahasa(string)
Bahasa teks yang akan diberi token. Pilihan yang valid adalah en (Inggris), de (Jerman), fr (Prancis), ru (Rusia), sp (Spanyol), it (Italia), pt (Portugis), zh (Cina), jp (Jepang), kr (Korea).
Hasil yang diharapkan mirip dengan yang berikut ini:
tokens: ['artifici', 'intellig', 'found', 'academ', 'disciplin', '1956']
Algoritme BM25 memproses teks dengan memecahnya terlebih dahulu menjadi token-token menggunakan penganalisis bawaan, seperti yang ditunjukkan dengan token-token bahasa Inggris seperti 'artifici', 'intellig', dan 'academ'. Kemudian mengumpulkan statistik pada token-token ini, mengevaluasi frekuensi dan distribusinya di seluruh dokumen. Inti dari BM25 menghitung skor relevansi dari setiap token berdasarkan tingkat kepentingannya, dengan token yang lebih jarang mendapatkan skor yang lebih tinggi. Proses ringkas ini memungkinkan pemeringkatan dokumen yang efektif berdasarkan relevansi dengan kueri.
Untuk mengumpulkan statistik pada korpus, gunakan metode 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)
Kemudian, gunakan encode_documents() untuk membuat penyematan dokumen:
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)
Keluaran yang diharapkan mirip dengan yang berikut ini:
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)
Untuk membuat sematan untuk kueri, gunakan metode 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)
Keluaran yang diharapkan mirip dengan yang berikut ini:
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)
Catatan:
Saat menggunakan BM25EmbeddingFunction, perhatikan bahwa operasi encode_queries() dan encoding_documents() tidak dapat dipertukarkan secara matematis. Oleh karena itu, tidak ada implementasi bm25_ef(teks) yang tersedia.