Pyserini
Pyserini é um kit de ferramentas Python para pesquisa reproduzível de recuperação de informações com representações esparsas e densas. A recuperação usando representações esparsas é fornecida por meio da integração com o kit de ferramentas Anserini IR do nosso grupo, que é construído em Lucene. A recuperação usando representações densas é fornecida através da integração com a biblioteca Faiss do Facebook.
Pyserini foi projetado principalmente para fornecer recuperação de primeiro estágio eficaz, reproduzível e fácil de usar em uma arquitetura de classificação de vários estágios. Nosso kit de ferramentas é independente como um pacote Python padrão e vem com consultas, julgamentos de relevância, índices pré-construídos e scripts de avaliação para muitas coleções de testes de IR comumente usadas. Com o Pyserini, é fácil reproduzir execuções em diversas coleções de testes IR padrão!
Para obter detalhes adicionais, nosso artigo no SIGIR 2021 fornece uma boa visão geral.
Novo! Guia para trabalhar com o MS MARCO 2.1 Document Corpus para TREC 2024 RAG Track.
❗ Anserini foi atualizado do JDK 11 para JDK 21 no commit 272565
(2024/04/03), que corresponde ao lançamento da v0.35.0. Da mesma forma, Pyserini foi atualizado para JDK 21 no commit b2f677
(2024/04/04).
? Instalação
Instale via PyPI:
Pyserini é construído em Python 3.10 (outras versões podem funcionar, mas YMMV) e Java 21 (devido à sua dependência de Anserini). Uma instalação pip
puxará automaticamente as dependências principais, como PyTorch, ? Transformadores e o tempo de execução ONNX.
O kit de ferramentas também possui diversas dependências opcionais:
pip install 'pyserini[optional]'
Notavelmente, faiss-cpu
, lightgbm
e nmslib
estão incluídos nessas dependências opcionais. A instalação desses pacotes pode ser temperamental, e é por isso que eles não estão incluídos nas dependências principais. Pode ser uma boa ideia instalá-los separadamente.
O ecossistema de software está evoluindo rapidamente e uma fonte potencial de frustração é a incompatibilidade entre diferentes versões de dependências subjacentes. Fornecemos instruções de instalação detalhadas adicionais aqui.
Se você está planejando usar apenas o Pyserini, então a instrução pip
(sem as dependências opcionais) deve servir. No entanto, se você planeja contribuir com a base de código ou deseja trabalhar com os recursos mais recentes ainda não lançados, precisará de uma instalação de desenvolvimento. As instruções são fornecidas aqui.
? Como faço para pesquisar?
Pyserini oferece suporte a diferentes tipos de modelos de recuperação. Consulte este guia para obter detalhes sobre como pesquisar corpora comuns em pesquisas de RI e PNL (por exemplo, MS MARCO, NaturalQuestions, BEIR, etc.) usando índices que já construímos para você. Aqui estão links diretos para o guia:
- Modelos lexicais tradicionais (por exemplo, BM25) usando Lucene.
- Modelos de recuperação esparsa aprendidos (por exemplo, uniCOIL, SPLADE, etc.) usando Lucene.
- Modelos de recuperação densa aprendidos (por exemplo, DPR, Contriever, BGE, etc.) usando Lucene ou Faiss.
- Modelos de recuperação híbridos (por exemplo, fusão densa-esparsa).
Depois de obter os k resultados principais, você realmente desejará buscar o texto do documento... Veja este guia para saber como.
? Como faço para indexar meu próprio corpus?
Bem, depende do tipo de modelo de recuperação que você deseja pesquisar:
- Construindo um índice BM25 (implementação direta de Java)
- Construindo um índice BM25 (implementação Python incorporável)
- Construindo um índice vetorial esparso
- Construindo um índice vetorial denso
As etapas são diferentes para diferentes classes de modelos: este guia (igual aos links acima) descreve os detalhes.
? Perguntas frequentes adicionais
- Como configuro a pesquisa? (Guia para pesquisa interativa)
- Como faço o download manual dos índices? (Guia para pesquisa interativa)
- Como executo recuperação densa e híbrida? (Guia para pesquisa interativa)
- Como faço para iterar os termos do índice e acessar as estatísticas dos termos? (API do leitor de índice)
- Como faço para percorrer as postagens? (API do leitor de índice)
- Como acesso e manipulo vetores de termos? (API do leitor de índice)
- Como calculo a pontuação tf-idf ou BM25 de um documento? (API do leitor de índice)
- Como acesso as estatísticas básicas do índice? (API do leitor de índice)
- Como acesso os analisadores Lucene subjacentes? (API do analisador)
- Como faço para criar consultas Lucene personalizadas? (API do Construtor de Consultas)
- Como faço para iterar coleções brutas? (API de coleção)
⚗️ Reprodutibilidade
Com o Pyserini, é fácil reproduzir execuções em diversas coleções de testes IR padrão! Fornecemos vários índices pré-construídos que oferecem suporte direto à reprodutibilidade "pronto para uso".
Em nosso artigo SIGIR 2022, introduzimos “reproduções em dois cliques” que permitem a qualquer pessoa reproduzir execuções experimentais com apenas dois cliques (ou seja, copiar e colar). A documentação é organizada em matrizes de reprodução para diferentes corpora que fornecem um resumo de diferentes condições experimentais e conjuntos de consultas:
- Passagem MS MARCO V1
- Documento MS MARCO V1
- Passagem MS MARCO V2
- Documento MS MARCO V2
- BEIR
- Sr.TyDi
- MIRACL
- Resposta a perguntas de domínio aberto
- CIRAL
Para obter mais detalhes, consulte nosso artigo Construindo uma Cultura de Reprodutibilidade na Pesquisa Acadêmica.
Guias de reprodução adicionais abaixo fornecem instruções passo a passo detalhadas.
Recuperação esparsa
Recuperação esparsa
- Reproduzindo linhas de base do Robust04 para recuperação ad hoc
- Reproduzindo a linha de base BM25 para MS MARCO V1 Passage Ranking
- Reproduzindo a linha de base BM25 para classificação de documentos MS MARCO V1
- Reproduzindo a linha de base BM25 multicampo para MS MARCO V1 Document Ranking do Elasticsearch
- Reproduzindo linhas de base BM25 nas coleções MS MARCO V2
- Reproduzindo experimentos de filtragem LTR: MS MARCO V1 Passage, MS MARCO V1 Document
- Reproduzindo experimentos IRST nas coleções MS MARCO V1
- Reproduzindo DeepImpact: Passagem MS MARCO V1
- Reproduzindo uniCOIL com doc2query-T5: MS MARCO V1, MS MARCO V2
- Reproduzindo uniCOIL com TILDE: Passagem MS MARCO V1, Passagem MS MARCO V2
- Reproduzindo SPLADEv2: Passagem MS MARCO V1
- Reproduzindo experimentos do Sr. TyDi
- Reproduzindo linhas de base BM25 para HC4
- Reproduzindo linhas de base BM25 para HC4 no NeuCLIR22
- Reproduzindo experimentos SLIM
- Linhas de base para KILT: uma referência para tarefas linguísticas com uso intensivo de conhecimento
- Linhas de base para TripClick: um conjunto de dados em grande escala de registros de cliques no domínio da saúde
- Linhas de base (em Anserini) para o conjunto de dados FEVER (Extração e VERificação de Fatos)
Recuperação Densa
Recuperação Densa
- Reproduzindo experimentos TCT-ColBERTv1: MS MARCO V1
- Reproduzindo experimentos TCT-ColBERTv2: MS MARCO V1, MS MARCO V2
- Reproduzindo experimentos DPR
- Reproduzindo experimentos BPR
- Reproduzindo experimentos ANCE
- Reproduzindo experimentos DistilBERT KD
- Reproduzindo experimentos de amostragem balanceada com reconhecimento de tópico do DistilBERT
- Reproduzindo experimentos de recuperação densa SBERT
- Reproduzindo experimentos de recuperação densa ADORE
- Reproduzindo experimentos Vector PRF
- Reproduzindo experimentos ANCE-PRF
- Reproduzindo experimentos do Sr. TyDi
- Reproduzindo experimentos DKRR
Recuperação híbrida esparsa-densa
Recuperação híbrida esparsa-densa
- Reproduzindo experimentos uniCOIL + TCT-ColBERTv2 nas coleções MS MARCO V2
Corpos Disponíveis
Corpos Disponíveis
Corpos | Tamanho | Soma de verificação |
---|
Passagem MS MARCO V1: uniCOIL (noexp) | 2,7 GB | f17ddd8c7c00ff121c3c3b147d2e17d8 |
Passagem MS MARCO V1: uniCOIL (d2q-T5) | 3,4GB | 78eef752c78c8691f7d61600ceed306f |
Documento MS MARCO V1: uniCOIL (noexp) | 11 GB | 11b226e1cacd9c8ae0a660fd14cdd710 |
Documento MS MARCO V1: uniCOIL (d2q-T5) | 19 GB | 6a00e2c0c375cb1e52c83ae5ac377ebb |
Passagem MS MARCO V2: uniCOIL (noexp) | 24GB | d9cc1ed3049746e68a2c91bf90e5212d |
Passagem MS MARCO V2: uniCOIL (d2q-T5) | 41 GB | 1949a00bfd5e1f1a230a04bbc1f01539 |
Documento MS MARCO V2: uniCOIL (noexp) | 55 GB | 97ba262c497164de1054f357caea0c63 |
Documento MS MARCO V2: uniCOIL (d2q-T5) | 72GB | c5639748c2cbad0152e10b0ebde3b804 |
? Documentação Adicional
- Guia para índices pré-construídos
- Guia para pesquisa interativa
- Guia para classificação de texto com o conjunto de dados 20Newsgroups
- Guia para trabalhar com o conjunto de dados de pesquisa aberta COVID-19 (CORD-19)
- Guia para trabalhar com vinculação de entidades
- Guia para trabalhar com spaCy
- Uso da API do analisador
- Uso da API Index Reader
- Uso da API Query Builder
- Uso da API de coleção
- Interação direta via Pyjnius
️ Histórico de lançamento
- v0.43.0 (com Anserini v0.38.0): 11 de novembro de 2024 [Notas de versão]
- v0.42.0 (com Anserini v0.38.0): 8 de novembro de 2024 [Notas de versão] [Problemas conhecidos]
- v0.41.0 (com Anserini v0.38.0): 7 de novembro de 2024 [Notas de versão] [Problemas conhecidos]
- v0.40.0 (com Anserini v0.38.0): 28 de outubro de 2024 [Notas de versão]
- v0.39.0 (com Anserini v0.38.0): 27 de setembro de 2024 [Notas de versão]
- v0.38.0 (com Anserini v0.38.0): 11 de setembro de 2024 [Notas de versão]
- v0.37.0 (com Anserini v0.37.0): 26 de agosto de 2024 [Notas de versão]
- v0.36.0 (com Anserini v0.36.1): 17 de junho de 2024 [Notas de versão]
- v0.35.0 (com Anserini v0.35.0): 4 de abril de 2024 [Notas de versão]
mais antigo... (e notas históricas)
- v0.25.0 (com Anserini v0.25.0): 31 de março de 2024 [Notas de versão]
- v0.24.0 (com Anserini v0.24.0): 28 de dezembro de 2023 [Notas de versão]
- v0.23.0 (com Anserini v0.23.0): 17 de novembro de 2023 [Notas de versão]
- v0.22.1 (com Anserini v0.22.1): 19 de outubro de 2023 [Notas de versão]
- v0.22.0 (com Anserini v0.22.0): 31 de agosto de 2023 [Notas de versão]
- v0.21.0 (com Anserini v0.21.0): 6 de abril de 2023 [Notas de versão]
- v0.20.0 (com Anserini v0.20.0): 1º de fevereiro de 2023 [Notas de versão]
- v0.19.2 (com Anserini v0.16.2): 16 de dezembro de 2022 [Notas de versão]
- v0.19.1 (com Anserini v0.16.1): 12 de novembro de 2022 [Notas de versão]
- v0.19.0 (com Anserini v0.16.1): 2 de novembro de 2022 [Notas de versão] [Problemas conhecidos]
- v0.18.0 (com Anserini v0.15.0): 26 de setembro de 2022 [Notas de versão] (Primeira versão baseada em Lucene 9)
- v0.17.1 (com Anserini v0.14.4): 13 de agosto de 2022 [Notas de versão] (versão final baseada em Lucene 8)
- v0.17.0 (com Anserini v0.14.3): 28 de maio de 2022 [Notas de versão]
- v0.16.1 (com Anserini v0.14.3): 12 de maio de 2022 [Notas de versão]
- v0.16.0 (com Anserini v0.14.1): 1º de março de 2022 [Notas de versão]
- v0.15.0 (com Anserini v0.14.0): 21 de janeiro de 2022 [Notas de versão]
- v0.14.0 (com Anserini v0.13.5): 8 de novembro de 2021 [Notas de versão]
- v0.13.0 (com Anserini v0.13.1): 3 de julho de 2021 [Notas de versão]
- v0.12.0 (com Anserini v0.12.0): 5 de maio de 2021 [Notas de versão]
- v0.11.0.0: 18 de fevereiro de 2021 [Notas de versão]
- v0.10.1.0: 8 de janeiro de 2021 [Notas de versão]
- v0.10.0.1: 2 de dezembro de 2020 [Notas de versão]
- v0.10.0.0: 26 de novembro de 2020 [Notas de versão]
- v0.9.4.0: 26 de junho de 2020 [Notas de versão]
- v0.9.3.1: 11 de junho de 2020 [Notas de versão]
- v0.9.3.0: 27 de maio de 2020 [Notas de versão]
- v0.9.2.0: 15 de maio de 2020 [Notas de versão]
- v0.9.1.0: 6 de maio de 2020 [Notas de versão]
- v0.9.0.0: 18 de abril de 2020 [Notas de versão]
- v0.8.1.0: 22 de março de 2020 [Notas de versão]
- v0.8.0.0: 12 de março de 2020 [Notas de versão]
- v0.7.2.0: 25 de janeiro de 2020 [Notas de versão]
- v0.7.1.0: 9 de janeiro de 2020 [Notas de versão]
- v0.7.0.0: 13 de dezembro de 2019 [Notas de versão]
- v0.6.0.0: 2 de novembro de 2019
️ Notas Históricas
⁉️ Transição Lucene 8 para Lucene 9. Em 2022, Pyserini passou por uma transição do Lucene 8 para o Lucene 9. A maioria dos índices pré-construídos foram reconstruídos usando o Lucene 9, mas alguns ainda são baseados no Lucene 8.
Mais detalhes:
- PyPI v0.17.1 (commit
33c87c
, lançado em 13/08/2022) é a última versão do Pyserini construída no Lucene 8, baseada no Anserini v0.14.4. Posteriormente, o tronco Anserini foi atualizado para Lucene 9. - PyPI v0.18.0 (commit
5fab14
, lançado em 2022/09/26) é construído no Anserini v0.15.0, usando Lucene 9. Posteriormente, o tronco Pyserini avançou para Lucene 9.
Explicações:
Qual é o impacto? Os índices construídos com Lucene 8 não são totalmente compatíveis com o código Lucene 9 (ver Anserini #1952). A solução alternativa é desabilitar o desempate consistente, que acontece automaticamente se um índice Lucene 8 for detectado pelo Pyserini. No entanto, o código Lucene 9 executado em índices Lucene 8 fornecerá resultados ligeiramente diferentes do código Lucene 8 executado em índices Lucene 8. Observe que o código Lucene 8 não é capaz de ler índices criados com Lucene 9.
Por que isso é necessário? Embora perturbadora, é necessária uma atualização para o Lucene 9 para aproveitar as vantagens dos índices HNSW do Lucene, o que aumentará as capacidades do Pyserini e abrirá o espaço de design para híbridos densos/esparsos.
Com v0.11.0.0 e anteriores, as versões do Pyserini adotaram a convenção de XYZW , onde XYZ rastreia a versão do Anserini e W é usado para distinguir diferentes versões no final do Python. A partir do Anserini v0.12.0, as versões Anserini e Pyserini foram dissociadas.
O Anserini foi projetado para funcionar com o JDK 11. Houve uma alteração no caminho do JRE acima do JDK 9 que quebra o pyjnius 1.2.0, conforme documentado nesta edição, também relatado no Anserini aqui e aqui. Este problema foi corrigido com pyjnius 1.2.1 (lançado em dezembro de 2019). O erro anterior foi documentado neste notebook e este notebook documenta a correção.
Referências
Se você usa Pyserini, cite o seguinte artigo:
@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",
}
Agradecimentos
Esta pesquisa é apoiada principalmente em parte pelo Conselho de Pesquisa em Ciências Naturais e Engenharia (NSERC) do Canadá.