| # FEVER Benchmark — Controlled Retrieval Evaluation |
|
|
| A frozen, reproducible benchmark for testing retrieval methods on the BEIR FEVER dataset. |
|
|
| ## Quick Start |
|
|
| ```python |
| from fever_benchmark import FEVERBenchmark |
| |
| bench = FEVERBenchmark() |
| |
| # Load the BM25 top-100 pool |
| pool = bench.load_pool("beir_pool.json") |
| |
| # Re-rank with your method |
| my_rankings = {} |
| for qid, docs in pool.items(): |
| # docs is [(docid, bm25_score), ...] |
| # Replace with your scores: |
| my_rankings[qid] = [(docid, your_score(docid, qid)) |
| for docid, _ in docs] |
| # Sort descending by score |
| my_rankings[qid].sort(key=lambda x: -x[1]) |
| |
| # Evaluate |
| results = bench.evaluate(my_rankings) |
| print(f"NDCG@10: {results['ndcg@10']:.4f}") |
| |
| # Compare against baselines |
| bench.verify_reproduction({"Your Method": results["ndcg@10"]}) |
| ``` |
|
|
| ## What's Included |
|
|
| | File | Description | |
| |---|---| |
| | `beir_pool.json` | BM25 top-100 pool (k1=1.2, b=0.75) — 6,666 queries | |
| | `fever_benchmark.py` | Benchmark evaluation class | |
| | `setup_fever_benchmark.py` | Regenerate pool from scratch | |
| | `query_deltas.csv` | Per-query NDCG@10 for all Hadith variants | |
| | `benchmark_manifest.md` | Frozen configuration and checksums | |
|
|
| ## Baseline Scores |
|
|
| | System | NDCG@10 | |
| |---|---| |
| | BM25 (k1=1.2, b=0.75) | 0.5214 | |
| | MiniLM Dense | 0.6497 | |
| | Dense + Muttafaq (best Hadith) | 0.6461 | |
|
|
| To verify reproduction: run your rankings through `bench.evaluate()` and check against these numbers. |
|
|
| ## Setup from Scratch |
|
|
| ```bash |
| python setup_fever_benchmark.py |
| ``` |
|
|
| This downloads BEIR FEVER (~3.3 GB), builds the Pyserini index (~6 min), and runs BM25 retrieval (~7 min). |
|
|
| ## Requirements |
|
|
| - Python 3.8+ |
| - `pyserini>=0.14.0` |
| - Java 11+ (for Pyserini/Lucene) |
|
|
| ## License |
|
|
| Same as BEIR FEVER — research use. |
|
|