Workshop - Daten zwischen Projekten in OpenRefine abgleichen

Folie - Daten zwischen Projekten in OpenRefine abgleichen Folie - Daten zwischen Projekten in OpenRefine abgleichen

Daten können zwischen OpenRefine Projekten abgeglichen werden. In diesem Tutorial zeigen wir wie das funktioniert.

Einführung

cross() in der OpenRefine Dokumentation.
cross() im OpenRefine Wiki.

Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version 3.7.5.

Im Artikel Gemeinsam an OpenRefine-Projekten arbeiten haben wir verschiedene Varianten, Daten zwischen OpenRefine Projekten abzugleichen, besprochen und verglichen. In diesem Tutorial fokussieren wir uns auf die Funktion cross() in OpenRefine, ohne über Alternativen und zukünftige Entwicklungen zu spekulieren.

Vorbereitung: Projekt erstellen

Die folgenden Dateien jeweils in ein OpenRefine-Projekt laden.

💾 Wir benötigen die folgenden Dateien (Rechtsklick und “Ziel speichern unter…”):

Staedte in BW
Staedte in BW - Geokoordinaten

In der Datei für das Projekt “Staedte in BW” sind Informationen aus Wikidata und der GND zu den 25 bevölkerungsreichsten Städten in Baden-Württemberg gesammelt.

In der Datei für das Projekte “Staedte in BW - Geokoordinaten” sind Geokoordinaten für Städte in Baden Württemberg gesammelt. Mit diesen beiden Projekten testen wir in den folgenden Aufgaben den Datenabgleich.

Das Projekt “Staedte in BW” verwenden wir in 13 Die Welt der Facets noch einmal.

Aufgabe 1: Daten via Name abgleichen

Im Projekt “Staedte in BW” wollen wir die passenden Geokoordinaten für die einzelnen Städte aus dem Projekt “Staedte in BW - Geokoordinaten” nachladen. Dafür gehen wir im Projekt “Staedte in BW” über “Stadt" "Edit column" "Add column based on this column…” und verwenden den folgenden GREL Ausdruck.

cell.cross(
    "Staedte in BW - Geokoordinaten",
    "Name")
  .cells["Geokoordinaten (WGS 84)"]
  .value[0]

Dabei benötigen wir den exakten Projektnamen des Projektes aus dem wir die Daten nachladen wollen (“Staedte in BW - Geokoordinaten”), die Spalte in dem anderen Projekt mit der unsere Spalte “Stadt” abgeglichen werden soll (“Name”) und den Namen der Spalte in dem anderen Projekt, die wir “nachladen” wollen (“Geokoordinaten (WGS 84)”). Der Dialog ist in Abbildung 1 gezeigt.

Bildschirmfoto des Dialogs zum Abgleich mit einem anderen Projekt über die Spalte Stadt.
Bildschirmfoto des Dialogs zum Abgleich mit einem anderen Projekt über die Spalte Stadt.

Aufgabe: in der Vorschau in Abbildung 1 ist zu sehen, dass für “Freiburg im Breisgau” keine Daten nachgeladen werden konnten. Warum ist das so? Gibt es noch weitere “problematischen” Einträge? Was bedeutet das für einen Abgleich über “Namen”?

Lösung:

  • Im Projekt “Staedte in BW - Geokoordinaten” sind die Namen der Städte “Freiburg im Breisgau” und “Esslingen am Neckar” abgekürzt.
  • Ein Abgleich über Namen scheitert manchmal an unterschiedlichen Schreibweisen.
  • Wenn möglich also besser eindeutige IDs verwenden.
  • Siehe auch Gemeinsam an OpenRefine-Projekten arbeiten für weitere Details und mögliche Lösungsstrategien.

Aufgabe 2: Daten via ID abgleichen

Wir wiederholen die Aufgabe mit einem Abgleich über die Spalte “GND-ID”.

Aufgabe: Laden Sie im Projekt “Staedte in BW” die Spalte “Geokoordinaten (WGS 84)” aus dem Projekt “Staedte in BW - Geokoordinaten” über einen Abgleich mit der Spalte “GND-ID” nach.

Lösung:

Dafür gehen wir im Projekt “Staedte in BW” über “GND-ID” “Edit column” “Add column based on this column…” und verwenden den folgenden GREL Ausdruck.

cell.cross(
    "Staedte in BW - Geokoordinaten",
    "GND ID")
  .cells["Geokoordinaten (WGS 84)"]
  .value[0]
Bildschirmfoto des Dialogs zum Abgleich mit einem anderen Projekt über die Spalte GND-ID.
Bildschirmfoto des Dialogs zum Abgleich mit einem anderen Projekt über die Spalte GND-ID.

Aufgabe 3: Zeilen nachladen

OpenRefine arbeitet Spalten orientiert und erlaubt daher nur das Hinzufügen oder Nachladen von zusätzlichen Spalten. Manchmal möchte man einzelne Zeilen zum Beispiel aus einem anderen OpenRefine Projekt nachladen. Hier ist der einfachste Weg beide Projekte zu exportieren und in einem neuen Projekt gemeinsam zu importieren.

