OpenRefine (früher Google Refine, davor Freebase Gridworks) ist das Standard-Werkzeug, um tabellarische Daten zu inspizieren, bereinigen, transformieren und gegen Authority-Files zu mappen. Java-basiert, läuft lokal als Web-App auf http://localhost:3333, alle Daten bleiben auf dem eigenen Rechner.
In der GLAM- und DH-Welt ist OpenRefine die naheliegende Brücke zwischen Excel-/CSV-basierter Erschliessungsarbeit und der Linked-Data-Welt: ein Sprint mit Cluster-Erkennung, Reconciliation gegen GND, Wikidata oder GeoNames verwandelt eine rohe Personen- oder Ortsliste in eine ID-angereicherte, weiterverarbeitbare Datei.
Installation und Start
# macOS via Homebrew
brew install --cask openrefine
# oder Download:
# https://openrefine.org/download.html
OpenRefine startet einen lokalen Server (localhost:3333); der Browser öffnet automatisch die UI. Daten werden in Projekten organisiert, die im Workspace-Verzeichnis als Snapshots persistiert werden — alle Änderungen sind reversibel via Undo/Redo, vollständige Operations-Historie ist als JSON exportierbar.
Datenimport
Unterstützte Formate beim Anlegen eines Projekts:
| Format | Hinweise |
|---|---|
| CSV / TSV | mit Encoding-Erkennung, Trennzeichen-Auto-Detect |
| Excel (XLS/XLSX) | mehrere Sheets, Header-Zeile optional |
| JSON | Pfad-Auswahl im Preview, Liste-of-Objects |
| XML | Element-Pfad-Auswahl |
| RDF (Turtle/N3/RDF/XML) | mit RDF-Extension |
| Google Sheets | direkt via URL |
| MARC21 (mit MARC2OpenRefine-Erweiterung) | seltener |
Für Sammlungs-Daten typisch: Excel-Export aus dem AIS, Import in OpenRefine, Bereinigung, Re-Import in das Quell-System mit angereicherten Spalten.
Facetten und Filter
Das Herzstück der Inspektion: Facets zeigen die Werteverteilung einer Spalte und erlauben das Filtern.
| Facet-Typ | Use Case |
|---|---|
| Text Facet | unique Werte zählen, Tippfehler aufspüren |
| Numeric Facet | Histogramm, Ausreisser sehen |
| Timeline Facet | Datums-Verteilungen visualisieren |
| Custom Text Facet (GREL) | komplexe Klassifikationen |
| Text Filter | regex-basierte Selektion |
| Scatterplot Facet | Korrelation zweier numerischer Spalten |
In der Praxis heisst das: vor jeder Transformation per Facet sehen, welche Werte überhaupt vorkommen — typisch der Moment, in dem 3 verschiedene Schreibweisen für „Zürich” auffallen.
Cluster — Tippfehler und Varianten finden
Das Killer-Feature für Erschliessungs-Daten. Auf einer Spalte → Edit cells → Cluster and edit. OpenRefine schlägt Wertegruppen vor, die nach verschiedenen Algorithmen ähnlich sind:
- Key collision — schnell, gut für Capitalization, Whitespace, Punktuation (
fingerprint,ngram-fingerprint,metaphone3,cologne-phonetic) - Nearest neighbor — slower, gut für Tippfehler-Cluster (
levenshtein,ppm)
Pro Cluster wählt der Erfasser einen Cleaner-Namen oder bestätigt einen vorgeschlagenen — Hunderte Datensätze konsolidieren sich in Minuten.
GREL — General Refine Expression Language
OpenRefines Mini-Sprache für Cell-Transformationen. Einsatz: Edit cells → Transform.
// Trim und Lowercase
value.trim().toLowercase()
// Datumsformat normalisieren
toDate(value, "dd.MM.yyyy").toString("yyyy-MM-dd")
// Erste Komponente eines Compound-Felds
value.split(",")[0].trim()
// Aus "Goethe, Johann Wolfgang von (1749-1832)" zwei Spalten machen
// — Spalte „name": value.match(/(.+?) \(/)[0]
// — Spalte „dates": value.match(/\((.+?)\)/)[0]
// Whitespace-Normalisierung (mehrere Leerzeichen → eins)
value.replace(/\s+/, " ").trim()
// Null/Empty-Cells aus Nachbarspalte füllen
if(isBlank(value), cells["other_col"].value, value)
// Zellen splitten und auf neue Zeilen verteilen
value.split(";")
// → Edit cells → Split multi-valued cells
// JSON-Lookup auf eine externe Spalte
forEach(cells["tags"].value.split(","), v, v.trim()).join(" · ")
GREL-Funktionen sind dokumentiert unter Help → GREL Reference; alternativ Jython oder Clojure als Skriptsprachen wählbar.
Reconciliation — Werte gegen Authority mappen
Der zentrale Linked-Data-Workflow. Auf einer Spalte → Reconcile → Start reconciling….
Verfügbare Endpoints (entweder vorinstalliert oder via URL hinzufügen):
| Authority | Endpoint-URL |
|---|---|
| Wikidata | https://wikidata.reconci.link/<lang>/api |
| GND (Lobid) | https://lobid.org/gnd/reconcile |
| GeoNames | https://geonames.reconci.link/ |
| VIAF | https://reconciliation-api.toolforge.org/openrefine/viaf |
| Getty AAT | https://services.getty.edu/vocab/reconcile/aat |
| Getty ULAN | https://services.getty.edu/vocab/reconcile/ulan |
| Getty TGN | https://services.getty.edu/vocab/reconcile/tgn |
| ORCID | https://reconciliation.orcid.org/openrefine/api |
Reconciliation-Schritte:
- Endpoint wählen, Entitäts-Typ auswählen (
Q5Mensch für Wikidata, Tp für GND etc.) - OpenRefine schickt jeden Wert ans API, bekommt Match-Kandidaten zurück
- UI zeigt Confidence-Scores; bei eindeutigen Treffern auto-bestätigen, sonst manuell
- Zusätzliche Properties als neue Spalten anziehen (z. B. Geburtsdatum, Wikidata-Q-ID)
Tipp: vor der Reconciliation per Facet leere Werte und Cluster bereinigen, damit das API nicht mit Müll bombardiert wird.
Wikidata-Upload mit Schema-Editor
OpenRefine hat einen eingebauten Wikidata-Schema-Editor: Aus den OpenRefine-Spalten lassen sich Wikidata-Statements modellieren (Item-Property-Value mit Qualifiers und Referenzen) und nach Authentifizierung direkt in Wikidata schreiben.
Das ist der Standard-Workflow für GLAM-Wikidata-Initiativen: Sammlungs-Inventar in Excel, in OpenRefine reconciliieren, fehlende Items neu anlegen, bestehende um Properties anreichern. Bei Massen-Edits unbedingt mit der Wikidata-Community absprechen (Wikidata:WikiProject GLAM).
Export — zurück in die Welt
| Format | Use Case |
|---|---|
| CSV / TSV / Excel | zurück in den Erfassungs-Workflow |
| HTML Table | Bericht, Mailbody |
| Templated Export (Jinja-artig) | TEI, EAD, MARC, RDF, JSON-LD generieren |
| Custom export über GREL | exotische Formate |
Der Templated Export ist mächtig: ein Jinja-Template kann pro Zeile einen <persName>-Block, einen MARC-Record oder einen JSON-LD-Knoten generieren — das ersetzt manchmal eine ganze Skript-Pipeline.
{
"@id": "https://example.org/persons/{{cells["id"].value}}",
"@type": "Person",
"name": "{{cells["name"].value|escape}}",
"gnd": "https://d-nb.info/gnd/{{cells["gnd"].value}}",
"wikidata": "http://www.wikidata.org/entity/{{cells["wikidata"].value}}"
}{% if not forloop.last %},{% endif %}
Praktische Patterns für GLAM
Personen-Inventar reconciliieren
- Excel-Liste (Name, Geburtsjahr, ggf. Beruf) importieren
- Cluster für Tippfehler in „Name”-Spalte
- Reconcile gegen Wikidata mit Type
Q5, optional Lookup-Hint mit Geburtsjahr - Auto-match bei Confidence > 0.95, Rest manuell
- Spalten anreichern: GND-ID (P227), VIAF-ID (P214), Wikipedia-Link
- Export als CSV mit zusätzlichen Authority-Spalten
Aus Tabelle TEI generieren
- Eine Zeile pro Person; Spalten
name,gnd,birth,death,note - Templated Export mit TEI-Template generiert
<listPerson>mit<person xml:id="…"> - Resultat ins TEI-Personenregister einfügen
Datums-Bereinigung
Häufiger Fall: gemischte Formate (23.4.1850, 23. April 1850, 1850-04-23, April 1850, circa 1850). Strategie:
// Robuste GREL-Pipeline
if(value.match(/^\d{4}-\d{2}-\d{2}$/) != null, value,
if(value.match(/^\d{1,2}\.\d{1,2}\.\d{4}$/) != null,
toDate(value, "d.M.yyyy").toString("yyyy-MM-dd"),
if(value.match(/^\d{4}$/) != null, value + "-01-01",
"needs-review")))
Dann Facet auf needs-review setzen und manuell durchgehen.
Splitting und Reshape
Multi-valued Cells (z. B. „Zürich; Bern; Basel”) via Edit cells → Split multi-valued cells auf neue Zeilen verteilen, dann pro Zeile reconciliieren, dann via Edit cells → Join multi-valued cells wieder zusammen — mit IDs statt Roh-Werten.
Werkzeuge und Erweiterungen
- Project Operations Export — alle Schritte als JSON, reproduzierbar auf neuen Datasets via Apply
- RDF Extension — Triples direkt aus OpenRefine schreiben
- Wikidata Extension (eingebaut) — Schema-Editor und Upload
- Commons Extension — Bilder zu Wikimedia Commons hochladen
- Reconciliation Service Endpoints — eigene API-Endpoints definierbar
- OpenRefine Client (CLI) — Headless-Betrieb für Pipelines
Häufige Fallen
- Encoding: bei CSV-Import explizit UTF-8 wählen, sonst zerbrechen Umlaute. Excel kann beim Speichern als CSV stillschweigend Latin-1 schreiben.
- Massen-Reconciliation gegen kostenlose Endpoints: Lobid und Wikidata sind grosszügig, aber 100’000 Anfragen brechen jeden Goodwill. Bei sehr grossen Sets erst lokalen Index aufbauen oder Premium-Service nutzen.
- Cluster-Algorithmen sind nicht intelligent: sie gruppieren ähnlich, nicht gleich. Vor Bestätigung sichten — sonst wird aus „Hans Müller” und „Hans Müller jun.” ein Datensatz.
- GREL evaluiert eager: bei grossen Datasets können Custom Facets langsam werden. Erst auf 100-Zeilen-Sample testen, dann auf voller Daten anwenden.
- Reconciliation-Confidence ist nicht deterministisch: gleicher Input kann je nach Tagesform anderer Score liefern. Manuell prüfen, nicht blind auto-matchen.
- Workspace lokal: Projekte liegen im OpenRefine-Workspace, nicht in der Cloud. Backup nicht vergessen — Projekt-Export als
.tar.gzmöglich. - Java-Heap-Size: bei Datasets > 500’000 Zeilen den
-Xmx-Parameter beim Start erhöhen, sonst Out-of-Memory.
Verhältnis zu anderen Werkzeugen
- Pandas / Python — programmatischer, weniger UI-zentriert; OpenRefine ist niederschwelliger für GLAM-Erfassende ohne Programmier-Hintergrund.
- csvkit — CLI-Werkzeuge für CSV-Operationen; gut für Skripte, ohne Reconciliation-Layer.
- MarcEdit — bibliotheksspezifisch für MARC-Records; OpenRefine ergänzt mit Authority-Reconciliation.
- Pandoc — orthogonal: Pandoc transformiert Dokumente, OpenRefine transformiert Daten.