Workshop - Arbeiten mit Records in OpenRefine

Folie - Arbeiten mit Records in OpenRefine Folie - Arbeiten mit Records in OpenRefine

OpenRefine kann im Zeilen- oder Records-Modus arbeiten. In diesem Tutorial besprechen wir, wie wir Records aus auf Zeilen basierten Datensätzen erstellen, wie wir mit Records arbeiten können und wie wir Records wieder in auf Zeilen basierte Datensätze umwandeln.

Einführung

Records in der OpenRefine Dokumentation.
Records mit GREL in der OpenRefine Dokumentation.

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

Um in OpenRefine zwischen dem Zeilen- und dem Record-Modus zu wechseln, gibt es in der oberen Bedienleiste, die in Abbildung 1 gezeigten Schaltflächen.

Bildschirmfoto der Schaltflächen zum Umschalten zwischen dem Zeilen- und Record-Modus.
Bildschirmfoto der Schaltflächen zum Umschalten zwischen dem Zeilen- und Record-Modus.

Diese Schaltflächen ändern, wie OpenRefine aufeinanderfolgende Zeilen anzeigt, filtert, und bearbeitet. Betrachten wir den folgenden Ausschnitt aus dem Kabinett Kretschmann III, mit dem wir auch die folgenden Praxisaufgaben durchführen werden.

AllNameBeruf
1.Kretschmann, WinfriedAbgeordneter
2.Lehrer
3.Politiker
4.Regierungschef
5.Walker, TheklaPädagogin
6.Politikerin
7.Weibliche Abgeordnete

Diese Tabelle zeigt, wie OpenRefine im Zeilenmodus mit den Daten umgeht. Jede Zeile steht für sich und hat auch eine eigene Zeilennummer. Wird in diesem Modus in der Spalte “Beruf” nach dem Wert “Politik” gefiltert, dann werden in diesem Modus nur die Zeilen 3. und 6. angezeigt. Man weiß also nicht, zu welcher Person dieser Wert gehört.

Im Record-Modus betrachtet OpenRefine die 1. Spalte, nimmt die erste Zelle mit einem Wert (z.B. Zeile 1) und fasst sie mit den folgenden Zeilen mit einer leeren Zelle in der 1. Spalte (Zeilen 2 - 4) wie in der nächsten Tabelle gezeigt zu einem Record zusammen.

AllNameBeruf
1.Kretschmann, WinfriedAbgeordneter
Lehrer
Politiker
Regierungschef
2.Walker, TheklaPädagogin
Politikerin
Weibliche Abgeordnete

Entsprechend wird auch die Anzeige geändert und zum Beispiel nicht mehr die Zeilen durchnummeriert, sondern die Records. Das ermöglicht es mit OpenRefine baumartige Strukturen zu importieren, zu verarbeiten und zu exportieren.

In den folgenden praktischen Übungen werden wir das Arbeiten mit Records praktisch ausprobieren und dabei auch einige für Records spezifische GREL Ausdrücke kennen lernen.

Vorbereitung: Projekt erstellen

Die folgende Datei in ein OpenRefine-Projekt laden.

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

Kretschmann III als CSV

Aufgabe 1: Records aus wiederholenden Zeilen erstellen

Bildschirmfoto mit den Berufen der Mitglieder im Kabinett Kretschmann III.
Bildschirmfoto mit den Berufen der Mitglieder im Kabinett Kretschmann III.

Wir starten wie in Abbildung 2 gezeigt mit den Berufen der Mitglieder im Kabinett Kretschmann III (abgerufen am 03.12.2021 aus der GND). Unser Ziel ist es, einen Überblick über alle Berufe eines Mitgliedes des Kabinetts zu erhalten.

Dafür verschieben wir die Spalte “Name” via “Name" "Edit column" "Move column to beginning” ganz nach links. Anschließend sortieren wir die Spalte “Name” alphabetisch via “Name" "Sort…” und fixieren diese Sortierung wie in Abbildung 3 zu sehen via “Sort" "Reorder rows permanently”.

Bildschirmfoto mit dem Menü zum Sortieren.
Bildschirmfoto mit dem Menü zum Sortieren.

Danach entfernen wir die Mehrfachnennung der Namen via “Name" "Edit cells" "Blank down”. Das Ergebnis sieht dann wie in Abbildung 4 aus.