In seltenen Fällen ist dies unpraktisch, da man beispielsweise die Bearbeitungshistorie erhalten, oder nur einen Teil der Daten übernehmen möchte. Daher nutzen wir hier die Funktion cross() um Zeilen aus einem anderen Projekt nachzuladen.

Projekte erstellen

Wir verwenden noch einmal die CSV-Dateien 01_kretschmann-kabinett-frauen.csv und 01_kretschmann-kabinett-maenner.csv aus Aufgabe 2 in 01 Projekte in OpenRefine laden und verwalten.

💾 Wir benötigen die folgenden zwei Dateien (Rechtsklick und “Ziel speichern unter…”):

Kretschmann Kabinett Frauen als CSV
Kretschmann Kabinett Maenner als CSV

Diesmal laden wir die Daten jeweils in ein eigenes Projekt mit dem Namen “Kretschmann Kabinett III - Frauen” bzw. “Kretschmann Kabinett III - Männer”.

Projekt 2: Spalte Abgleich erstellen

In dem Projekt “Kretschmann Kabinett III - Männer” erstellen wir via “Geschlecht" "Edit column" "Add column based on this column…” und dem folgenden GREL Ausdruck eine neue Spalte mit dem Titel “Abgleich”.

row.index

Über diese Spalte steuern wir, wie die beiden Projekte zusammengeführt werden sollen. So kann der Wert der Spalte “Abgleich” für Zeilen, die nicht übertragen werden sollen, wieder entfernt, bzw. gar nicht erst gesetzt werden.

Projekt 1: Spalte Abgleich erstellen

In dem Projekt “Kretschmann Kabinett III - Frauen” erstellen wir ebenfalls via “Geschlecht" "Edit column" "Add column based on this column…” und dem folgenden GREL Ausdruck eine neue Spalte mit dem Titel “Abgleich”.

with(7, rowsInProject,
  with(6, rowsToLoad,
    if(row.index + 1 == rowsInProject,
      "," + forRange(0, rowsToLoad, 1, v, v).join(","),
      ""
    )
  )
)

Dieser GREL Ausdruck schreibt nur in die letzte Zeile eine Aufzählung der Zeilennummern aus dem Projekt “Kretschmann Kabinett III - Männer”. Da wir (aktuell) nicht automatisch ermitteln können, wie viele Zeilen das aktuelle bzw. das abzugleichende Projekt hat, müssen wir diese Informationen via den Variablen rowsInProject und rowsToLoad selbst setzen. Das Ergebnis der Operation ist in Abbildung 2 gezeigt.

Bildschirmfoto des Projektes nach dem Hinzufügen der Spalte Abgleich.
Bildschirmfoto des Projektes nach dem Hinzufügen der Spalte Abgleich.

Projekt 1: Neue Zeilen erstellen

Anschließend erzeugen wir die neuen Zeilen via “Abgleich" "Edit Cells" "Split multi-valued cells…” auf dem Komma , als Trennzeichen. Das Ergebnis ist in Abbildung 3 gezeigt.

Bildschirmfoto des Projektes nach dem Hinzufügen der leeren Zeilen.
Bildschirmfoto des Projektes nach dem Hinzufügen der leeren Zeilen.

Projekt 1: Daten nachladen

Dann können wir mit dem folgenden GREL Ausdruck über “ALL" "Transform…” die zusätzlichen Zeilen nachladen. In dem folgenden Dialog können wir auch auswählen, auf welchen Spalten der GREL Ausdruck angewendet werden soll, und so auch nur spezifische Spalten nachladen. Das Ergebnis ist in Abbildung 4 gezeigt.

if(isNonBlank(row.cells["Abgleich"].value),
  row.cells["Abgleich"].cross("Kretschmann Kabinett III - Männer", "Abgleich").cells[columnName].value[0],
  value
)
Bildschirmfoto des Projektes nach dem Nachladen der Zeilen.
Bildschirmfoto des Projektes nach dem Nachladen der Zeilen.
Die GREL Ausdrücke wurden hier absichtlich etwas komplexer gewählt, um zusätzliche Schritte wie Filtern zu vermeiden.

Fazit

Mit der Funktion cross() können ziemlich komfortabel Daten zwischen unterschiedlichen OpenRefine Projekten abgeglichen werden. Natürlich kann sie auch dazu verwendet werden Datenspalten innerhalb eines Projektes zu vergleichen. Die Funktion kann jedoch nur eindeutige Werte zusammenführen. Schon kleinste Abweichungen wie zusätzliche Leerzeichen oder Abkürzungen sorgen für einen fehlenden Abgleich der einzelnen Zeilen. Umso wichtiger ist ein sorgfältiges Arbeiten und die Verwendung von eindeutigen Identifikatoren.


Im nächsten Teil beschäftigen wir uns weiter mit Facets in OpenRefine.

Benjamin Rosemann
Benjamin Rosemann
Data Scientist

Ich evaluiere KI- und Software-Lösungen und integriere sie in den Archivalltag.

Ähnliches