Buckets:

institutional/skills / institutional-books.md
MatteoCargnelutti's picture
|
download
raw
10.2 kB
---
name: institutional-books
description: "Use the Institutional Books family of Hugging Face datasets and models: the public-domain book corpus and its metadata, enriched/segmented text, and per-page visual elements, plus models for visual-element detection, classification, orientation, and topic classification. Use when a task involves the Institutional Books corpus, digitized-book text or metadata analysis, extracting or classifying figures/charts/music/illustrations from scanned pages, or assigning library topics to books."
---
# Institutional Books — datasets & models
A family of Hugging Face assets built from *Institutional Books* (983K public-domain books, ~242B tokens, digitized from Harvard Library's Google Books participation and refined by the Institutional Data Initiative).
Technical reports: arXiv:2506.08300, arXiv:2608.19026, arXiv:2608.18957
**Two ideas that drive every decision:**
1. **`barcode_src` is the join key.** One book = one barcode. Every dataset carries `barcode_src`, so you relate them with a join, not a re-download.
2. **The datasets are precomputed model outputs.** The topic and visual-element models were already run over the whole corpus and their results stored as columns. **Read the field instead of re-running the model.** Only run a model on *new* images or text that isn't already in the corpus.
## Pick the right asset
| I need to… | Use |
| --- | --- |
| Book text (original + post-processed OCR) + all metadata | dataset `institutional-books-hl` (large — stream it) |
| Metadata only (title, author, dates, language, topic, OCR scores…) without downloading text | dataset `institutional-books-hl-metadata` |
| Structurally segmented text (front/middle/back matter) + refined text stats | dataset `institutional-books-hl-enriched-text` |
| Figures/charts/music/illustrations already extracted from pages (boxes, labels, orientation, captions, embeddings) | dataset `institutional-books-hl-visual-elements` |
| A book's high-level topic (already computed) | field `topic_or_subject_gen` in the corpus/metadata datasets |
| A book's visual elements (already computed) | dataset `institutional-books-hl-visual-elements` |
| Topic of a **new** book from its metadata | model `institutional-books-topic-classifier-bert` |
| Find visual elements on a **new** page scan | model `…-visual-elements-detection``…-classification``…-orientation` |
## Datasets
All under the `institutional/` org. Load with the `datasets` library. See [Auth & gating](#auth--gating) for gated repos.
### `institutional-books-hl` — full corpus
One row per book (~983K). Key fields: `barcode_src` (primary key), `title_src`, `author_src`, `date1_src`, `language_src`/`language_gen`, `topic_or_subject_gen`, `text_by_page_src` (original OCR, `List[str]` by page), `text_by_page_gen` (post-processed OCR; ~850K books in eng/deu/fra/ita/spa). Large — **always stream**.
```python
from datasets import load_dataset
ds = load_dataset("institutional/institutional-books-hl", split="train",
streaming=True, token=True) # token=True → uses HF_TOKEN / cached login
for row in ds:
print(row["barcode_src"], row["title_src"])
print(row["text_by_page_gen"][0]) # first page, post-processed OCR
break
```
### `institutional-books-hl-metadata` — metadata only
Same schema as the corpus **minus** the `text_by_page_*` text columns. Use this whenever you don't need the full text — it's far smaller and ungated.
```python
ds = load_dataset("institutional/institutional-books-hl-metadata", split="train")
```
### `institutional-books-hl-enriched-text` — segmented text
One row per book. `barcode_src` + `frontmatter_gen` / `middlematter_gen` / `backmatter_gen` (structural segments), `processed_middlematter_gen`, plus text-quality stats (`tokenizability_ratio_gen`, bits-per-byte `bpb_*`, n-gram/word/sentence counts). Use when you need document structure or refined-text quality signals.
### `institutional-books-hl-visual-elements` — extracted visual elements
One row per **detected element** (10M–100M rows) — the detection→classification→orientation pipeline already run over the corpus. Key fields:
- `id`, `barcode_src`, `page_filename_src`, `bbox_xyxy_gen` — where the element is
- `crop_gen` — the cropped image
- `detection_confidence_gen`
- `classification_gen` (+ `_confidence_gen`, `_probs_gen`) — matches the split it came from
- `orientation_correction_gen` (+ `_confidence_gen`, `_probs_gen`)
- `caption_exp`, `phash_gen`, `embedding_gen` — caption, perceptual hash, vector
**Splits are the categories**, so select one instead of filtering: `music`, `image_illustration`, `chart_graph`, `ex_libris_decorative`, `artifact`, `other`.
```python
from pathlib import Path
out = Path("music_crops"); out.mkdir(exist_ok=True)
ve = load_dataset("institutional/institutional-books-hl-visual-elements",
split="music", streaming=True) # pick the category you want
for row in ve.take(20): # first 20 music scores
row["crop_gen"].save(out / f"{row['id']}.png") # unique filename per element (PIL image)
print(row["id"], row["barcode_src"], row["detection_confidence_gen"])
```
## Models
All under `institutional/`. Weights via `huggingface_hub.hf_hub_download`.
### `institutional-books-topic-classifier-bert` (`transformers`)
mBERT fine-tune. Input: a formatted metadata string. Output: one of 20 Library of Congress top-level classes (SCIENCE, LAW, MEDICINE, HISTORY OF THE AMERICAS, …). This is the source of `topic_or_subject_gen` — only run it for books not in the corpus.
```python
from transformers import pipeline
pipe = pipeline("text-classification",
model="institutional/institutional-books-topic-classifier-bert")
text = "Title: A treatise on analytical geometry\nAuthor: Hymers, J.\nYear: 1848\nLanguage: English"
print(pipe(text)) # [{'label': 'SCIENCE', 'score': 0.99...}] (all fields optional)
```
### Visual-elements pipeline
Three models mirror the visual-elements dataset columns. Run them in order on a **new** page scan; for corpus pages, read the dataset instead.
**1. Detection**`…-visual-elements-detection` (YOLOv26n, `ultralytics`). Page scan → bounding boxes (single class "visual element").
```python
from huggingface_hub import hf_hub_download
from ultralytics import YOLO
det = YOLO(hf_hub_download("institutional/institutional-books-visual-elements-detection",
"weights/best.pt"))
results = det.predict("page_scan.jpg", imgsz=640, conf=0.3, iou=0.2)
boxes = [b.xyxy.tolist()[0] for b in results[0].boxes] # crop these from the page
```
**2. Classification**`…-visual-elements-classification` (YOLOv26s-cls, `ultralytics`). A **cropped** element → one of 5 classes: `0 Artifact · 1 Chart/Graph · 2 Ex Libris/Decorative · 3 Image/Illustration · 4 Music`.
```python
cls = YOLO(hf_hub_download("institutional/institutional-books-visual-elements-classification",
"weights/best.pt"))
r = cls.predict("crop.jpg", imgsz=640)[0]
print(r.names[r.probs.top1], float(r.probs.top1conf))
```
**3. Orientation**`…-visual-elements-orientation` (EfficientNetV2-M, raw PyTorch `state_dict`). A crop → rotation correction: `0 upright · 1 rotate_90_clockwise · 2 rotate_180 · 3 rotate_90_counterclockwise`. Predictions below **0.99** confidence default to `upright`.
```python
import torch, torch.nn as nn, torchvision.models as models
from torchvision import transforms
from PIL import Image
from huggingface_hub import hf_hub_download
m = models.efficientnet_v2_m(weights=None)
m.classifier = nn.Sequential(nn.Dropout(0.3, inplace=True),
nn.Linear(m.classifier[1].in_features, 4))
m.load_state_dict(torch.load(
hf_hub_download("institutional/institutional-books-visual-elements-orientation",
"weights/weights.pth"), map_location="cpu", weights_only=True))
m.eval()
prep = transforms.Compose([
transforms.Resize((512, 512)), transforms.CenterCrop(480), transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])
labels = {0: "upright", 1: "rotate_90_clockwise", 2: "rotate_180", 3: "rotate_90_counterclockwise"}
with torch.no_grad():
probs = torch.softmax(m(prep(Image.open("crop.jpg").convert("RGB")).unsqueeze(0)), 1)[0]
top = int(probs.argmax())
label = labels[top] if float(probs[top]) >= 0.99 else "upright"
# apply: rotate_90_clockwise → img.rotate(-90, expand=True);
# rotate_180 → 180; rotate_90_counterclockwise → 90
```
## How they connect
**Field suffixes** tell you a value's provenance:
| Suffix | Meaning |
| --- | --- |
| `_src` | From the source collection (original bibliographic/OCR data) |
| `_gen` | Generated by IDI analysis or a model (e.g. `topic_or_subject_gen`) |
| `_ext` | Pulled from an external source (e.g. `hathitrust_data_ext`) |
| `_exp` | Experimental (e.g. `caption_exp`) |
**Join on `barcode_src`** to combine datasets — e.g. filter visual elements by a book's language, date, or topic:
```python
meta = load_dataset("institutional/institutional-books-hl-metadata", split="train")
fr = {r["barcode_src"] for r in meta if r["language_gen"] == "fra"} # French books
ve = load_dataset("institutional/institutional-books-hl-visual-elements",
split="train", streaming=True)
music_in_french = (r for r in ve
if r["barcode_src"] in fr and r["classification_gen"] == "Music")
```
Within the visual-elements dataset, `page_filename_src` + `bbox_xyxy_gen` locate an element on its specific page.
**Visual pipeline** (only for new scans): page → detection (boxes) → crop → classification (5 classes) + orientation (4 classes) → optional caption/embedding. This is exactly what produced the visual-elements dataset columns.
## Auth & gating
Set a token that has been granted access, then pass it to the loaders:
```bash
export HF_TOKEN="hf_..." # or: huggingface-cli login
```
## Dependencies
```bash
pip install datasets huggingface_hub transformers torch torchvision pillow ultralytics
```

Xet Storage Details

Size:
10.2 kB
·
Xet hash:
207eda52979cf320628a8eabbf864f6983104e18ce6af16cde7a37e6e096cd20

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.