Bildschirmfoto mit den Berufen der Mitglieder im Kabinett Kretschmann III.
Bildschirmfoto mit den Berufen der Mitglieder im Kabinett Kretschmann III.

Typische Anwenderfehler bei “Blank down”:

  1. Vergessen auf den “Zeilenmodus” (rows) umzuschalten.
  2. Inhalte sind nicht alle vom Typ Text.

Aufgabe 2: Arbeiten mit Records

Die Record Struktur hilft uns beim Verarbeiten baumartiger Strukturen, wie es beim Lesen und Schreiben von XML vorkommt. Hier ein paar hilfreiche Funktionen zum Arbeiten mit Records, deren Ergebnisse in Abbildung 5 gezeigt sind.

Bildschirmfoto mit den Ergebnissen verschiedener Aktionen mit Records.
Bildschirmfoto mit den Ergebnissen verschiedener Aktionen mit Records.

Um Aktionen auf Records anzuwenden, wechseln wir in den Records-Modus.

Records filtern

Das Verwenden von Filtermöglichkeiten mit Records kann manchmal etwas verwirrend sein. Um dies zu demonstrieren verwenden wir eine Kombination aus Textfacet und Textfilter auf der Spalte Beruf via “Beruf" "Facet" "Text facet” und “Beruf" "Textfilter”.

In dem Textfilter suchen wir dann nach dem Begriff “Recht”.

Bildschirmfoto mit einer Kombination aus Textfacet und Textfilter auf Records in OpenRefine.
Bildschirmfoto mit einer Kombination aus Textfacet und Textfilter auf Records in OpenRefine.

Wie in Abbildung 6 zu sehen, werden im Record-Modus bei der Verwendung eines Textfilters alle Records angezeigt, die eine Zeile haben, auf die der Textfilter passt. In unserem Fall sind das Minister Strobl und Ministerin Gentges, die beide in der GND Rechtsanwältin bzw. Rechtsanwalt als Berufsangabe haben.

Das ist auch nachvollziehbar und sinnvoll. Gleichzeitig bedeutet es, dass das Textfacet nicht auf Werte reduziert wird, die den Begriff “Recht” im Namen haben (Rechtsanwalt und Rechtsanwältin), sondern alle Werte angezeigt werden, die in den beiden gefilterten Records vorkommen. Das ist ebenfalls nachvollziehbar und sinnvoll, überrascht aber manchmal, da man im Kopf noch/schon im Zeilenmodus denkt.

Daher ist gerade beim Filtern mit Records im Hinterkopf zu behalten, dass manchmal zwischen dem Zeilen- und Record-Modus hin- und hergewechselt werden sollte.

Records durchnummerieren

Wir erstellen eine neue Spalte “Record ID” via “Beruf" "Edit column" "Add column based on this column…” und verwenden den folgenden GREL Ausdruck.

row.record.index + 1

Anschließend verwenden wir “Record ID" "Edit cells" "Blank down” um die überzähligen IDs zu entfernen.

Elemente in Records durchnummerieren

Wir erstellen eine neue Spalte “Record Element ID” via “Record ID" "Edit column" "Add column based on this column…” und verwenden den folgenden GREL Ausdruck.

1 + row.index - row.record.fromRowIndex

Elemente in Records zählen

Wir erstellen eine neue Spalte “Record Count” via “Record Element ID" "Edit column" "Add column based on this column…” und verwenden den folgenden GREL Ausdruck.

if(value==1, row.record.rowCount, null)

Hier sparen wir uns das anschließende “Blank down”, da wir über eine if-Anweisung die Anzahl nur in Zeilen mit der Record Element ID 1 geschrieben haben.

Elemente Sortieren/Doppelungen entfernen

Wir transformieren die Spalte “Beruf” via “Beruf" "Edit cells" "Transform…” und verwenden einen der folgenden GREL Ausdrücke.

Doppelungen entfernen:

row.record.cells["Beruf"].value.uniques().join(", ")

Nur sortieren:

row.record.cells["Beruf"].value.sort().join(", ")

Doppelungen entfernen und sortieren:

