22 million LLM-generated structured summaries of scientific papers, enriched with OpenAlex scholarly metadata. Each paper has an 18-field structured summary covering methodology, key results, claims, limitations, and more. This public dataset includes full paper text for ~5.3 million papers where open-access status has been confirmed -- either through OpenAlex metadata or because the paper originates from a permissively licensed source such as the arXiv preprint server, bioRxiv, medRxiv, or ChemRxiv.
Note: The 22M count refers to paper summaries -- every paper has a complete structured summary regardless of whether the full text is included. Full text is shared only for papers with confirmed open-access status. A private version with full text for all 22M papers is available for research collaborators.
| Subset | Summaries | Full Texts Included | Size | Sources |
|---|---|---|---|---|
| arxiv | 3,322,974 | ~3,322,974 (100%) | ~140 GB | arXiv preprints (all categories) |
| bethgelab | 334,706 | 334,706 (100%) | 14 GB | bioRxiv, medRxiv, ChemRxiv, PsyArXiv, EdRxiv, NeurIPS, MetaArXiv |
| pubmed | 1,732,185 | ~270,000 (15.6%) | 18 GB | PubMed Central biomedical papers |
| web-papers | 16,698,047 | ~1,390,000 (8.3%) | 160 GB | S2ORC general scientific papers |
| Total | 22,087,912 | ~5,318,000 | ~332 GB |
Full text (text_sanitized, text_raw) is included in this public dataset when either of the following is true:
oa_is_oa field confirms open-access status.Papers without full text still have complete 18-field structured summaries and all available OpenAlex metadata (DOI, citation count, author affiliations, referenced works, etc.).
Users should treat structured summaries as derived, approximate representations rather than authoritative records of the original papers, particularly in high-stakes domains such as clinical medicine or policy analysis. The is_retracted flag from OpenAlex should be used to filter discredited findings. The ethical_considerations field in each summary surfaces author-reported and model-identified concerns at the paper level.
claims field (JSON array of claims with supporting and contradicting evidence).ethical_considerations field in each summary may surface author-reported ethical concerns from the original papers, which could reference sensitive topics (e.g., human subjects research, clinical trials). These reflect the content of the source papers, not independently collected personal data.This dataset democratizes access to structured representations of 22 million scientific papers across all major disciplines, lowering barriers to scientific retrieval and enabling researchers to search across methodology, claims, and limitations rather than just titles and abstracts.
Positive impacts:
Risks and concerns:
ethical_considerations field and is_retracted flag provide guardrails for responsible downstream use, but users must exercise independent judgment about data quality and applicability.All 22,087,912 structured summaries in this dataset are LLM-generated (synthetic), produced using Gemini 2.0 Flash Lite in a single-pass extraction from paper full texts. The dataset represents approximately 60 billion tokens of synthetic structured data when tokenized.
summary_model, summary_tokens_in, summary_tokens_out) is retained for every paper to support reproducibility and quality auditing.This dataset includes a comprehensive search infrastructure with 42 pre-built indices for both semantic (FAISS) and keyword (BM25) search across all papers, text chunks, and claims.
See SEARCH_USAGE.md for complete documentation, code examples, and deployment guides.
| Type | What you can search | Documents | Indices |
|---|---|---|---|
| Semantic (FAISS) | 19 summary fields per paper | 21.8M vectors each | 19 |
| Semantic (FAISS) | 500-word text chunks | 60.3M vectors | 1 |
| Semantic (FAISS) | Individual scientific claims | 92.1M vectors | 1 |
| Keyword (BM25) | 19 summary fields per paper | 21.4M docs each | 19 |
| Keyword (BM25) | 500-word text chunks | 60.3M docs | 1 (13 shards) |
| Keyword (BM25) | Individual scientific claims | 92.1M docs | 1 (19 shards) |
pip install faiss-cpu numpy pandas pyarrow huggingface_hub sentence-transformers
import faiss, numpy as np, pandas as pd
from sentence_transformers import SentenceTransformer
from huggingface_hub import snapshot_download
# Download
snapshot_download("laion/Scientific-Summaries", repo_type="dataset",
local_dir="scientific-summaries",
allow_patterns=[
"search/faiss/summaries/concatenated_summary.faiss",
"search/faiss/summaries/concatenated_summary.faiss.ivfdata",
"search/mappings/paper_id_order.parquet",
])
# Search
model = SentenceTransformer("Alibaba-NLP/gte-modernbert-base")
query_vec = model.encode(["CRISPR gene editing efficiency"],
normalize_embeddings=True).astype(np.float32)
index = faiss.read_index("scientific-summaries/search/faiss/summaries/concatenated_summary.faiss")
index.nprobe = 32
scores, indices = index.search(query_vec, 10)
# Results
paper_order = pd.read_parquet("scientific-summaries/search/mappings/paper_id_order.parquet")
for idx, score in zip(indices[0], scores[0]):
if idx >= 0:
row = paper_order.iloc[idx]
print(f"[{score:.4f}] {row['subset']}: {row['paper_id'][:80]}")
pip install bm25s PyStemmer pandas pyarrow huggingface_hub
import bm25s, Stemmer, pandas as pd
from huggingface_hub import snapshot_download
# Download
snapshot_download("laion/Scientific-Summaries", repo_type="dataset",
local_dir="scientific-summaries",
allow_patterns=[
"search/bm25/summaries/executive_summary/*",
"search/mappings/paper_id_order.parquet",
])
# Search
stemmer = Stemmer.Stemmer("english")
query_tokens = bm25s.tokenize(["CRISPR gene editing efficiency"], stemmer=stemmer)
retriever = bm25s.BM25.load("scientific-summaries/search/bm25/summaries/executive_summary")
results, scores = retriever.retrieve(query_tokens, k=10)
# Results
paper_order = pd.read_parquet("scientific-summaries/search/mappings/paper_id_order.parquet")
for doc_idx, score in zip(results[0], scores[0]):
row = paper_order.iloc[doc_idx]
print(f"[{score:.2f}] {row['subset']}: {row['paper_id'][:80]}")
Self-contained BM25 search indices built with zvec — no external BM25 library needed. Separate text sidecars enable fast search with optional text retrieval. Total: ~144 GB (vs 313 GB for bm25s indices).
| Index | Documents | Size | Contents |
|---|---|---|---|
search/zvec/summaries_bm25 | 22.1M papers | 35 GB | BM25 sparse vectors + paper metadata |
search/zvec/summaries_text | 22.1M papers | 72 GB | Concatenated summaries (18 fields, zstd parquet) |
search/zvec/claims_bm25 | 92.1M claims | 33 GB | BM25 sparse vectors + paper_id + claim_position |
search/zvec/claims_text | 92.1M claims | 4 GB | Claim text sidecar (1,842 parquet files) |
| Vectorizer files | — | 36 MB | IDF tables for query construction |
Architecture: Search returns IDs → retrieve text from sidecars. Claims can reference both claims_text (for claim text) and summaries_text (for full paper context).
See search/zvec/USAGE.html for complete usage instructions.
Quick-start (summaries search):
pip install zvec PyStemmer pyarrow huggingface_hub
import hashlib, json, re, struct
from collections import Counter
import Stemmer, zvec
import pyarrow.parquet as pq
from huggingface_hub import snapshot_download
from pathlib import Path
# Download index + vectorizer + text sidecar (~107 GB total, or 35 GB without text)
snapshot_download("laion/Scientific-Summaries", repo_type="dataset",
local_dir="scientific-summaries",
allow_patterns=["search/zvec/summaries_bm25/**",
"search/zvec/summaries_text/**",
"search/zvec/summaries_bm25_vectorizer.json"])
# Tokenizer (must match index build)
_stemmer = Stemmer.Stemmer("english")
_tok_re = re.compile(r"[a-zA-Z0-9]+")
HASH_SPACE = 2**20
def tokenize(text):
return _stemmer.stemWords(_tok_re.findall(text.lower()))
def token_to_id(t):
return struct.unpack("<Q", hashlib.md5(t.encode()).digest()[:8])[0] % HASH_SPACE
# Load vectorizer and collection
with open("scientific-summaries/search/zvec/summaries_bm25_vectorizer.json") as f:
d = json.load(f)
idf = {int(k): v for k, v in d["idf"].items()}
col = zvec.open("scientific-summaries/search/zvec/summaries_bm25")
# Build text sidecar index (one-time, fast)
sidecar_path = Path("scientific-summaries/search/zvec/summaries_text")
text_index = {}
for pf in sidecar_path.glob("*.parquet"):
table = pq.read_table(pf, columns=["paper_id"])
for i, pid in enumerate(table.column("paper_id")):
text_index[str(pid.as_py())] = (str(pf), i)
# Search
query = "CRISPR gene editing efficiency"
tf = Counter(token_to_id(t) for t in tokenize(query))
qvec = {tid: idf[tid] * c for tid, c in tf.items() if tid in idf and idf[tid] > 0}
results = col.query(
vectors=zvec.VectorQuery(field_name="bm25", vector=qvec), topk=5,
output_fields=["paper_id"])
# Retrieve text from sidecar
for doc in results:
paper_id = doc.field("paper_id")
if paper_id in text_index:
pf_path, row_idx = text_index[paper_id]
table = pq.read_table(pf_path)
summary = str(table.column("concatenated_summary")[row_idx].as_py())
print(f"[{doc.score:.4f}] {summary[:200]}...")
For claims search: Download search/zvec/claims_bm25/, search/zvec/claims_text/, and search/zvec/claims_bm25_vectorizer.json. Claims can reference both claims_text (for claim text) and summaries_text (for full paper summary).
Retrieval latency for top-k=10 queries (5 test queries, single-threaded, cold start):
| Index | Search | Text Retrieval | Total | Notes |
|---|---|---|---|---|
| Summaries | 2.7s | 3.7s (summaries_text) | 6.4s | 22.1M papers |
| Claims | 1.8s | 0.1s (claims_text) + 3.8s (summaries_text) | 5.7s | 92.1M claims |
Key insights:
Benchmark script: benchmark_bm25_retrieval.py
| Index Type | Count | Total Size | RAM (mmap) |
|---|---|---|---|
| FAISS summary indices | 19 | ~23 GB | ~1.6 GB |
| FAISS chunk + claim indices | 2 | ~9 GB | ~0.2 GB |
| BM25 summary indices | 19 | ~220 GB | ~220 GB (in-memory) |
| BM25 chunk + claim indices | 2 | ~93 GB | ~93 GB (in-memory) |
| Total | 42 | ~345 GB |
Source text for displaying results: summary parquets (~346 GB), chunk parquets (~64 GB), claim parquets (~5 GB).
| Script | Description |
|---|---|
examples/search_faiss_summaries.py | Semantic search over 19 summary fields |
examples/search_faiss_chunks_claims.py | Semantic search over 60M chunks / 92M claims |
examples/search_bm25_summaries.py | Keyword search over summary fields |
examples/search_bm25_chunks_claims.py | Keyword search over chunks and claims |
examples/search_hybrid.py | Hybrid FAISS + BM25 with Reciprocal Rank Fusion |
Near-complete coverage of arXiv as of April 2026 (99.8% of all 3,011,619 papers). Includes papers from all arXiv categories: cs, math, physics, q-bio, q-fin, stat, eess, econ. All arXiv papers are permissively licensed, so full text is included for all.
Papers come from three sources that were merged and deduplicated:
Parsed papers from the bethgelab/paper_parsed_jsons dataset. All papers come from permissively licensed preprint servers, so full text is included for all.
| Source | Papers |
|---|---|
| bioRxiv | 245,004 |
| medRxiv | 57,542 |
| ChemRxiv | 26,240 |
| PsyArXiv | 4,995 |
| EdRxiv | 442 |
| NeurIPS | 379 |
| MetaArXiv | 104 |
Biomedical papers from PubMed Central, parsed from the S2ORC collection. Full text is included only for papers confirmed as open access by OpenAlex (~270K papers). All 1.7M papers have complete summaries and metadata regardless.
General scientific papers from the S2ORC (Semantic Scholar Open Research Corpus) papers-1 collection, covering all scientific disciplines. This is the largest subset. Full text is included only for open-access papers confirmed by OpenAlex (~1.4M papers). All 16.7M papers have complete summaries and metadata.
The web-papers subset was created in collaboration with Wynd Labs, who supported the large-scale web scraping and paper collection effort that made this dataset possible.
Each paper has a structured summary generated by priv-gemini-2.0-flash-lite:
| Field | Description |
|---|---|
summary_title | Paper title as identified by the LLM |
summary_authors | Author list |
field_subfield | Scientific field and subfield classification |
type_of_paper | Paper type (empirical study, review, theoretical, etc.) |
executive_summary | Comprehensive summary (400-500 words) |
research_context | Background and motivation (150-200 words) |
research_question_hypothesis | Core research question (180-230 words) |
methodological_details | Methods description (450-550 words) |
procedures_architectures | Technical procedures and architectures |
key_results | Main findings (450-550 words) |
interpretation_implications | Interpretation and theoretical implications |
contradictions_limitations | Limitations and contradictions |
claims | JSON array of claims with supporting/contradicting evidence |
data_code_availability | Data and code availability information |
robustness_ablation_notes | Robustness checks and ablation studies |
ethical_considerations | Ethical considerations |
key_figures_tables | Key figures and tables described |
three_takeaways | Three key takeaways (contribution, evidence, limitation) |
paper_id, subset, source_title, source_authors, source_year, source_venue, source_doi
openalex_id, oa_doi, oa_title, oa_type, oa_year, oa_cited_by_count, oa_language, oa_is_retracted, oa_is_open_access, oa_authorships (JSON), oa_referenced_works (JSON), match_method, has_openalex_match
| Field | Description |
|---|---|
text_sanitized | Clean plain text (included for confirmed OA papers only in this public version) |
text_raw | Raw extracted text |
text_length | Character count of full text |
summary_model, summary_tokens_in, summary_tokens_out
from datasets import load_dataset
# Load arXiv summaries (3.3M papers, all with full text)
ds = load_dataset("laion/Scientific-Summaries", "arxiv")
# Load web papers (16.7M summaries, ~8% with full text)
ds = load_dataset("laion/Scientific-Summaries", "web-papers")
# Access a summary
paper = ds['train'][0]
print(paper['executive_summary'])
# Access structured claims
import json
claims = json.loads(paper['claims'])
for claim in claims:
print(f"Claim: {claim['description']}")
# Filter for papers with full text
with_text = ds['train'].filter(lambda x: x['text_sanitized'] is not None)
# Filter by field
cs_papers = ds['train'].filter(
lambda x: x['field_subfield'] and 'Computer Science' in x['field_subfield']
)
This dataset is part of Project Alexandria, an initiative to create comprehensive, machine-readable representations of the world's scientific literature. The project aims to summarize every scientific paper ever published and enrich it with structured metadata.
Current progress: 22M+ papers summarized, covering ~99.8% of arXiv, major portions of PubMed, and millions of general scientific papers across all disciplines.
A huge thank you to our collaborators and data sources:
@misc{alexandria2025,
title={Project Alexandria: Structured Summaries of Scientific Papers at Scale},
author={REDACTED},
year={2025},
eprint={2502.19413},
archivePrefix={arXiv}
}
CC-BY-4.0
22 million LLM-generated structured summaries of scientific papers, enriched with OpenAlex scholarly metadata. Each paper has an 18-field structured summary covering methodology, key results, claims, limitations, and more. This public dataset includes full paper text for ~5.3 million papers where open-access status has been confirmed -- either through OpenAlex metadata or because the paper originates from a permissively licensed source such as the arXiv preprint server, bioRxiv, medRxiv, or ChemRxiv.
Note: The 22M count refers to paper summaries -- every paper has a complete structured summary regardless of whether the full text is included. Full text is shared only for papers with confirmed open-access status. A private version with full text for all 22M papers is available for research collaborators.
| Subset | Summaries | Full Texts Included | Size | Sources |
|---|---|---|---|---|
| arxiv | 3,322,974 | ~3,322,974 (100%) | ~140 GB | arXiv preprints (all categories) |
| bethgelab | 334,706 | 334,706 (100%) | 14 GB | bioRxiv, medRxiv, ChemRxiv, PsyArXiv, EdRxiv, NeurIPS, MetaArXiv |
| pubmed | 1,732,185 | ~270,000 (15.6%) | 18 GB | PubMed Central biomedical papers |
| web-papers | 16,698,047 | ~1,390,000 (8.3%) | 160 GB | S2ORC general scientific papers |
| Total | 22,087,912 | ~5,318,000 | ~332 GB |
Full text (text_sanitized, text_raw) is included in this public dataset when either of the following is true:
oa_is_oa field confirms open-access status.Papers without full text still have complete 18-field structured summaries and all available OpenAlex metadata (DOI, citation count, author affiliations, referenced works, etc.).
Users should treat structured summaries as derived, approximate representations rather than authoritative records of the original papers, particularly in high-stakes domains such as clinical medicine or policy analysis. The is_retracted flag from OpenAlex should be used to filter discredited findings. The ethical_considerations field in each summary surfaces author-reported and model-identified concerns at the paper level.
claims field (JSON array of claims with supporting and contradicting evidence).ethical_considerations field in each summary may surface author-reported ethical concerns from the original papers, which could reference sensitive topics (e.g., human subjects research, clinical trials). These reflect the content of the source papers, not independently collected personal data.This dataset democratizes access to structured representations of 22 million scientific papers across all major disciplines, lowering barriers to scientific retrieval and enabling researchers to search across methodology, claims, and limitations rather than just titles and abstracts.
Positive impacts:
Risks and concerns:
ethical_considerations field and is_retracted flag provide guardrails for responsible downstream use, but users must exercise independent judgment about data quality and applicability.All 22,087,912 structured summaries in this dataset are LLM-generated (synthetic), produced using Gemini 2.0 Flash Lite in a single-pass extraction from paper full texts. The dataset represents approximately 60 billion tokens of synthetic structured data when tokenized.
summary_model, summary_tokens_in, summary_tokens_out) is retained for every paper to support reproducibility and quality auditing.This dataset includes a comprehensive search infrastructure with 42 pre-built indices for both semantic (FAISS) and keyword (BM25) search across all papers, text chunks, and claims.
See SEARCH_USAGE.md for complete documentation, code examples, and deployment guides.
| Type | What you can search | Documents | Indices |
|---|---|---|---|
| Semantic (FAISS) | 19 summary fields per paper | 21.8M vectors each | 19 |
| Semantic (FAISS) | 500-word text chunks | 60.3M vectors | 1 |
| Semantic (FAISS) | Individual scientific claims | 92.1M vectors | 1 |
| Keyword (BM25) | 19 summary fields per paper | 21.4M docs each | 19 |
| Keyword (BM25) | 500-word text chunks | 60.3M docs | 1 (13 shards) |
| Keyword (BM25) | Individual scientific claims | 92.1M docs | 1 (19 shards) |
pip install faiss-cpu numpy pandas pyarrow huggingface_hub sentence-transformers
import faiss, numpy as np, pandas as pd
from sentence_transformers import SentenceTransformer
from huggingface_hub import snapshot_download
# Download
snapshot_download("laion/Scientific-Summaries", repo_type="dataset",
local_dir="scientific-summaries",
allow_patterns=[
"search/faiss/summaries/concatenated_summary.faiss",
"search/faiss/summaries/concatenated_summary.faiss.ivfdata",
"search/mappings/paper_id_order.parquet",
])
# Search
model = SentenceTransformer("Alibaba-NLP/gte-modernbert-base")
query_vec = model.encode(["CRISPR gene editing efficiency"],
normalize_embeddings=True).astype(np.float32)
index = faiss.read_index("scientific-summaries/search/faiss/summaries/concatenated_summary.faiss")
index.nprobe = 32
scores, indices = index.search(query_vec, 10)
# Results
paper_order = pd.read_parquet("scientific-summaries/search/mappings/paper_id_order.parquet")
for idx, score in zip(indices[0], scores[0]):
if idx >= 0:
row = paper_order.iloc[idx]
print(f"[{score:.4f}] {row['subset']}: {row['paper_id'][:80]}")
pip install bm25s PyStemmer pandas pyarrow huggingface_hub
import bm25s, Stemmer, pandas as pd
from huggingface_hub import snapshot_download
# Download
snapshot_download("laion/Scientific-Summaries", repo_type="dataset",
local_dir="scientific-summaries",
allow_patterns=[
"search/bm25/summaries/executive_summary/*",
"search/mappings/paper_id_order.parquet",
])
# Search
stemmer = Stemmer.Stemmer("english")
query_tokens = bm25s.tokenize(["CRISPR gene editing efficiency"], stemmer=stemmer)
retriever = bm25s.BM25.load("scientific-summaries/search/bm25/summaries/executive_summary")
results, scores = retriever.retrieve(query_tokens, k=10)
# Results
paper_order = pd.read_parquet("scientific-summaries/search/mappings/paper_id_order.parquet")
for doc_idx, score in zip(results[0], scores[0]):
row = paper_order.iloc[doc_idx]
print(f"[{score:.2f}] {row['subset']}: {row['paper_id'][:80]}")
Self-contained BM25 search indices built with zvec — no external BM25 library needed. Separate text sidecars enable fast search with optional text retrieval. Total: ~144 GB (vs 313 GB for bm25s indices).
| Index | Documents | Size | Contents |
|---|---|---|---|
search/zvec/summaries_bm25 | 22.1M papers | 35 GB | BM25 sparse vectors + paper metadata |
search/zvec/summaries_text | 22.1M papers | 72 GB | Concatenated summaries (18 fields, zstd parquet) |
search/zvec/claims_bm25 | 92.1M claims | 33 GB | BM25 sparse vectors + paper_id + claim_position |
search/zvec/claims_text | 92.1M claims | 4 GB | Claim text sidecar (1,842 parquet files) |
| Vectorizer files | — | 36 MB | IDF tables for query construction |
Architecture: Search returns IDs → retrieve text from sidecars. Claims can reference both claims_text (for claim text) and summaries_text (for full paper context).
See search/zvec/USAGE.html for complete usage instructions.
Quick-start (summaries search):
pip install zvec PyStemmer pyarrow huggingface_hub
import hashlib, json, re, struct
from collections import Counter
import Stemmer, zvec
import pyarrow.parquet as pq
from huggingface_hub import snapshot_download
from pathlib import Path
# Download index + vectorizer + text sidecar (~107 GB total, or 35 GB without text)
snapshot_download("laion/Scientific-Summaries", repo_type="dataset",
local_dir="scientific-summaries",
allow_patterns=["search/zvec/summaries_bm25/**",
"search/zvec/summaries_text/**",
"search/zvec/summaries_bm25_vectorizer.json"])
# Tokenizer (must match index build)
_stemmer = Stemmer.Stemmer("english")
_tok_re = re.compile(r"[a-zA-Z0-9]+")
HASH_SPACE = 2**20
def tokenize(text):
return _stemmer.stemWords(_tok_re.findall(text.lower()))
def token_to_id(t):
return struct.unpack("<Q", hashlib.md5(t.encode()).digest()[:8])[0] % HASH_SPACE
# Load vectorizer and collection
with open("scientific-summaries/search/zvec/summaries_bm25_vectorizer.json") as f:
d = json.load(f)
idf = {int(k): v for k, v in d["idf"].items()}
col = zvec.open("scientific-summaries/search/zvec/summaries_bm25")
# Build text sidecar index (one-time, fast)
sidecar_path = Path("scientific-summaries/search/zvec/summaries_text")
text_index = {}
for pf in sidecar_path.glob("*.parquet"):
table = pq.read_table(pf, columns=["paper_id"])
for i, pid in enumerate(table.column("paper_id")):
text_index[str(pid.as_py())] = (str(pf), i)
# Search
query = "CRISPR gene editing efficiency"
tf = Counter(token_to_id(t) for t in tokenize(query))
qvec = {tid: idf[tid] * c for tid, c in tf.items() if tid in idf and idf[tid] > 0}
results = col.query(
vectors=zvec.VectorQuery(field_name="bm25", vector=qvec), topk=5,
output_fields=["paper_id"])
# Retrieve text from sidecar
for doc in results:
paper_id = doc.field("paper_id")
if paper_id in text_index:
pf_path, row_idx = text_index[paper_id]
table = pq.read_table(pf_path)
summary = str(table.column("concatenated_summary")[row_idx].as_py())
print(f"[{doc.score:.4f}] {summary[:200]}...")
For claims search: Download search/zvec/claims_bm25/, search/zvec/claims_text/, and search/zvec/claims_bm25_vectorizer.json. Claims can reference both claims_text (for claim text) and summaries_text (for full paper summary).
Retrieval latency for top-k=10 queries (5 test queries, single-threaded, cold start):
| Index | Search | Text Retrieval | Total | Notes |
|---|---|---|---|---|
| Summaries | 2.7s | 3.7s (summaries_text) | 6.4s | 22.1M papers |
| Claims | 1.8s | 0.1s (claims_text) + 3.8s (summaries_text) | 5.7s | 92.1M claims |
Key insights:
Benchmark script: benchmark_bm25_retrieval.py
| Index Type | Count | Total Size | RAM (mmap) |
|---|---|---|---|
| FAISS summary indices | 19 | ~23 GB | ~1.6 GB |
| FAISS chunk + claim indices | 2 | ~9 GB | ~0.2 GB |
| BM25 summary indices | 19 | ~220 GB | ~220 GB (in-memory) |
| BM25 chunk + claim indices | 2 | ~93 GB | ~93 GB (in-memory) |
| Total | 42 | ~345 GB |
Source text for displaying results: summary parquets (~346 GB), chunk parquets (~64 GB), claim parquets (~5 GB).
| Script | Description |
|---|---|
examples/search_faiss_summaries.py | Semantic search over 19 summary fields |
examples/search_faiss_chunks_claims.py | Semantic search over 60M chunks / 92M claims |
examples/search_bm25_summaries.py | Keyword search over summary fields |
examples/search_bm25_chunks_claims.py | Keyword search over chunks and claims |
examples/search_hybrid.py | Hybrid FAISS + BM25 with Reciprocal Rank Fusion |
Near-complete coverage of arXiv as of April 2026 (99.8% of all 3,011,619 papers). Includes papers from all arXiv categories: cs, math, physics, q-bio, q-fin, stat, eess, econ. All arXiv papers are permissively licensed, so full text is included for all.
Papers come from three sources that were merged and deduplicated:
Parsed papers from the bethgelab/paper_parsed_jsons dataset. All papers come from permissively licensed preprint servers, so full text is included for all.
| Source | Papers |
|---|---|
| bioRxiv | 245,004 |
| medRxiv | 57,542 |
| ChemRxiv | 26,240 |
| PsyArXiv | 4,995 |
| EdRxiv | 442 |
| NeurIPS | 379 |
| MetaArXiv | 104 |
Biomedical papers from PubMed Central, parsed from the S2ORC collection. Full text is included only for papers confirmed as open access by OpenAlex (~270K papers). All 1.7M papers have complete summaries and metadata regardless.
General scientific papers from the S2ORC (Semantic Scholar Open Research Corpus) papers-1 collection, covering all scientific disciplines. This is the largest subset. Full text is included only for open-access papers confirmed by OpenAlex (~1.4M papers). All 16.7M papers have complete summaries and metadata.
The web-papers subset was created in collaboration with Wynd Labs, who supported the large-scale web scraping and paper collection effort that made this dataset possible.
Each paper has a structured summary generated by priv-gemini-2.0-flash-lite:
| Field | Description |
|---|---|
summary_title | Paper title as identified by the LLM |
summary_authors | Author list |
field_subfield | Scientific field and subfield classification |
type_of_paper | Paper type (empirical study, review, theoretical, etc.) |
executive_summary | Comprehensive summary (400-500 words) |
research_context | Background and motivation (150-200 words) |
research_question_hypothesis | Core research question (180-230 words) |
methodological_details | Methods description (450-550 words) |
procedures_architectures | Technical procedures and architectures |
key_results | Main findings (450-550 words) |
interpretation_implications | Interpretation and theoretical implications |
contradictions_limitations | Limitations and contradictions |
claims | JSON array of claims with supporting/contradicting evidence |
data_code_availability | Data and code availability information |
robustness_ablation_notes | Robustness checks and ablation studies |
ethical_considerations | Ethical considerations |
key_figures_tables | Key figures and tables described |
three_takeaways | Three key takeaways (contribution, evidence, limitation) |
paper_id, subset, source_title, source_authors, source_year, source_venue, source_doi
openalex_id, oa_doi, oa_title, oa_type, oa_year, oa_cited_by_count, oa_language, oa_is_retracted, oa_is_open_access, oa_authorships (JSON), oa_referenced_works (JSON), match_method, has_openalex_match
| Field | Description |
|---|---|
text_sanitized | Clean plain text (included for confirmed OA papers only in this public version) |
text_raw | Raw extracted text |
text_length | Character count of full text |
summary_model, summary_tokens_in, summary_tokens_out
from datasets import load_dataset
# Load arXiv summaries (3.3M papers, all with full text)
ds = load_dataset("laion/Scientific-Summaries", "arxiv")
# Load web papers (16.7M summaries, ~8% with full text)
ds = load_dataset("laion/Scientific-Summaries", "web-papers")
# Access a summary
paper = ds['train'][0]
print(paper['executive_summary'])
# Access structured claims
import json
claims = json.loads(paper['claims'])
for claim in claims:
print(f"Claim: {claim['description']}")
# Filter for papers with full text
with_text = ds['train'].filter(lambda x: x['text_sanitized'] is not None)
# Filter by field
cs_papers = ds['train'].filter(
lambda x: x['field_subfield'] and 'Computer Science' in x['field_subfield']
)
This dataset is part of Project Alexandria, an initiative to create comprehensive, machine-readable representations of the world's scientific literature. The project aims to summarize every scientific paper ever published and enrich it with structured metadata.
Current progress: 22M+ papers summarized, covering ~99.8% of arXiv, major portions of PubMed, and millions of general scientific papers across all disciplines.
A huge thank you to our collaborators and data sources:
@misc{alexandria2025,
title={Project Alexandria: Structured Summaries of Scientific Papers at Scale},
author={REDACTED},
year={2025},
eprint={2502.19413},
archivePrefix={arXiv}
}
CC-BY-4.0