Skip to content

Commit 659f6bf

Browse files
Added basic BM25 implementation
1 parent 22bbc02 commit 659f6bf

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

turftopic/retrieval/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .bm25 import BM25Transformer

turftopic/retrieval/bm25.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import numpy as np
2+
import scipy.sparse as spr
3+
from sklearn.base import BaseEstimator, TransformerMixin
4+
5+
6+
class BM25Transformer(BaseEstimator, TransformerMixin):
7+
def __init__(self, b: float = 0.7, k1: float = 8):
8+
self.b = b
9+
self.k1 = k1
10+
11+
def fit(self, X, y=None):
12+
self.N_ = X.shape[0]
13+
self.avgdl_ = X.sum(axis=1).mean()
14+
self.term_freq_ = np.ravel(np.asarray((X > 0).sum(axis=0)))
15+
self.idf_ = np.log(
16+
(self.N_ - self.term_freq_ + 0.5) / (self.term_freq_ + 0.5)
17+
)
18+
return self
19+
20+
def transform(self, X):
21+
if spr.issparse(X):
22+
X = spr.csr_array(X)
23+
d_len = np.ravel(np.asarray(X.sum(axis=1)))
24+
K_D = 1 - self.b + self.b * d_len / self.avgdl_
25+
return (
26+
self.idf_[None, :]
27+
* (X * (self.k1 + 1))
28+
/ (X + self.k1 * K_D[:, None])
29+
)
30+
31+
def fit_transform(self, X, y=None):
32+
return self.fit(X, y).transform(X)

0 commit comments

Comments
 (0)