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)
パラメータ
language(文字列)
トークン化するテキストの言語。有効なオプションは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) はない。