🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI
Главная

BM25

BM25 - это функция ранжирования, используемая в информационном поиске для оценки релевантности документов заданному поисковому запросу. Она расширяет базовый подход, основанный на частоте терминов, путем включения нормализации длины документа и насыщения частоты терминов. BM25 может генерировать разреженные вкрапления, представляя документы как векторы оценок важности терминов, что позволяет эффективно осуществлять поиск и ранжирование в разреженных векторных пространствах.

Milvus интегрируется с моделью BM25 с помощью класса BM25EmbeddingFunction. Этот класс обрабатывает вычисления вкраплений и возвращает их в формате, совместимом с Milvus, для индексации и поиска. Важной частью этого процесса является создание анализатора для токенизации.

Чтобы воспользоваться этой функцией, установите необходимые зависимости:

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

Чтобы легко создать токенизатор, Milvus предлагает анализатор по умолчанию, который требует только указания языка текста.

Пример:

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)

Параметры:

  • language(string)

    Язык текста, который будет подвергнут токенизации. Возможные варианты: en (английский), de (немецкий), fr (французский), ru (русский), sp (испанский), it (итальянский), pt (португальский), zh (китайский), jp (японский), kr (корейский).

Ожидаемый результат похож на следующий:

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

Алгоритм BM25 обрабатывает текст, сначала разбивая его на лексемы с помощью встроенного анализатора, как показано на примере таких лексем английского языка, как 'artifici', 'intellig' и 'academ'. Затем он собирает статистику по этим лексемам, оценивая их частоту и распределение по документам. Ядро BM25 рассчитывает балл релевантности каждой лексемы в зависимости от ее важности, при этом более редкие лексемы получают более высокие баллы. Этот лаконичный процесс позволяет эффективно ранжировать документы по релевантности запросу.

Чтобы собрать статистику по корпусу, используйте метод 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)

Затем используйте метод encode_documents() для создания вкраплений для документов:

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)

Ожидаемый результат будет выглядеть следующим образом:

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)

Чтобы создать вкрапления для запросов, используйте метод 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)

Ожидаемый результат похож на следующий:

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)

Примечания:

При использовании BM25EmbeddingFunction следует учитывать, что операции encoding_queries() и encoding_documents() математически не могут быть взаимозаменяемы. Поэтому не существует реализации bm25_ef(texts).

Содержание

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?