bsparse
bsparse is a toolkit for creating, indexing, and searching learned sparse representations
Usage examples
# Recommended way to install requirements:
# (using pip only works too, but uv is much faster)
pipx install uv
# Create virtual environment
uv venv venv
# Activate
source venv/bin/activate
# Install requirements
uv pip install -r requirements.txt
The base package only needs lightweight dependencies: indexing and searching with the anserini/seismic backends start from already-encoded JSONL files, so they work without torch. Optional dependency groups cover the rest:
encode: torch, transformers, etc. for encoding text into sparse representationsanserini: pyjnius for the Anserini search backend (a JAR is also required; see below)seismic: pyseismic-lsr for the Seismic backendall: everything above
# e.g., install everything needed to encode and to search with the Seismic backend
uv pip install 'bsparse[encode,seismic]'
# Request access to splade-v3: https://huggingface.co/naver/splade-v3
# Get your huggingface API token and then:
export HF_TOKEN="the token"
# load Python virtual environment
source venv/bin/activate
# optional: spot check output from a model
python -m bsparse.cli check --text "tesla net worth"
# create query representations:
python -m bsparse.cli encode --out nfcorpus-queries.jsonl \
--dataset irds --type query --name beir/nfcorpus --batch-size 64
# create doc representations:
python -m bsparse.cli encode --out nfcorpus-docs.jsonl \
--dataset irds --type doc --name beir/nfcorpus --batch-size 64
# search and evaluate without building an index:
python -m bsparse.cli memsearch --out nfcorpus.run --docs nfcorpus-docs.jsonl --queries nfcorpus-queries.jsonl --qrels beir/nfcorpus/test
# alternatively, you can build an index and search it
# 1) setup: compile ScaledJsonVectorCollection.java and add it to anserini-1.0.0-fatjar.jar
$ wget -c https://repo1.maven.org/maven2/io/anserini/anserini/1.0.0/anserini-1.0.0-fatjar.jar
$ cd java
$ javac -cp ../anserini-1.0.0-fatjar.jar io/anserini/collection/*.java
$ cp ../anserini-1.0.0-fatjar.jar ../anserini-1.0.0-fatjar-bsparse.jar
$ jar uf ../anserini-1.0.0-fatjar-bsparse.jar io/anserini/collection/*.class
# 2) build index
java -cp anserini-1.0.0-fatjar-AY.jar io.anserini.index.IndexCollection \
-generator DefaultLuceneDocumentGenerator -impact -pretokenized \
-threads 16 -collection ScaledJsonVectorCollection \
-input /path/to/encoded-text -index /path/to/encoded-text-index
# 3) search index
# Create sparse query representations in `$QUERY_VECTORS` and create an index in `$INDEX`, then:
python -m bsparse.cli search --index $INDEX --queries $QUERY_VECTORS --out test.run --topk 1000
Seismic backend
Seismic is an alternative backend that indexes learned
sparse representations natively in Python (no Java/JAR required). The encoded JSONL files produced
by encode are already in the format Seismic expects, so the same doc/query files work for both
backends.
# install the Seismic Python bindings (optional dependency; only needed for this backend)
uv pip install 'bsparse[seismic]' # or: uv pip install pyseismic-lsr
# for best performance, build against your CPU instead:
# RUSTFLAGS="-C target-cpu=native" uv pip install --no-binary :all: pyseismic-lsr
# 1) build a Seismic index from encoded docs
python -m bsparse.cli index --backend seismic --input nfcorpus-docs.jsonl --index $INDEX
# --input accepts multiple files, gzipped (.gz) input, and directories of .jsonl/.jsonl.gz files;
# if the in-memory API gives you trouble, --build-method file falls back to concatenating
# the inputs into a temporary uncompressed JSONL file and using Seismic's file-based build
#
# note: seismic appends ".index.seismic" to the path, so the on-disk file is $INDEX.index.seismic;
# search --index accepts either the build-time path or the full on-disk filename
#
# indexing hyperparameters are flags with defaults, e.g.:
# --n-postings 3000 --centroid-fraction 0.2 --summary-energy 0.5 --max-fraction 6 --min-cluster-size 2 --nknn 0
#
# use --variant large_vocab for collections with more than 65k unique tokens
# 2) search the index and evaluate
python -m bsparse.cli search --backend seismic --index $INDEX \
--queries nfcorpus-queries.jsonl --out test.run --topk 1000 \
--query-cut 10 --heap-factor 0.8 --qrels beir/nfcorpus/test
# query-time thread count is index-independent and set via the environment:
# SEISMIC_THREADS=16 python -m bsparse.cli search --backend seismic ...
Metadata
Release files for bsparse 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| bsparse-0.3.1.tar.gz | 26.9 kB | With provenance | Details for bsparse-0.3.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| bsparse-0.3.1-py3-none-any.whl | Python 3 | none | any | Details for bsparse-0.3.1-py3-none-any.whl |
Total release size: 49.8 kB
Release files / bsparse-0.3.1.tar.gz
| Download URL | bsparse-0.3.1.tar.gz |
|---|---|
| Size | 26.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
13c3660b2768a9b1a13b98644b2b095ab6d4a197803a412666b0f6fd195a64e1
|
|
BLAKE2b-256 checksum How to use checksums |
5a5f99f0d9255c5bcb1e5f67a40feabc289df45dc0e8dec4440c7c37e186e96c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 11, 2026.
Transparency logRelease files / bsparse-0.3.1-py3-none-any.whl
| Download URL | bsparse-0.3.1-py3-none-any.whl |
|---|---|
| Size | 22.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d52586343750299ca7a23d535cdaccb000b0df96d3f015b9d567d56ec3cf29b3
|
|
BLAKE2b-256 checksum How to use checksums |
422bc849d4b602e06a9f0cffaa97d774aaa950558c015376e08ba1a5023a039f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 11, 2026.
Transparency logSecurity for bsparse 0.3.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for bsparse-0.3.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 11, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.