Back to rankings

dorianbrown/rank_bm25

Python

A Collection of BM25 Algorithms in Python

bm25information-retrievalalgorithmranking
Star Growth
Stars
1.4k
Forks
107
Weekly Growth
Issues
15
5001k
May 2019Sep 2021Feb 2024Jul 2026
ArtifactsPyPIpip install rank_bm25
README

Rank-BM25: A two line search engine

Build Status PyPI version PyPI - Downloads DOI PyPI - License

A collection of algorithms for querying a set of documents and returning the ones most relevant to the query. The most common use case for these algorithms is, as you might have guessed, to create search engines.

So far the algorithms that have been implemented are:

  • Okapi BM25
  • BM25L
  • BM25+
  • BM25-Adpt
  • BM25T

These algorithms were taken from this paper, which gives a nice overview of each method, and also benchmarks them against each other. A nice inclusion is that they compare different kinds of preprocessing like stemming vs no-stemming, stopword removal or not, etc. Great read if you're new to the topic.

For those looking to use this in large scale production environments, I'd recommend you take a look at something like retriv, which is a much more performant python retrieval package. See #27

Installation

The easiest way to install this package is through pip, using

pip install rank_bm25

If you want to be sure you're getting the newest version, you can install it directly from github with

pip install git+ssh://git@github.com/dorianbrown/rank_bm25.git

Usage

For this example we'll be using the BM25Okapi algorithm, but the others are used in pretty much the same way.

Initalizing

First thing to do is create an instance of the BM25 class, which reads in a corpus of text and does some indexing on it:

from rank_bm25 import BM25Okapi

corpus = [
    "Hello there good man!",
    "It is quite windy in London",
    "How is the weather today?"
]

tokenized_corpus = [doc.split(" ") for doc in corpus]

bm25 = BM25Okapi(tokenized_corpus)
# <rank_bm25.BM25Okapi at 0x1047881d0>

Note that this package doesn't do any text preprocessing. If you want to do things like lowercasing, stopword removal, stemming, etc, you need to do it yourself.

The only requirements is that the class receives a list of lists of strings, which are the document tokens.

Ranking of documents

Now that we've created our document indexes, we can give it queries and see which documents are the most relevant:

query = "windy London"
tokenized_query = query.split(" ")

doc_scores = bm25.get_scores(tokenized_query)
# array([0.        , 0.93729472, 0.        ])

Good to note that we also need to tokenize our query, and apply the same preprocessing steps we did to the documents in order to have an apples-to-apples comparison

Instead of getting the document scores, you can also just retrieve the best documents with

bm25.get_top_n(tokenized_query, corpus, n=1)
# ['It is quite windy in London']

And that's pretty much it!

Related repositories
manticoresoftware/manticoresearch

Open-source search database for full-text, vector, and hybrid search with real-time indexing and SQL.

C++GNU General Public License v3.0search-enginesearch
manticoresearch.com
11.9k633
paradedb/paradedb

One Postgres for your application data, full-text search, vector retrieval, and aggregations. Home of the pg_search extension.

Rustcrates.ioGNU Affero General Public License v3.0elasticsearchsparse-vector
paradedb.com
9.1k418
infiniflow/infinity

The AI-native database built for LLM applications, providing incredibly fast hybrid search of dense vector, sparse vector, tensor (multi-vector), and full-text.

C++Apache License 2.0ai-nativenearest-neighbor-search
infiniflow.org
4.6k431
SylphAI-Inc/AdalFlow

AdalFlow: The library to build & auto-optimize LLM applications.

PythonPyPIMIT Licenseagentframework
adalflow.sylph.ai
4.2k379
timescale/pg_textsearch

PostgreSQL extension for BM25 relevance-ranked full-text search. Postgres OSS licensed.

CPostgreSQL Licensebm25c-extension
3.9k111
GiovanniPasq/agentic-rag-for-dummies

A modular Agentic RAG built with LangGraph — learn Retrieval-Augmented Generation Agents in minutes.

Jupyter NotebookMIT Licenseagentic-aiagentic-rag
3.8k483
SeekStorm/SeekStorm

SeekStorm: vector & lexical search - in-process library & multi-tenancy server, in Rust.

Rustcrates.ioApache License 2.0enterprise-searchfull-text-search
seekstorm.com
1.9k67
xhluca/bm25s

Fast BM25 search in Python, powered by Numpy and Numba

PythonPyPIMIT Licensebm25bm25-l
bm25s.github.io
1.7k102
winkjs/wink-nlp

Developer friendly Natural Language Processing ✨

JavaScriptnpmMIT Licensenatural-language-processingnlp
winkjs.org/wink-nlp/
1.4k63