milvus-logo
LFAI
홈페이지
  • 모델

BM25

BM25는 정보 검색에서 주어진 검색어에 대한 문서의 관련성을 추정하는 데 사용되는 순위 기능입니다. 이 기능은 문서 길이 정규화와 용어 빈도 포화도를 통합하여 기본 용어 빈도 접근 방식을 개선합니다. BM25는 문서를 용어 중요도 점수의 벡터로 표현하여 희소 임베딩을 생성할 수 있으므로 희소 벡터 공간에서 효율적으로 검색하고 순위를 매길 수 있습니다.

Milvus는 BM25EmbeddingFunction 클래스를 사용해 BM25 모델과 통합합니다. 이 클래스는 임베딩 계산을 처리하고 인덱싱 및 검색을 위해 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)

매개변수:

  • 언어(문자열)

    토큰화할 텍스트의 언어입니다. 유효한 옵션은 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(text)를 사용할 수 없습니다.

번역DeepLogo

목차 목록

Try Managed Milvus for Free

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

Get Started
피드백

이 페이지가 도움이 되었나요?