FastSLR v3.0.1
Triagem determinística universal para Revisões Sistemáticas de Literatura
FastSLR processa artigos acadêmicos através de um pipeline de filtragem multi-estágio, permitindo seleção rápida, reproduzível e auditável para sua RSL. Sem machine learning — resultados 100% determinísticos.
📖 Novo por aqui? Comece pelo Guia do Usuário completo — manual passo-a-passo com instalação, configuração, todas as opções, exemplos por área e troubleshooting.
Índice
- Instalação
- Início Rápido
- Conceitos Fundamentais
- Configuração
- Criando o Arquivo de Termos
- Comandos CLI
- Interface TUI
- Fluxo de Trabalho Recomendado
- Interpretando Resultados
- Exportação Acadêmica
- Perfis de Configuração
- Internacionalização
- Uso Programático
- FAQ
Instalação
Requisitos
- Python >= 3.10
Via pip (recomendado)
pip install fastslr
Confirme a instalação:
fastslr version
Versão de desenvolvimento (GitHub)
Para a versão mais recente do repositório, ou uma tag específica:
pip install git+https://github.com/Lharden/fastslr.git
pip install git+https://github.com/Lharden/fastslr.git@v3.0.1
Desenvolvimento local
git clone https://github.com/Lharden/fastslr.git
cd fastslr
pip install -e ".[dev]"
Ambiente travado (reprodutibilidade)
O uv.lock na raiz fixa a versão exata de cada dependência. Para reproduzir uma triagem com o mesmo ambiente, use-o a partir de um clone na tag da versão:
uv sync --frozen
Sem uv, gere um requirements travado e instale com pip:
uv export --frozen --no-dev --no-emit-project -o requirements.lock.txt
Dependência opcional (detecção de encoding)
Opcional — o FastSLR já tenta automaticamente uma cadeia de codificações (utf-8 / cp1252 / latin-1). Para ativar a detecção via chardet:
pip install "fastslr[chardet]"
Início Rápido
1. Crie um novo projeto
fastslr new-project meu-projeto --blocks "CTX,TECH,SCM" --preset standard
Isso cria uma pasta meu-projeto/ com:
config.json— configuração pronta para usoterms.xlsx— template principal de termos para você preencherterms.csv— cópia alternativa para scripts/versionamento
2. Edite o arquivo de termos
Abra terms.xlsx e adicione seus termos de busca (veja a seção Criando o Arquivo de Termos).
3. Verifique o setup
fastslr doctor --input artigos.csv --config meu-projeto/config.json --terms meu-projeto/terms.xlsx
O comando mostra se os arquivos existem, quais colunas foram detectadas e qual comando de run usar.
4. Execute a triagem
fastslr run artigos.csv --config meu-projeto/config.json --terms meu-projeto/terms.xlsx
5. Confira os resultados
Os resultados estão na pasta output/:
triage_results.xlsx— resultados completos com scores e decisõestriage_report.txt— relatório com estatísticasacademic_package.zip— pacote pronto para publicação
Conceitos Fundamentais
O que são Blocos de Domínio?
Blocos são dimensões temáticas da sua revisão. Cada bloco avalia os artigos sob uma perspectiva diferente. Por exemplo, em uma RSL sobre "Machine Learning em Supply Chain":
| Bloco | Sigla | O que avalia |
|---|---|---|
| Contexto | CTX | O artigo é sobre supply chain? |
| Tecnologia | TECH | O artigo usa machine learning? |
| Escopo | SCM | O artigo aborda gestão de cadeia de suprimentos? |
Um artigo precisa ser aprovado nos blocos relevantes para ser incluído na RSL.
Níveis de Importância
Cada termo positivo recebe um nível de 1 (mais importante) a 5 (menos importante):
| Nível | Significado | Pontuação Padrão |
|---|---|---|
| 1 | Essencial / exato | 10 pontos |
| 2 | Muito relevante | 8 pontos |
| 3 | Relevante | 6 pontos |
| 4 | Parcialmente relevante | 4 pontos |
| 5 | Tangencial | 2 pontos |
Decisões Possíveis
| Decisão | Significado | Ação Recomendada |
|---|---|---|
APPROVED_FINAL |
Artigo relevante para a RSL | Incluir na revisão |
FLAGGED_FINAL |
Artigo possivelmente relevante | Revisão manual necessária |
REJECTED_FINAL |
Artigo não relevante | Excluir da revisão |
Pré-triagem T0
O estágio T0 é um filtro global antes dos blocos de domínio. Serve para excluir rapidamente artigos obviamente fora do escopo (ex: "book review", "editorial").
Configuração
Estrutura do config.json
O arquivo de configuração controla todo o comportamento do sistema:
{
"global": {
"DECISION_POLICY": "special",
"PONTUACAO_NIVEIS": {"1": 10, "2": 8, "3": 6, "4": 4, "5": 2},
"LIMITES_APROVADO": {"1": 10, "2": 12, "3": 18, "4": 22, "5": null},
"LIMITES_SINALIZADO": {"1": 6, "2": 6, "3": 6, "4": 7, "5": 12},
"WEIGHTS": {"title": 2.0, "abstract": 1.0, "manual_tags": 1.5},
"NO_TAGS_UPLIFT": 1.17,
"MAX_SECTION_SCORE": 30,
"FAIL_FAST_GLOBAL": true,
"ENABLE_PROXIMITY_DETECTION": true,
"NOISE_PROFILE": "relaxed",
"ERROR_POLICY": "flag"
},
"fields": {
"id": "key",
"title": "title",
"abstract": "abstract",
"manual_tags": "manual_tags"
},
"output": {
"csv": false,
"xlsx": true,
"academic_package": true
}
}
Parâmetros Globais
| Parâmetro | Padrão | Descrição |
|---|---|---|
DECISION_POLICY |
"special" |
Política de decisão final: "special", "strict" ou "k_of_n" |
PONTUACAO_NIVEIS |
{1:10, 2:8, ...} |
Pontuação atribuída a cada nível de importância |
LIMITES_APROVADO |
{1:10, 2:12, ...} |
Score mínimo para aprovação, por nível |
LIMITES_SINALIZADO |
{1:6, 2:6, ...} |
Score mínimo para sinalização, por nível |
WEIGHTS |
{title:2, abstract:1, tags:1.5} |
Peso de cada seção do artigo no cálculo de score |
NO_TAGS_UPLIFT |
1.17 |
Multiplicador aplicado quando manual_tags está vazio |
MAX_SECTION_SCORE |
30 |
Pontuação máxima por seção (cap) |
FAIL_FAST_GLOBAL |
true |
Se um bloco rejeitar, pula os blocos seguintes |
ENABLE_PROXIMITY_DETECTION |
true |
Detecta termos compostos automaticamente |
NOISE_PROFILE |
"relaxed" |
Perfil de filtragem: "relaxed" ou "strict" |
ERROR_POLICY |
"flag" |
Tratamento de erros: "flag" (sinaliza) ou "fail" (para) |
Políticas de Decisão
"special" (recomendada): Se qualquer bloco rejeitar, o artigo é rejeitado. Possui regra especial: se apenas 1 bloco estiver sinalizado e os demais aprovados com score alto, o artigo pode ser aprovado.
"strict": Todos os blocos devem aprovar para o artigo ser aprovado.
"k_of_n": Pelo menos K blocos devem aprovar. Configure MIN_APPROVED_BLOCKS no config.
Mapeamento de Campos
A seção fields mapeia os nomes das colunas do seu CSV de entrada:
{
"fields": {
"id": "Key",
"title": "Title",
"abstract": "Abstract Note",
"manual_tags": "Manual Tags"
}
}
O sistema também faz auto-detecção de colunas comuns (Zotero, Scopus, Web of Science).
Criando o Arquivo de Termos
O arquivo terms.xlsx define todos os termos de busca organizados por bloco. O mesmo formato também é aceito em CSV com separador ;.
Formato
block;kind;term;level;section_scope;is_regex;normalization_type;normalization_target
Colunas
| Coluna | Obrigatório | Valores | Descrição |
|---|---|---|---|
block |
Sim | Nome do bloco (ex: CTX, TECH) ou GLOBAL |
Bloco ao qual o termo pertence |
kind |
Sim | pos, anti, flag |
Tipo: positivo, anti-exclusão, anti-sinalização |
term |
Sim | Texto livre | O termo de busca |
level |
Para pos |
1 a 5 |
Nível de importância (1 = mais importante) |
section_scope |
Não | any, title, abstract, manual_tags |
Onde buscar (padrão: any) |
is_regex |
Não | 0 ou 1 |
Se o termo é uma expressão regular |
normalization_type |
Não | abbreviation, compound_variant, symbol_replacement |
Tipo de regra de normalização |
normalization_target |
Não | Texto | Forma normalizada do termo |
Tipos de Termos
Positivos (pos): Termos que indicam relevância. Contribuem para o score.
TECH;pos;machine learning;1;any;0;;
TECH;pos;deep learning;1;any;0;;
TECH;pos;optim*;3;any;0;;
Anti-exclusão (anti): Se encontrados, o artigo é imediatamente rejeitado no bloco.
TECH;anti;systematic review;;any;0;;
TECH;anti;meta-analysis;;any;0;;
Anti-sinalização (flag): Se encontrados, o artigo é rebaixado de APPROVED para FLAGGED.
CTX;flag;conference abstract;;any;0;;
Termos globais (GLOBAL): Aplicados no estágio T0, antes de qualquer bloco.
GLOBAL;anti;book review;;any;0;;
GLOBAL;flag;editorial;;any;0;;
Recursos Avançados
Wildcards: Use * para corresponder a qualquer sequência de caracteres.
TECH;pos;optim*;3;any;0;; # Corresponde a: optimize, optimization, optimal...
Regex: Ative is_regex=1 para expressões regulares completas.
TECH;pos;ML|AI|DL;2;title;1;; # Corresponde a: ML, AI ou DL no titulo
Termos compostos: Termos com "and", "&", "or" ou "/" são automaticamente expandidos para busca por proximidade.
CTX;pos;oil and gas;1;any;0;; # Busca "oil...gas" ou "gas...oil" com ate 2 palavras entre eles
Normalização: Defina regras para expandir abreviaturas e unificar variantes.
TECH;pos;AI;1;any;0;abbreviation;artificial intelligence
CTX;pos;supply-chain;2;any;0;compound_variant;supply chain
Comandos CLI
fastslr run — Executar triagem
fastslr run artigos.csv -c config.json -t terms.xlsx [-o output/] [-l pt_BR] [-q]
| Flag | Descrição |
|---|---|
-c, --config |
Caminho para o config.json (obrigatório) |
-t, --terms |
Caminho para o terms.xlsx ou terms.csv |
-o, --output |
Diretório de saída (padrão: output/ junto ao input) |
-l, --lang |
Idioma da interface: en, pt_BR, es |
-q, --quiet |
Suprime saída no terminal |
fastslr doctor — Verificar setup antes da run
fastslr doctor --input artigos.csv -c config.json -t terms.xlsx
Mostra mapeamento de colunas detectado, blocos carregados, quantidade de termos válidos, avisos de configuração e o comando exato para executar a triagem.
fastslr preview — Pré-visualizar resultados
Executa a triagem em uma amostra de artigos para validação rápida.
fastslr preview artigos.csv -c config.json -t terms.xlsx [-s 50]
| Flag | Descrição |
|---|---|
-s, --sample |
Número de artigos na amostra (padrão: 50) |
fastslr coverage — Análise de cobertura
Identifica termos mortos (0 matches), termos amplos demais (>80% dos artigos) e blocos sem discriminação.
fastslr coverage artigos.csv -c config.json -t terms.xlsx [-o cobertura.csv]
fastslr diff — Comparar duas execuções
fastslr diff resultado_v1.xlsx resultado_v2.xlsx
Mostra artigos cuja decisão mudou entre as duas versões, com resumo de transições.
fastslr new-project — Criar novo projeto
fastslr new-project meu-projeto -b "CTX,TECH,SCM" [-p standard]
| Flag | Descrição |
|---|---|
-b, --blocks |
Nomes dos blocos separados por vírgula (obrigatório) |
-p, --preset |
Preset de níveis: binary, simple, standard (padrão) |
-o, --output |
Diretório de saída |
fastslr export — Exportar pacote acadêmico
fastslr export resultado.xlsx [-o output/] [-c config.json]
Gera um ZIP com todos os artefatos de auditoria para publicação.
fastslr terms — Navegar termos configurados
fastslr terms -c config.json -t terms.xlsx [-b TECH] [-k pos]
| Flag | Descrição |
|---|---|
-b, --block |
Filtrar por bloco |
-k, --kind |
Filtrar por tipo: pos, anti, flag |
fastslr profile — Gerenciar perfis
# Salvar configuração como perfil
fastslr profile save meu-perfil -c config.json -d "Descricao do perfil"
# Carregar perfil para config.json
fastslr profile load meu-perfil [-o config.json]
# Listar perfis salvos
fastslr profile list
Perfis são salvos em ~/.fastslr/profiles/.
fastslr tui — Interface interativa
fastslr tui
Abre a interface gráfica no terminal (veja a próxima seção).
fastslr version — Versão
fastslr version
Interface TUI
A TUI (Terminal User Interface) oferece uma interface gráfica completa no terminal. Inicie com:
fastslr tui
Telas Disponíveis
| # | Tela | Função |
|---|---|---|
| 1 | New Project | Criar novo projeto com presets |
| 2 | Load Profile | Carregar configuração salva |
| 3 | Edit Configuration | Ajustar thresholds e parâmetros |
| 4 | Browse Terms | Visualizar e filtrar termos por bloco |
| 5 | Run Triage | Executar triagem com barra de progresso |
| 6 | Results Explorer | Navegar resultados da triagem |
| 7 | Coverage Analysis | Analisar cobertura de termos |
| 8 | Compare Runs | Comparar duas execuções |
| 9 | Export Package | Gerar pacote acadêmico |
| 10 | Settings & Language | Configurar idioma |
Fluxo de Trabalho Recomendado
Etapa 1: Preparação
- Exporte seus artigos do gerenciador bibliográfico (Zotero, Scopus ou Web of Science) em CSV
- Crie o projeto:
fastslr new-project minha-rsl -b "CTX,TECH,APP" - Defina seus termos no
terms.xlsx
Etapa 2: Calibração
- Verifique o setup:
fastslr doctor --input artigos.csv -c config.json -t terms.xlsx - Execute um preview:
fastslr preview artigos.csv -c config.json -t terms.xlsx -s 100 - Analise a distribuição de decisões
- Ajuste thresholds e termos conforme necessário
- Execute análise de cobertura:
fastslr coverage artigos.csv -c config.json -t terms.xlsx - Remova termos mortos, refine termos amplos demais
Etapa 3: Execução
- Execute a triagem completa:
fastslr run artigos.csv -c config.json -t terms.xlsx - Revise manualmente os artigos
FLAGGED_FINAL - Documente decisões manuais
Etapa 4: Documentação
- Exporte o pacote acadêmico, se precisar regenerar o ZIP:
fastslr export resultado.xlsx - Inclua o
protocol.jsoncomo material suplementar na publicação - Use o
config_hashpara garantir reprodutibilidade
Etapa 5: Iteração (se necessário)
- Ajuste termos e thresholds
- Re-execute:
fastslr run artigos.csv -c config.json -t terms.xlsx - Compare com a execução anterior:
fastslr diff resultado_v1.xlsx resultado_v2.xlsx
Interpretando Resultados
Colunas do Excel de Saída
| Coluna | Descrição |
|---|---|
ID |
Identificador do artigo |
Title_Highlighted |
Título com termos encontrados marcados como ***TERMO*** |
Abstract_Highlighted |
Resumo com termos marcados |
Tags_Highlighted |
Tags com termos marcados |
RawScore_<BLOCO> |
Pontuação bruta do bloco |
FinalScore_<BLOCO> |
Pontuação final (após uplift) |
BestLevel_<BLOCO> |
Melhor nível de importância encontrado |
Status_<BLOCO> |
Decisão do bloco: APPROVED, FLAGGED, REJECTED |
Highlights_<BLOCO> |
Detalhes dos matches positivos |
AntiHighlights_<BLOCO> |
Detalhes dos anti-termos de exclusão |
Flags_<BLOCO> |
Detalhes dos anti-termos de sinalização |
Final_Decision |
Decisão final: APPROVED_FINAL, FLAGGED_FINAL, REJECTED_FINAL |
Decision_Reason |
Explicação da decisão |
Status_T0 |
Status do pré-filtro global (se configurado) |
Como Ler os Scores
- Score alto + APPROVED: artigo claramente relevante
- Score moderado + FLAGGED: artigo na fronteira, requer revisão manual
- Score baixo + REJECTED: artigo fora do escopo
- REJECTED por anti-termo: artigo excluído por termo de exclusão, independente do score
Dicas de Interpretação
- Muitos FLAGGED? Considere relaxar os thresholds de aprovação
- Muitos REJECTED? Revise se seus termos cobrem sinônimos e variantes
- Poucos REJECTED? Seus termos podem ser amplos demais; use
coveragepara verificar - Scores inesperados? Verifique o
Highlightspara entender quais termos foram encontrados
Exportação Acadêmica
O pacote acadêmico (academic_package.zip) contém tudo necessário para reprodutibilidade:
| Arquivo | Propósito |
|---|---|
triage_results.xlsx |
Resultados completos |
protocol.json |
Protocolo com hashes de entrada, configuração e execução |
triage_report.txt |
Relatório estatístico |
academic_report.md |
Relatório formatado para publicação |
config_audit.json |
Configuração completa utilizada |
APPENDIX_INDEX.md |
Índice dos artefatos |
appendix_manifest.json |
Manifesto de conformidade |
Reprodutibilidade
Qualquer pessoa com os mesmos arquivos de entrada (artigos.csv, config.json, terms.xlsx ou terms.csv) e a mesma versão do FastSLR produzirá exatamente os mesmos resultados. O protocol.json contém hashes SHA-256 para verificação.
Perfis de Configuração
Salve configurações frequentes como perfis reutilizáveis:
# Salvar
fastslr profile save revisao-2024 -c config.json -d "Config final da RSL 2024"
# Listar
fastslr profile list
# Carregar
fastslr profile load revisao-2024 -o config.json
Perfis são armazenados em ~/.fastslr/profiles/ como arquivos JSON.
Internacionalização
FastSLR suporta três idiomas para a interface:
| Código | Idioma |
|---|---|
en |
English |
pt_BR |
Português (Brasil) |
es |
Español |
Configurar idioma
Via flag CLI:
fastslr run artigos.csv -c config.json -l pt_BR
Via variável de ambiente:
export FASTSLR_LANG=pt_BR
fastslr run artigos.csv -c config.json
Detecção automática: Se nenhum idioma for especificado, o sistema detecta o locale do sistema operacional.
Uso Programático
FastSLR pode ser usado como biblioteca Python:
from fastslr.core import process_articles, collect_statistics
from fastslr.core.config import load_config, parse_terms_csv, load_global_params
from fastslr.core.io import load_table_safe
from fastslr.core.patterns import precompile_patterns
from fastslr.core.normalization import NormalizationEngine
# Carregar dados
config = load_config("config.json")
config = parse_terms_csv("terms.xlsx", config)
df = load_table_safe("artigos.csv")
# Preparar normalizacao e padroes
norm_rules = config.get("normalization_rules", {})
norm_engine = NormalizationEngine(norm_rules)
global_params = load_global_params(config.get("global", {}))
for block in config.get("_domain_blocks", []):
config[block] = precompile_patterns(config[block], norm_engine, global_params)
config[block]["normalization_engine"] = norm_engine
# Executar triagem
result_df, stats = process_articles(df, config)
# Resultados
print(f"Total: {stats['total_articles']}")
print(f"Tempo: {stats['processing_time']:.2f}s")
print(f"Distribuicao: {stats['decision_distribution']}")
Via Controller (caminho simplificado)
from pathlib import Path
from fastslr.app.controller import run_triage
result = run_triage(
input_path=Path("artigos.csv"),
config_path=Path("config.json"),
terms_path=Path("terms.xlsx"),
)
print(f"Aprovados: {(result.result_df['Final_Decision'] == 'APPROVED_FINAL').sum()}")
print(f"Sinalizados: {(result.result_df['Final_Decision'] == 'FLAGGED_FINAL').sum()}")
print(f"Rejeitados: {(result.result_df['Final_Decision'] == 'REJECTED_FINAL').sum()}")
FAQ
Quais formatos de entrada são suportados?
CSV (qualquer encoding, separadores ;, , ou \t) e XLSX. O sistema detecta automaticamente o formato de exportação do Zotero, Scopus e Web of Science.
O que acontece se meu CSV não tem a coluna manual_tags?
O sistema funciona normalmente. Artigos sem tags recebem um uplift de 17% no score (configurável via NO_TAGS_UPLIFT) para compensar a falta de dados.
Posso usar expressões regulares nos termos?
Sim. Defina is_regex=1 no CSV de termos. Exemplo: ML|AI|DL corresponde a qualquer uma das siglas.
O que é o FAIL_FAST_GLOBAL?
Quando ativado, se um bloco rejeitar o artigo, os blocos seguintes não são avaliados. Isso melhora a performance sem alterar os resultados finais (um bloco rejeitado já garante REJECTED_FINAL na política "special").
Como funciona a "regra especial" de aprovação?
Na política "special", se exatamente 1 bloco estiver FLAGGED (por score, não por anti-termo) e todos os demais estiverem APPROVED com score >= SPECIAL_APPROVAL_THRESHOLD (padrão: 40), o artigo é aprovado. Isso evita falsos negativos quando um único bloco está na fronteira.
Qual preset devo usar?
standard(5 níveis): Recomendado para a maioria das RSL. Permite granularidade fina na classificação de termos.simple(3 níveis): Para projetos menores ou com poucos termos.binary(1 nível): Para triagem rápida onde só importa "relevante ou não".
Como garanto a reprodutibilidade?
- Use o mesmo
config.jsoneterms.xlsxouterms.csv - Use a mesma versão do FastSLR (
fastslr version) - Inclua o
protocol.jsoncomo material suplementar - Os hashes SHA-256 no protocolo permitem verificar que os arquivos de entrada não foram alterados
Licença
MIT
Metadata
Release files for fastslr 3.0.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 | |
|---|---|---|---|
| fastslr-3.0.1.tar.gz | 124.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fastslr-3.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 205.7 kB
Release files / fastslr-3.0.1.tar.gz
| Download URL | fastslr-3.0.1.tar.gz |
|---|---|
| Size | 124.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ebfd0bba7a12b1fd1fd41e381be16763abf8dfee6a6b19f91e0cbd0642cdedd8
|
|
BLAKE2b-256 checksum How to use checksums |
2354db46f8f8b1de483f08f10b597fa04be3015b73bcaf46dda3c8ea040de890
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 10, 2026.
Transparency logRelease files / fastslr-3.0.1-py3-none-any.whl
| Download URL | fastslr-3.0.1-py3-none-any.whl |
|---|---|
| Size | 81.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d4ead37e942e16f34ce1f9e54e9de005c57f3b79070fcc1158ea5cbf88f5e76e
|
|
BLAKE2b-256 checksum How to use checksums |
a94b701a021123eba60ceae24191af5252fc5e3bf650e89392d9727421f2c1e7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 10, 2026.
Transparency log