Name | pyterrier-pisa JSON |
Version |
0.2.1
JSON |
| download |
home_page | None |
Summary | A PyTerrier interface to the PISA search engine |
upload_time | 2024-12-05 08:26:42 |
maintainer | None |
docs_url | None |
author | Sean MacAvaney |
requires_python | >=3.8 |
license | None |
keywords |
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# PyTerrier PISA
[PyTerrier](https://github.com/terrier-org/pyterrier) bindings for the [PISA](https://github.com/pisa-engine/pisa) search engine.
Interactive Colab Demo: [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/terrierteam/pyterrier_pisa/blob/master/examples/pyterrier_pisa_antique.ipynb)
## Getting Started
These bindings are only available for cpython 3.8-3.11 on `manylinux2010_x86_64` platforms. They can be installed via pip:
```bash
pip install pyterrier_pisa
```
## Indexing
You can easily index corpora from PyTerrier datasets:
```python
import pyterrier as pt
from pyterrier_pisa import PisaIndex
# from a dataset
dataset = pt.get_dataset('irds:msmarco-passage')
index = PisaIndex('./msmarco-passage-pisa')
index.index(dataset.get_corpus_iter())
```
You can also select which text field(s) to index. If not specified, all fields of type `str` will be indexed.
```python
dataset = pt.get_dataset('irds:cord19')
index = PisaIndex('./cord19-pisa', text_field=['title', 'abstract'])
index.index(dataset.get_corpus_iter())
```
`PisaIndex` accepts various other options to configure the indexing process. Most notable are:
- `stemmer`: Which stemmer to use? Options: `porter2` (default), `krovetz`, `none`
- `threads`: How many threads to use for indexing? Default: `8`
- `index_encoding`: Which index encoding to use. Default: `block_simdbp`
- `stops`: Which set of stopwords to use. Default: `terrier`.
```python
# E.g.,
index = PisaIndex('./cord19-pisa', stemmer='krovetz', threads=32)
```
For some collections you can download pre-built indices from [data.terrier.org](http://data.terrier.org/). PISA indices are prefixed with `pisa_`.
```python
index = PisaIndex.from_dataset('trec-covid')
```
## Retrieval
From an index, you can build retrieval transformers:
```python
dph = index.dph()
bm25 = index.bm25(k1=1.2, b=0.4)
pl2 = index.pl2(c=1.0)
qld = index.qld(mu=1000.)
```
These retrievers support all the typical pipeline operations.
Search:
```python
bm25.search('covid symptoms')
# qid query docno score
# 0 1 covid symptoms a6avr09j 6.273450
# 1 1 covid symptoms hdxs9dgu 6.272374
# 2 1 covid symptoms zxq7dl9t 6.272374
# .. .. ... ... ...
# 999 1 covid symptoms m8wggdc7 4.690651
```
Batch retrieval:
```python
print(dph(dataset.get_topics('title')))
# qid query docno score
# 0 1 coronavirus origin 8ccl9aui 9.329109
# 1 1 coronavirus origin es7q6c90 9.260190
# 2 1 coronavirus origin 8l411r1w 8.862670
# ... .. ... ... ...
# 49999 50 mrna vaccine coronavirus eyitkr3s 5.610429
```
Experiment:
```python
from pyterrier.measures import *
pt.Experiment(
[dph, bm25, pl2, qld],
dataset.get_topics('title'),
dataset.get_qrels(),
[nDCG@10, P@5, P(rel=2)@5, 'mrt'],
names=['dph', 'bm25', 'pl2', 'qld']
)
# name nDCG@10 P@5 P(rel=2)@5 mrt
# 0 dph 0.623450 0.720 0.548 1.101846
# 1 bm25 0.624923 0.728 0.572 0.880318
# 2 pl2 0.536506 0.632 0.456 1.123883
# 3 qld 0.570032 0.676 0.504 0.974924
```
You can also build a retrieval transformer from `PisaRetrieve`:
```python
from pyterrier_pisa import PisaRetrieve
# from index path:
bm25 = PisaRetrieve('./cord19-pisa', scorer='bm25', bm25_k1=1.2, bm25_b=0.4)
# from dataset
bm25 = PisaRetrieve.from_dataset('trec-covid', 'pisa_unstemmed', scorer='bm25', bm25_k1=1.2, bm25_b=0.4)
```
## Extras
You can access PISA's tokenizer and stemmers using the `tokenize` function:
```python
import pyterrier_pisa
pyterrier_pisa.tokenize('hello worlds!')
# ['hello', 'worlds']
pyterrier_pisa.tokenize('hello worlds!', stemmer='porter2')
# ['hello', 'world']
```
## FAQ
**What retrieval functions are supported?**
- `"dph"`. Parameters: (none)
- `"bm25"`. Parameters: `k1`, `b`
- `"pl2"`. Parameters: `c`
- `"qld"`. Parameters: `mu`
**How do I index [some other type of data]?**
`PisaIndex` accepts an iterator over dicts, each of which containing a `docno` field and a `text` field. All you need to do is coerce the data into that
format and you're set.
Examples:
```python
# any iterator
def iter_docs():
for i in range(100):
yield {'docno': str(i), 'text': f'document {i}'}
index = PisaIndex('./dummy-pisa')
index.index(iter_docs())
# from a dataframe
import pandas as pd
docs = pd.DataFrame([
('1', 'test doc'),
('2', 'another doc'),
], columns=['docno', 'text'])
index = PisaIndex('./dummy-pisa-2')
index.index(docs.to_dict(orient="records"))
```
**Can I build a doc2query index?**
You can use `PisaIndex` with any document rewriter, such as doc2query or DeepCT.
All you need to do is build an indexing pipeline. For example:
```bash
pip install --upgrade git+https://github.com/terrierteam/pyterrier_doc2query.git
wget https://git.uwaterloo.ca/jimmylin/doc2query-data/raw/master/T5-passage/t5-base.zip
unzip t5-base.zip
```
```python
doc2query = Doc2Query(out_attr="exp_terms", batch_size=8)
dataset = pt.get_dataset('irds:vaswani')
index = PisaIndex('./vaswani-doc2query-pisa')
index_pipeline = doc2query >> pt.apply.text(lambda r: f'{r["text"]} {r["exp_terms"]}') >> index
index_pipeline.index(dataset.get_corpus_iter())
```
**Can I build a learned sparse retrieval (e.g., SPLADE) index?**
Yes! Example:
```python
import pyt_splade
splade = pyt_splade.Splade()
dataset = pt.get_dataset('irds:msmarco-passage')
index = PisaIndex('./msmarco-passage-splade', stemmer='none')
# indexing
idx_pipeline = splade.doc_encoder() >> index.toks_indexer()
idx_pipeline.index(dataset.get_corpus_iter())
# retrieval
retr_pipeline = splade.query_encoder() >> index.quantized()
```
`msmarco-passage/trec-dl-2019` effectiveness for `naver/splade-cocondenser-ensembledistil`:
| System | nDCG@10 | R(rel=2)@1000 |
|--------|---------|---------------|
| PISA | 0.731 | 0.872 |
| [From Paper](https://arxiv.org/pdf/2205.04733.pdf) | 0.732 | 0.875 |
**What are the supported index encodings and query algorithms?**
Right now we support the following index encodings: `ef`, `single`, `pefuniform`, `pefopt`, `block_optpfor`, `block_varintg8iu`, `block_streamvbyte`, `block_maskedvbyte`, `block_interpolative`, `block_qmx`, `block_varintgb`, `block_simple8b`, `block_simple16`, `block_simdbp`.
Index encodings are supplied when a `PisaIndex` is constructed:
```python
index = PisaIndex('./cord19-pisa', index_encoding='ef')
```
We support the following query algorithms: `wand`, `block_max_wand`, `block_max_maxscore`, `block_max_ranked_and`, `ranked_and`, `ranked_or`, `maxscore`.
Query algorithms are supplied when you construct a retrieval transformer:
```python
index.bm25(query_algorithm='ranked_and')
```
**Can I import/export from [CIFF](https://github.com/osirrc/ciff)?**
Yes! Using `.from_ciff(ciff_file, index_path)` and `.to_ciff(ciff_file)`
```python
# from a CIFF export:
index = PisaIndex.from_ciff('path/to/something.ciff', 'path/to/index.pisa', stemmer='krovetz') # stemmer is optional
# to a CIFF export:
index.to_ciff('path/to/something.ciff')
```
Note that you need to be careful to set stemmer to match whatever was used when constructing the index; CIFF does not directly store which stemmer
was used when building the index. If it's a stemmer that's not supported by PISA, you can set `stemmer='none'` and apply stemming in a PyTerrier pipeline.
## References
- [Mallia19]: Antonio Mallia, Michal Siedlaczek, Joel Mackenzie, Torsten Suel. PISA: Performant Indexes and Search for Academia. Proceedings of the Open-Source IR Replicability Challenge. http://ceur-ws.org/Vol-2409/docker08.pdf
- [MacAvaney22]: Sean MacAvaney, Craig Macdonald. A Python Interface to PISA!. Proceedings of SIGIR 2022. https://dl.acm.org/doi/abs/10.1145/3477495.3531656
- [Macdonald21]: Craig Macdonald, Nicola Tonellotto, Sean MacAvaney, Iadh Ounis. PyTerrier: Declarative Experimentation in Python from BM25 to Dense Retrieval. Proceedings of CIKM 2021. https://dl.acm.org/doi/abs/10.1145/3459637.3482013
## Credits
- Sean MacAvaney, University of Glasgow
- Craig Macdonald, University of Glasgow
Raw data
{
"_id": null,
"home_page": null,
"name": "pyterrier-pisa",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": null,
"author": "Sean MacAvaney",
"author_email": null,
"download_url": null,
"platform": null,
"description": "# PyTerrier PISA\n\n[PyTerrier](https://github.com/terrier-org/pyterrier) bindings for the [PISA](https://github.com/pisa-engine/pisa) search engine.\n\nInteractive Colab Demo: [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/terrierteam/pyterrier_pisa/blob/master/examples/pyterrier_pisa_antique.ipynb)\n\n## Getting Started\n\nThese bindings are only available for cpython 3.8-3.11 on `manylinux2010_x86_64` platforms. They can be installed via pip:\n\n```bash\npip install pyterrier_pisa\n```\n\n## Indexing\n\nYou can easily index corpora from PyTerrier datasets:\n\n```python\nimport pyterrier as pt\nfrom pyterrier_pisa import PisaIndex\n\n# from a dataset\ndataset = pt.get_dataset('irds:msmarco-passage')\nindex = PisaIndex('./msmarco-passage-pisa')\nindex.index(dataset.get_corpus_iter())\n```\n\nYou can also select which text field(s) to index. If not specified, all fields of type `str` will be indexed.\n\n```python\ndataset = pt.get_dataset('irds:cord19')\nindex = PisaIndex('./cord19-pisa', text_field=['title', 'abstract'])\nindex.index(dataset.get_corpus_iter())\n```\n\n`PisaIndex` accepts various other options to configure the indexing process. Most notable are:\n - `stemmer`: Which stemmer to use? Options: `porter2` (default), `krovetz`, `none`\n - `threads`: How many threads to use for indexing? Default: `8`\n - `index_encoding`: Which index encoding to use. Default: `block_simdbp`\n - `stops`: Which set of stopwords to use. Default: `terrier`.\n\n\n```python\n# E.g.,\nindex = PisaIndex('./cord19-pisa', stemmer='krovetz', threads=32)\n```\n\nFor some collections you can download pre-built indices from [data.terrier.org](http://data.terrier.org/). PISA indices are prefixed with `pisa_`.\n\n```python\nindex = PisaIndex.from_dataset('trec-covid')\n```\n\n## Retrieval\n\nFrom an index, you can build retrieval transformers:\n\n```python\ndph = index.dph()\nbm25 = index.bm25(k1=1.2, b=0.4)\npl2 = index.pl2(c=1.0)\nqld = index.qld(mu=1000.)\n```\n\nThese retrievers support all the typical pipeline operations.\n\nSearch:\n\n```python\nbm25.search('covid symptoms')\n# qid query docno score\n# 0 1 covid symptoms a6avr09j 6.273450\n# 1 1 covid symptoms hdxs9dgu 6.272374\n# 2 1 covid symptoms zxq7dl9t 6.272374\n# .. .. ... ... ...\n# 999 1 covid symptoms m8wggdc7 4.690651\n```\n\nBatch retrieval:\n\n```python\nprint(dph(dataset.get_topics('title')))\n# qid query docno score\n# 0 1 coronavirus origin 8ccl9aui 9.329109\n# 1 1 coronavirus origin es7q6c90 9.260190\n# 2 1 coronavirus origin 8l411r1w 8.862670\n# ... .. ... ... ...\n# 49999 50 mrna vaccine coronavirus eyitkr3s 5.610429\n```\n\nExperiment:\n\n```python\nfrom pyterrier.measures import *\npt.Experiment(\n [dph, bm25, pl2, qld],\n dataset.get_topics('title'),\n dataset.get_qrels(),\n [nDCG@10, P@5, P(rel=2)@5, 'mrt'],\n names=['dph', 'bm25', 'pl2', 'qld']\n)\n# name nDCG@10 P@5 P(rel=2)@5 mrt\n# 0 dph 0.623450 0.720 0.548 1.101846\n# 1 bm25 0.624923 0.728 0.572 0.880318\n# 2 pl2 0.536506 0.632 0.456 1.123883\n# 3 qld 0.570032 0.676 0.504 0.974924\n```\n\nYou can also build a retrieval transformer from `PisaRetrieve`:\n\n```python\nfrom pyterrier_pisa import PisaRetrieve\n# from index path:\nbm25 = PisaRetrieve('./cord19-pisa', scorer='bm25', bm25_k1=1.2, bm25_b=0.4)\n# from dataset\nbm25 = PisaRetrieve.from_dataset('trec-covid', 'pisa_unstemmed', scorer='bm25', bm25_k1=1.2, bm25_b=0.4)\n```\n\n## Extras\n\nYou can access PISA's tokenizer and stemmers using the `tokenize` function:\n\n```python\nimport pyterrier_pisa\npyterrier_pisa.tokenize('hello worlds!')\n# ['hello', 'worlds']\npyterrier_pisa.tokenize('hello worlds!', stemmer='porter2')\n# ['hello', 'world']\n```\n\n## FAQ\n\n**What retrieval functions are supported?**\n\n - `\"dph\"`. Parameters: (none)\n - `\"bm25\"`. Parameters: `k1`, `b`\n - `\"pl2\"`. Parameters: `c`\n - `\"qld\"`. Parameters: `mu`\n\n**How do I index [some other type of data]?**\n\n`PisaIndex` accepts an iterator over dicts, each of which containing a `docno` field and a `text` field. All you need to do is coerce the data into that\nformat and you're set.\n\nExamples:\n\n```python\n# any iterator\ndef iter_docs():\n for i in range(100):\n yield {'docno': str(i), 'text': f'document {i}'}\nindex = PisaIndex('./dummy-pisa')\nindex.index(iter_docs())\n\n# from a dataframe\nimport pandas as pd\ndocs = pd.DataFrame([\n ('1', 'test doc'),\n ('2', 'another doc'),\n], columns=['docno', 'text'])\nindex = PisaIndex('./dummy-pisa-2')\nindex.index(docs.to_dict(orient=\"records\"))\n```\n\n**Can I build a doc2query index?**\n\nYou can use `PisaIndex` with any document rewriter, such as doc2query or DeepCT.\nAll you need to do is build an indexing pipeline. For example:\n\n```bash\npip install --upgrade git+https://github.com/terrierteam/pyterrier_doc2query.git\nwget https://git.uwaterloo.ca/jimmylin/doc2query-data/raw/master/T5-passage/t5-base.zip\nunzip t5-base.zip\n```\n\n```python\ndoc2query = Doc2Query(out_attr=\"exp_terms\", batch_size=8)\ndataset = pt.get_dataset('irds:vaswani')\nindex = PisaIndex('./vaswani-doc2query-pisa')\nindex_pipeline = doc2query >> pt.apply.text(lambda r: f'{r[\"text\"]} {r[\"exp_terms\"]}') >> index\nindex_pipeline.index(dataset.get_corpus_iter())\n```\n\n**Can I build a learned sparse retrieval (e.g., SPLADE) index?**\n\nYes! Example:\n\n```python\nimport pyt_splade\nsplade = pyt_splade.Splade()\ndataset = pt.get_dataset('irds:msmarco-passage')\nindex = PisaIndex('./msmarco-passage-splade', stemmer='none')\n\n# indexing\nidx_pipeline = splade.doc_encoder() >> index.toks_indexer()\nidx_pipeline.index(dataset.get_corpus_iter())\n\n# retrieval\n\nretr_pipeline = splade.query_encoder() >> index.quantized()\n```\n\n`msmarco-passage/trec-dl-2019` effectiveness for `naver/splade-cocondenser-ensembledistil`:\n\n| System | nDCG@10 | R(rel=2)@1000 |\n|--------|---------|---------------|\n| PISA | 0.731 | 0.872 |\n| [From Paper](https://arxiv.org/pdf/2205.04733.pdf) | 0.732 | 0.875 |\n\n\n**What are the supported index encodings and query algorithms?**\n\nRight now we support the following index encodings: `ef`, `single`, `pefuniform`, `pefopt`, `block_optpfor`, `block_varintg8iu`, `block_streamvbyte`, `block_maskedvbyte`, `block_interpolative`, `block_qmx`, `block_varintgb`, `block_simple8b`, `block_simple16`, `block_simdbp`.\n\nIndex encodings are supplied when a `PisaIndex` is constructed:\n\n```python\nindex = PisaIndex('./cord19-pisa', index_encoding='ef')\n```\n\nWe support the following query algorithms: `wand`, `block_max_wand`, `block_max_maxscore`, `block_max_ranked_and`, `ranked_and`, `ranked_or`, `maxscore`.\n\nQuery algorithms are supplied when you construct a retrieval transformer:\n\n```python\nindex.bm25(query_algorithm='ranked_and')\n```\n\n**Can I import/export from [CIFF](https://github.com/osirrc/ciff)?**\n\nYes! Using `.from_ciff(ciff_file, index_path)` and `.to_ciff(ciff_file)`\n\n```python\n# from a CIFF export:\nindex = PisaIndex.from_ciff('path/to/something.ciff', 'path/to/index.pisa', stemmer='krovetz') # stemmer is optional\n# to a CIFF export:\nindex.to_ciff('path/to/something.ciff')\n```\n\nNote that you need to be careful to set stemmer to match whatever was used when constructing the index; CIFF does not directly store which stemmer\nwas used when building the index. If it's a stemmer that's not supported by PISA, you can set `stemmer='none'` and apply stemming in a PyTerrier pipeline.\n\n## References\n\n - [Mallia19]: Antonio Mallia, Michal Siedlaczek, Joel Mackenzie, Torsten Suel. PISA: Performant Indexes and Search for Academia. Proceedings of the Open-Source IR Replicability Challenge. http://ceur-ws.org/Vol-2409/docker08.pdf\n - [MacAvaney22]: Sean MacAvaney, Craig Macdonald. A Python Interface to PISA!. Proceedings of SIGIR 2022. https://dl.acm.org/doi/abs/10.1145/3477495.3531656\n - [Macdonald21]: Craig Macdonald, Nicola Tonellotto, Sean MacAvaney, Iadh Ounis. PyTerrier: Declarative Experimentation in Python from BM25 to Dense Retrieval. Proceedings of CIKM 2021. https://dl.acm.org/doi/abs/10.1145/3459637.3482013\n\n## Credits\n\n - Sean MacAvaney, University of Glasgow\n - Craig Macdonald, University of Glasgow\n",
"bugtrack_url": null,
"license": null,
"summary": "A PyTerrier interface to the PISA search engine",
"version": "0.2.1",
"project_urls": null,
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "e2dd8e3b7fa43b587720cb95a1bfdc49198d7dc9e79c6a86c365775400d0d7e0",
"md5": "17af11a014c2806b581c2e2a9a655f6d",
"sha256": "fddc601dcb7a5c29ff93cc0e4357f43ec29c1849d95ebb6f13c3f7a5cc3f8c1e"
},
"downloads": -1,
"filename": "pyterrier_pisa-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "17af11a014c2806b581c2e2a9a655f6d",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 4075973,
"upload_time": "2024-12-05T08:26:42",
"upload_time_iso_8601": "2024-12-05T08:26:42.238939Z",
"url": "https://files.pythonhosted.org/packages/e2/dd/8e3b7fa43b587720cb95a1bfdc49198d7dc9e79c6a86c365775400d0d7e0/pyterrier_pisa-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d371c0c86bd440bcea5335012d45b39b8e4db49328eb9ddf09ae2d8ca79c4481",
"md5": "cb6183a44263397da98f562858e844e1",
"sha256": "252b3e5eb2db6bdd226c3458060f529c8f8cb3a9381176ed32cb3bced633469c"
},
"downloads": -1,
"filename": "pyterrier_pisa-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "cb6183a44263397da98f562858e844e1",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 4075977,
"upload_time": "2024-12-05T08:26:44",
"upload_time_iso_8601": "2024-12-05T08:26:44.376158Z",
"url": "https://files.pythonhosted.org/packages/d3/71/c0c86bd440bcea5335012d45b39b8e4db49328eb9ddf09ae2d8ca79c4481/pyterrier_pisa-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d591576a57d42b8879ed5560275a66beef439b70555cd04c487120bd08c4c792",
"md5": "3d8258337e8eb122ebe3f0b1b6a64a51",
"sha256": "b7f24973ae5e0666e0839995188355d85fbf2523b4e2d23a699f4f80ddf23aa8"
},
"downloads": -1,
"filename": "pyterrier_pisa-0.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "3d8258337e8eb122ebe3f0b1b6a64a51",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 4075965,
"upload_time": "2024-12-05T08:26:46",
"upload_time_iso_8601": "2024-12-05T08:26:46.278786Z",
"url": "https://files.pythonhosted.org/packages/d5/91/576a57d42b8879ed5560275a66beef439b70555cd04c487120bd08c4c792/pyterrier_pisa-0.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "890601224edbcf5d513bb72b2451f44231e15b7771dea211464c45d3a765f3ee",
"md5": "b1b4a644284195ae00ffef3ecaf77e67",
"sha256": "0c933563bbb79003cdad78d864aca921ec85112abc9fbec66d3cb258238e3c20"
},
"downloads": -1,
"filename": "pyterrier_pisa-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "b1b4a644284195ae00ffef3ecaf77e67",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 4075971,
"upload_time": "2024-12-05T08:26:48",
"upload_time_iso_8601": "2024-12-05T08:26:48.366010Z",
"url": "https://files.pythonhosted.org/packages/89/06/01224edbcf5d513bb72b2451f44231e15b7771dea211464c45d3a765f3ee/pyterrier_pisa-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-05 08:26:42",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "pyterrier-pisa"
}