Skip to content
Cultural Analytics

To combine text and image analytics defensibly, keep each modality as its own documented feature table joined on a single stable item ID, prefer late fusion (combine results, not raw features) for interpretability, and validate cross-modal claims on a hand-checked sample of both agreements and conflicts. The hardest part is rarely the modelling — it's keeping every feature correctly tied to the same object and being honest about each modality's noise. Here is the checklist.

How should I structure a multimodal pipeline?

Treat text and image as parallel tracks that meet at a join key, not as a single tangled model:

item_id ── text features  (tokens, NER, topic, sentiment)
        └─ image features (colour, objects, layout, CLIP tags)

              joined on item_id

            joint analysis / fusion

This structure lets you debug each side independently and explain exactly which modality drove a result.

Early fusion or late fusion?

Early fusionLate fusion
What you combineRaw feature vectorsPer-modality predictions/scores
InterpretabilityLowHigh
Robust to one noisy modalityNoYes
Best forMaximum accuracy tasksMost heritage analysis

For cultural analytics, late fusion usually wins: you can see that the text said "mourning" and the image was dark-toned, then combine those interpretable signals — rather than feeding a 1,500-dim blob into a classifier you can't explain.

Keeping modalities tied to the same object

The number-one failure is a broken join. Carry a single stable identifier — a IIIF canvas ID or accession number — through every table.

python
import pandas as pd

text  = pd.read_parquet("text_features.parquet")   # item_id, ...
image = pd.read_parquet("image_features.parquet")  # item_id, ...

merged = text.merge(image, on="item_id", how="inner", validate="one_to_one")
assert len(merged) == len(text), "lost rows on join — duplicate or missing IDs"

The validate="one_to_one" argument turns a silent mismatch into a loud error.

Should I just use CLIP for everything?

CLIP-style multimodal embeddings are genuinely useful for cross-modal retrieval ("find images matching this caption") and zero-shot tagging. But they were trained on modern web image-text pairs, so their notion of, say, "celebration" or "soldier" reflects 21st-century imagery. Before trusting CLIP tags on 19th-century photographs, score a labelled sample and check precision per tag — some will be fine, others useless.

How do I validate a cross-modal claim?

Sample two populations and read both modalities by hand:

  1. Agreements — items where text and image signals point the same way. Confirm the alignment is real, not coincidental.
  2. Conflicts — items where they disagree (caption says "festive", image is sombre). These expose model errors and often surface the most historically interesting cases — irony, captions added later, mislabelled material.

Report how often each modality was right in the conflict set; that number tells readers which signal to trust.

Don't let clean images drown noisy text

If your text comes from OCR with a 15% character error rate and your image features are crisp, naive fusion lets the image side dominate while the text contributes mostly noise. Measure text quality (CER), then either filter low-quality text items, down-weight the text modality, or run the analysis both with and without text and compare. State the OCR quality you worked with.

A minimal documentation block

For every feature table record: item ID, modality, producing model + version, and date. Multimodal work multiplies the number of moving parts, so without versioned provenance you cannot reproduce a run or explain why two analyses differ.

Key Takeaways

  • Keep text and image as separate documented tables joined on one stable item ID.
  • Prefer late fusion for interpretability and robustness to a single noisy modality.
  • Validate the join with one-to-one checks — broken joins are the top failure mode.
  • Treat CLIP-style models as useful but modern-biased; validate tags on your own material.
  • Validate cross-modal claims on both agreement and conflict samples; conflicts reveal the most.
  • Measure OCR quality so noisy text doesn't let image features silently dominate.
  • Record model and version for every feature so runs are reproducible.

Frequently Asked Questions

What's the simplest way to combine text and image evidence?

Keep them as separate, well-documented feature tables joined on a shared item ID, then analyse jointly. Late fusion (combining results) is more interpretable than early fusion (combining raw features) for most heritage work.

Should I use a single multimodal model like CLIP?

CLIP-style models are excellent for cross-modal retrieval and zero-shot tagging, but their embeddings are trained on modern web data, so validate their behaviour on your historical material before trusting tags.

How do I keep text and image pipelines aligned to the same object?

Assign a stable item identifier (e.g. a IIIF or accession ID) and carry it through every feature table. Mismatched joins are the number-one source of multimodal errors.

What metadata should travel with every feature?

Item ID, modality, the model and version that produced the feature, and a date. Without model version you can't reproduce or compare runs.

How do I validate cross-modal claims?

Hand-check a random sample where text and image signals agree and where they conflict. Conflicts are where models most often fail and where the interesting history hides.

Is OCR text good enough to combine with image features?

Only if you've measured its error rate. Combining noisy OCR with clean image features lets the image side silently dominate; weight or filter by text quality.