皮塞里尼
Pyserini 是一个 Python 工具包,用于具有稀疏和密集表示的可重复信息检索研究。通过与我们小组基于 Lucene 构建的 Anserini IR 工具包集成,可以使用稀疏表示进行检索。通过与 Facebook 的 Faiss 库集成,提供使用密集表示的检索。
Pyserini 的主要设计目的是在多阶段排名架构中提供有效、可重复且易于使用的第一阶段检索。我们的工具包是独立的标准 Python 包,并附带针对许多常用 IR 测试集合的查询、相关性判断、预构建索引和评估脚本。使用 Pyserini,可以轻松地在许多标准 IR 测试集合上重现运行!
有关更多详细信息,我们在 SIGIR 2021 中的论文提供了很好的概述。
新的! TREC 2024 RAG Track 的 MS MARCO 2.1 文档语料库使用指南。
❗ Anserini 在提交272565
(2024/04/03) 处从 JDK 11 升级到 JDK 21,对应于 v0.35.0 的版本。相应地,Pyserini 在提交b2f677
(2024/04/04) 处升级到 JDK 21。
?安装
通过 PyPI 安装:
Pyserini 构建于 Python 3.10(其他版本可能也可以,但 YMMV)和 Java 21(由于其依赖于 Anserini)。 pip
安装将自动引入主要依赖项,例如 PyTorch、? Transformer 和 ONNX 运行时。
该工具包还有许多可选的依赖项:
pip install 'pyserini[optional]'
值得注意的是, faiss-cpu
、 lightgbm
和nmslib
包含在这些可选依赖项中。这些软件包的安装可能会不稳定,这就是为什么它们不包含在核心依赖项中的原因。自己单独安装这些可能是个好主意。
软件生态系统正在快速发展,潜在的挫败感是不同版本的底层依赖项之间的不兼容。我们在此处提供其他详细的安装说明。
如果您计划仅使用Pyserini,那么pip
指令(不带可选依赖项)应该没问题。但是,如果您计划为代码库做出贡献或想要使用最新的尚未发布的功能,则需要进行开发安装。此处提供了说明。
?我如何搜索?
Pyserini 支持不同类型的检索模型。请参阅本指南,详细了解如何使用我们已为您构建的索引来搜索 IR 和 NLP 研究中的常见语料库(例如 MS MARCO、NaturalQuestions、BEIR 等)。以下是该指南的直接链接:
- 使用 Lucene 的传统词汇模型(例如 BM25)。
- 使用Lucene学习稀疏检索模型(例如uniCOIL、SPLADE等)。
- 使用 Lucene 或 Faiss 学习密集检索模型(例如 DPR、Contriever、BGE 等)。
- 混合检索模型(例如,密集稀疏融合)。
一旦获得前k 个结果,您实际上会想要获取文档文本......请参阅本指南了解如何操作。
?如何索引我自己的语料库?
好吧,这取决于您想要使用哪种类型的检索模型进行搜索:
- 构建 BM25 索引(直接 Java 实现)
- 构建 BM25 索引(嵌入式 Python 实现)
- 构建稀疏向量索引
- 构建密集向量索引
对于不同类别的模型,步骤有所不同:本指南(与上面的链接相同)描述了详细信息。
?其他常见问题解答
- 如何配置搜索? (交互式搜索指南)
- 如何手动下载索引? (交互式搜索指南)
- 如何执行密集和混合检索? (交互式搜索指南)
- 如何迭代索引术语和访问术语统计信息? (索引阅读器 API)
- 如何遍历帖子? (索引阅读器 API)
- 如何访问和操作术语向量? (索引阅读器 API)
- 如何计算文档的 tf-idf 或 BM25 分数? (索引阅读器 API)
- 如何访问基本索引统计信息? (索引阅读器 API)
- 如何访问底层 Lucene 分析器? (分析器API)
- 如何构建自定义 Lucene 查询? (查询生成器 API)
- 如何迭代原始集合? (采集API)
⚗️ 再现性
使用 Pyserini,可以轻松地在许多标准 IR 测试集合上重现运行!我们提供了许多预构建的索引,直接支持“开箱即用”的可重复性。
在我们的 SIGIR 2022 论文中,我们引入了“双击复制”,允许任何人只需单击两次(即复制和粘贴)即可复制实验运行。文档被组织成不同语料库的再现矩阵,提供不同实验条件和查询集的摘要:
- MS MARCO V1 通道
- MS MARCO V1 文档
- MS MARCO V2 通道
- MS MARCO V2 文档
- 贝尔
- 泰迪先生
- 米拉克
- 开放域问答
- 西拉尔
有关更多详细信息,请参阅我们关于在学术研究中构建可重复性文化的论文。
下面的其他复制指南提供了详细的分步说明。
稀疏检索
稀疏检索
- 复制 Robust04 基线以进行临时检索
- 重现 MS MARCO V1 通道排名的 BM25 基线
- 重现 MS MARCO V1 文档排名的 BM25 基线
- 从 Elasticsearch 重现 MS MARCO V1 文档排名的多字段 BM25 基线
- 在 MS MARCO V2 系列上复制 BM25 基线
- 重现 LTR 过滤实验:MS MARCO V1 Passage、MS MARCO V1 Document
- 在 MS MARCO V1 系列上重现 IRST 实验
- 再现 DeepImpact:MS MARCO V1 通道
- 使用 doc2query-T5 再现 uniCOIL:MS MARCO V1、MS MARCO V2
- 用 TILDE 再现 uniCOIL:MS MARCO V1 Passage、MS MARCO V2 Passage
- 再现 SPLADEv2:MS MARCO V1 通道
- 重现 TyDi 先生的实验
- 复制 HC4 的 BM25 基线
- 在 NeuCLIR22 上重现 HC4 的 BM25 基线
- 重现 SLIM 实验
- KILT 基线:知识密集型语言任务的基准
- TripClick 的基线:健康领域点击日志的大规模数据集
- FEVER(事实提取和验证)数据集的基线(在 Anserini 中)
密集检索
密集检索
- 重现 TCT-ColBERTv1 实验:MS MARCO V1
- 重现 TCT-ColBERTv2 实验:MS MARCO V1、MS MARCO V2
- 重现 DPR 实验
- 重现 BPR 实验
- 再现 ANCE 实验
- 重现 DistilBERT KD 实验
- 重现 DistilBERT 平衡主题感知采样实验
- 重现 SBERT 密集检索实验
- 重现 ADORE 密集检索实验
- 再现矢量 PRF 实验
- 重现 ANCE-PRF 实验
- 重现 TyDi 先生的实验
- 重现 DKRR 实验
混合稀疏-密集检索
混合稀疏-密集检索
- 在 MS MARCO V2 Collections 上重现 uniCOIL + TCT-ColBERTv2 实验
可用语料库
可用语料库
语料库 | 尺寸 | 校验和 |
---|
MS MARCO V1 通道:uniCOIL (noexp) | 2.7GB | f17ddd8c7c00ff121c3c3b147d2e17d8 |
MS MARCO V1 通道:uniCOIL (d2q-T5) | 3.4GB | 78eef752c78c8691f7d61600ceed306f |
MS MARCO V1 文档:uniCOIL (noexp) | 11GB | 11b226e1cacd9c8ae0a660fd14cdd710 |
MS MARCO V1 文档:uniCOIL (d2q-T5) | 19GB | 6a00e2c0c375cb1e52c83ae5ac377ebb |
MS MARCO V2 通道:uniCOIL (noexp) | 24GB | d9cc1ed3049746e68a2c91bf90e5212d |
MS MARCO V2 通道:uniCOIL (d2q-T5) | 41GB | 1949a00bfd5e1f1a230a04bbc1f01539 |
MS MARCO V2 文档:uniCOIL (noexp) | 55GB | 97ba262c497164de1054f357caea0c63 |
MS MARCO V2 文档:uniCOIL (d2q-T5) | 72GB | c5639748c2cbad0152e10b0ebde3b804 |
?附加文档
- 预建索引指南
- 交互式搜索指南
- 使用 20Newsgroups 数据集进行文本分类的指南
- COVID-19 开放研究数据集 (CORD-19) 使用指南
- 使用实体链接的指南
- spaCy 使用指南
- 分析器 API 的使用
- 索引读取器 API 的使用
- 查询生成器 API 的使用
- 集合 API 的使用
- 通过 Pyjnius 直接交互
️ 发布历史
- v0.43.0(带 Anserini v0.38.0):2024 年 11 月 11 日 [发行说明]
- v0.42.0(带 Anserini v0.38.0):2024 年 11 月 8 日 [发行说明] [已知问题]
- v0.41.0(带 Anserini v0.38.0):2024 年 11 月 7 日 [发行说明] [已知问题]
- v0.40.0(带 Anserini v0.38.0):2024 年 10 月 28 日 [发行说明]
- v0.39.0(带 Anserini v0.38.0):2024 年 9 月 27 日 [发行说明]
- v0.38.0(带 Anserini v0.38.0):2024 年 9 月 11 日 [发行说明]
- v0.37.0(带 Anserini v0.37.0):2024 年 8 月 26 日 [发行说明]
- v0.36.0(带 Anserini v0.36.1):2024 年 6 月 17 日 [发行说明]
- v0.35.0(带 Anserini v0.35.0):2024 年 4 月 4 日 [发行说明]
较旧的...(和历史记录)
- v0.25.0(带 Anserini v0.25.0):2024 年 3 月 31 日 [发行说明]
- v0.24.0(带 Anserini v0.24.0):2023 年 12 月 28 日 [发行说明]
- v0.23.0(带 Anserini v0.23.0):2023 年 11 月 17 日 [发行说明]
- v0.22.1(带 Anserini v0.22.1):2023 年 10 月 19 日 [发行说明]
- v0.22.0(带 Anserini v0.22.0):2023 年 8 月 31 日 [发行说明]
- v0.21.0(带 Anserini v0.21.0):2023 年 4 月 6 日 [发行说明]
- v0.20.0(带 Anserini v0.20.0):2023 年 2 月 1 日 [发行说明]
- v0.19.2(带 Anserini v0.16.2):2022 年 12 月 16 日 [发行说明]
- v0.19.1(带 Anserini v0.16.1):2022 年 11 月 12 日 [发行说明]
- v0.19.0(带 Anserini v0.16.1):2022 年 11 月 2 日 [发行说明] [已知问题]
- v0.18.0(带 Anserini v0.15.0):2022 年 9 月 26 日 [发行说明](基于 Lucene 9 的第一个版本)
- v0.17.1(带 Anserini v0.14.4):2022 年 8 月 13 日 [发行说明](基于 Lucene 8 的最终版本)
- v0.17.0(带 Anserini v0.14.3):2022 年 5 月 28 日 [发行说明]
- v0.16.1(带 Anserini v0.14.3):2022 年 5 月 12 日 [发行说明]
- v0.16.0(带 Anserini v0.14.1):2022 年 3 月 1 日 [发行说明]
- v0.15.0(带 Anserini v0.14.0):2022 年 1 月 21 日 [发行说明]
- v0.14.0(带 Anserini v0.13.5):2021 年 11 月 8 日 [发行说明]
- v0.13.0(带 Anserini v0.13.1):2021 年 7 月 3 日 [发行说明]
- v0.12.0(带 Anserini v0.12.0):2021 年 5 月 5 日 [发行说明]
- v0.11.0.0:2021 年 2 月 18 日 [发行说明]
- v0.10.1.0:2021 年 1 月 8 日 [发行说明]
- v0.10.0.1:2020 年 12 月 2 日 [发行说明]
- v0.10.0.0:2020 年 11 月 26 日 [发行说明]
- v0.9.4.0:2020 年 6 月 26 日 [发行说明]
- v0.9.3.1:2020 年 6 月 11 日 [发行说明]
- v0.9.3.0:2020 年 5 月 27 日 [发行说明]
- v0.9.2.0:2020 年 5 月 15 日 [发行说明]
- v0.9.1.0:2020 年 5 月 6 日 [发行说明]
- v0.9.0.0:2020 年 4 月 18 日 [发行说明]
- v0.8.1.0:2020 年 3 月 22 日 [发行说明]
- v0.8.0.0:2020 年 3 月 12 日 [发行说明]
- v0.7.2.0:2020 年 1 月 25 日 [发行说明]
- v0.7.1.0:2020 年 1 月 9 日 [发行说明]
- v0.7.0.0:2019 年 12 月 13 日 [发行说明]
- v0.6.0.0:2019 年 11 月 2 日
️ 历史笔记
⁉️ Lucene 8 到 Lucene 9 的过渡。 2022年,Pyserini经历了从Lucene 8到Lucene 9的过渡。大部分预建索引已经使用Lucene 9重建,但也有少数仍然基于Lucene 8。
更多详情:
- PyPI v0.17.1(提交
33c87c
,2022/08/13 发布)是基于 Lucene 8 构建的最后一个 Pyserini 版本,基于 Anserini v0.14.4。此后,Anserini trunk升级到Lucene 9。 - PyPI v0.18.0(提交
5fab14
,2022/09/26 发布)基于 Anserini v0.15.0 构建,使用 Lucene 9。此后,Pyserini trunk 升级到 Lucene 9。
说明:
有什么影响?使用 Lucene 8 构建的索引与 Lucene 9 代码不完全兼容(请参阅 Anserini #1952)。解决方法是禁用一致的平局打破,如果 Pyserini 检测到 Lucene 8 索引,这种情况会自动发生。但是,在 Lucene 8 索引上运行的 Lucene 9 代码将给出与在 Lucene 8 索引上运行的 Lucene 8 代码略有不同的结果。请注意,Lucene 8 代码无法读取使用 Lucene 9 构建的索引。
为什么这是必要的?虽然具有颠覆性,但为了利用 Lucene 的 HNSW 索引,升级到 Lucene 9 是必要的,这将增强 Pyserini 的功能并打开密集/稀疏混合的设计空间。
在 v0.11.0.0 及之前,Pyserini 版本采用了XYZW约定,其中XYZ跟踪 Anserini 的版本, W用于区分 Python 端的不同版本。从 Anserini v0.12.0 开始,Anserini 和 Pyserini 版本已解耦。
Anserini 设计用于与 JDK 11 配合使用。JDK 9 之上的 JRE 路径更改破坏了 pyjnius 1.2.0,如本期所述,Anserini 中也有报告(此处和此处)。此问题已在 pyjnius 1.2.1(2019 年 12 月发布)中修复。此笔记本中记录了先前的错误,并且此笔记本记录了修复程序。
参考
如果您使用 Pyserini,请引用以下论文:
@INPROCEEDINGS{Lin_etal_SIGIR2021_Pyserini,
author = "Jimmy Lin and Xueguang Ma and Sheng-Chieh Lin and Jheng-Hong Yang and Ronak Pradeep and Rodrigo Nogueira",
title = "{Pyserini}: A {Python} Toolkit for Reproducible Information Retrieval Research with Sparse and Dense Representations",
booktitle = "Proceedings of the 44th Annual International ACM SIGIR Conference on Research and Development in Information Retrieval (SIGIR 2021)",
year = 2021,
pages = "2356--2362",
}
致谢
这项研究主要得到加拿大自然科学与工程研究委员会(NSERC)的部分支持。