row.record.cells["Beruf"].value.uniques().sort().join(", ")
Diese Operation schreibt die Werte alle in eine Zeile.
Wie wir daraus wieder Records bekommen, ist in “04 Records aus Feldern mit mehreren Werten erstellen” beschrieben.

Aufgabe 3: Records in Felder mit mehreren Werten auflösen

Da nicht alle Zielprogramme mit einer Record-Struktur klarkommen, müssen diese manchmal auch wieder umgewandelt werden. Eine Möglichkeit sind so genannte “Multi-Value-Fields”, oder Felder mit mehreren Werten. In unserem Beispiel könnte das eine mit Komma separierte Liste aller Berufe sein.

Dafür verwenden wir “Beruf" "Edit cells" "Join multi-valued cells…” und wählen als Trennzeichen eine Zeichenfolge aus Komma und Leerzeichen , . Das Ergebnis der Operation ist in Abbildung 7 gezeigt.

Bildschirmfoto mit der Spalte Beruf als Multi-Value-Fields.
Bildschirmfoto mit der Spalte Beruf als Multi-Value-Fields.

Möchte man die Werte in mehrere Spalten aufteilen, so kann dafür “Beruf" "Edit column" "Split into several columns…” verwendet werden. Das Ergebnis der Operation ist in Abbildung 8 gezeigt.

Bildschirmfoto mit der Spalte Beruf auf mehrere Spalten aufgeteilt.
Bildschirmfoto mit der Spalte Beruf auf mehrere Spalten aufgeteilt.

Aufgabe 4: Records aus Feldern mit mehreren Werten erstellen

Im FDMLab kommt es öfter vor, dass wir Datensätze mit “Multi-Value-Fields”, wie in Abbildung 7, oder die Daten aufgeteilt auf mehrere Spalten, wie in Abbildung 8 bekommen.

Diese wandeln wir dann in Records um, um zum Beispiel die Schreibweise via Clustering zu vereinheitlichen, oder ein gemeinsames Reconciling der Daten durchzuführen.

Dafür machen wir die in “03 Records in Felder mit mehreren Werten auflösen” durchgeführten Änderungen wieder rückgängig, ohne die History-Funktion zu verwenden.

Zuerst fügen wir die Spalten wieder via “Beruf 1" "Edit column" "Join columns…” zusammen. Die Einstellungen sind in Abbildung 9 gezeigt.

Bildschirmfoto des OpenRefine Dialogs zum Zusammenführen von Spalten.
Bildschirmfoto des OpenRefine Dialogs zum Zusammenführen von Spalten.

Anschließend erstellen wir die Record-Struktur via “Beruf" "Edit cells" "Split multi-valued cells…” und wählen als Trennzeichen die gleiche Trennsequenz, wie beim Zusammenfügen der Spalten in Abbildung 9. In unserem Fall also , .

Wir sind nun wieder bei der Record-Struktur wie in Abbildung 4 angekommen.

Aufgabe 5: Records in wiederholende Zeilen auflösen

Manchmal wollen wir von der Record-Struktur auch zu sich wiederholenden Werten in Zeilen wechseln, wie wir es ganz zu Beginn dieses Tutorials in Abbildung 2 gesehen haben.

Wir gehen davon aus, dass wir eine Record-Struktur wie in Abbildung 4 haben. Dort nutzen wir dann das Gegenstück zu “Blank down” via “Name" "Edit cells" "Fill down” .

Um zum “Original” in Abbildung 2 zu kommen, müssten wir die Spalte “Beruf” noch alphabetisch sortieren und ganz nach links verschieben.

Fazit

Mit Records lassen sich interessante Datentransformationen bewerkstelligen. Bei der Aufbereitung von Findbüchern mit OpenRefine haben wir damit zum Beispiel die Inhalte von zweispaltigen Seitenlayouts in einzelne Zeilen umgewandelt.

Zu Beginn ist das Konzept potentiell noch neu und ungewohnt, wer sich jedoch tiefer damit beschäftigt, kann damit Probleme lösen, die man sonst an Programmiersprachen wie Clojure oder Jython in OpenRefine delegieren würde.


Im nächsten Teil behandeln wir das Konzept des Transponierens mit dem wir in OpenRefine ähnliche Probleme behandeln können.

Benjamin Rosemann
Benjamin Rosemann
Data Scientist

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

Ähnliches