Skip to main content

Various BM25 algorithms for document ranking

Project description

Rank-BM25: A two line search engine

Test 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.

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!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

haystack_bm25-1.0.0.tar.gz (8.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

haystack_bm25-1.0.0-py2.py3-none-any.whl (8.7 kB view details)

Uploaded Python 2Python 3

File details

Details for the file haystack_bm25-1.0.0.tar.gz.

File metadata

  • Download URL: haystack_bm25-1.0.0.tar.gz
  • Upload date:
  • Size: 8.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.25.2

File hashes

Hashes for haystack_bm25-1.0.0.tar.gz
Algorithm Hash digest
SHA256 eeb6c60f9f8bca430236ff7a98f9f0cb6fb13bed5df5630dbe9e0f88c264a706
MD5 d1dc9de2dfe45a951b6216a7e825db85
BLAKE2b-256 e8400687b3c562f6ecdf96cefcb38c625fa39dee6adc83f955e5156087a37ddd

See more details on using hashes here.

File details

Details for the file haystack_bm25-1.0.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for haystack_bm25-1.0.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 0775a4a6bf5c721263a0a93370665e0d38463fcbffd0db83f1846f35d84eb7fc
MD5 3e2fe88a9aebd3b82ac01caa9d75940a
BLAKE2b-256 6280923b970385eaaf8df3fec29ab04b9135aec1f69cf5752731b2739b011492

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page