Standardisierung der Jahresangaben

Standardisierung der Jahresangaben#

Datensätze wie der Katalog zum Filmarchiv der Filmuniversität sind häufig das Produkt einer jahrzehntelangen Arbeit unterschiedlicher Personen. Darauf wurde bereits im Kapitel zur Datenquelle eingegangen. Es ist daher wenig verwunderlich, dass die Einträge nicht immer einer vollständig kohärenten Systematik folgen. Eine solche ist jedoch für die digitale Auswertung unabdingbar und das Kernziel einer Datensatzbereinigung.

Die Spalte Jahr ist ein gutes Beispiel für das Fehlen eines Systems innerhalb der Einträge:

Das Text Facet der Spalte Jahr

Fig. 4.53 Das Text Facet der Spalte Jahr#

In dieser Spalte sind manche der Jahreszahlen in eckige Klammern eingefasst, andere nicht. Andere wiederum enthalten den Zusatz “ca.” und wurden demnach geschätzt. Besonders bei der Angabe von mehreren Jahren gibt es Unterschiede - sowohl Semikolons als auch Schräg- und Bindestriche finden Verwendung. Die Spalte aufzuteilen, wie im Kapitel zur Bereinigung der Spalten beschrieben, ist damit nicht möglich.

Im Folgenden werden Methoden zur Bereinigung der Einträge eines Datensatzes vorgestellt, die zunächst manueller und dann zunehmend automatischer Natur sind. Falls Sie alle Methoden selbst nachvollziehen möchten macht es ggf. Sinn, von der Undo/Redo Funktion Gebrauch zu machen, um zu einem früheren Stand des Projekts zurückzukehren.

Edit#

Die einfachste Art, Einträge zu bearbeiten ist die Edit Funktion innerhalb des Text Facets.

Der Edit-Button innerhalb des Text Facets

Fig. 4.54 Der Edit-Button innerhalb des Text Facets#

Da im Text Facet identische Einträge zusammengefasst werden, können bei diesem Beispiel - [1989] - die eckigen Klammern bei zwei Einträgen auf einmal bearbeitet werden. Allerdings müssten für jedes weitere Jahr die eckigen Klammern einzeln händisch entfernt werden. Eine solche Vorgehensweise ist nicht nur aufwendig, sondern auch sehr fehleranfällig. Damit lässt sich die Edit Funktion vor allem für Probleme einsetzen, die nur einmalig innerhalb des Datensatzes auftreten und für die sich die folgenden Methoden nicht lohnen bzw. zu aufwändig sind.

Cluster#

Eine Möglichkeit, Einträge effektiver zu bearbeiten, ist deren Zusammenfassung in Cluster. Öffnen Sie das Cluster - Menü über das Text Facet Fenster im linken Teil der Arbeitsoberfläche.

Der Button zum Öffnen des Cluster-Menüs

Fig. 4.55 Der Button zum Öffnen des Cluster-Menüs#

Mittels eines Clustering-Algorithmus erkennt OpenRefine passende Eintrags-Gruppen und schlägt für diese in der Spalte New cell value einen Wert vor.

Das Cluster-Menü

Fig. 4.56 Das Cluster-Menü#

Über die Dropdown-Menüs Method und Keying function kann der Clustering-Algorithmus geändert werden. Grundsätzlich ist es völlig ausreichend, die unterschiedlichen Algorithmen einfach auszuprobieren, ohne deren Funktionsweise im Detail zu verstehen. Falls Sie sich jedoch näher für die Algorithmen interessieren, finden sich weitere Informationen in der OpenRefine Dokumentation.

Sobald Sie einen passenden Algorithmus gefunden haben, können Sie die Einträge, die Sie ändern wollen, in der Spalte Merge? auswählen und im Textfeld New Cell Value den neuen Eintrag festlegen.

In der Spalte Jahr ist das Cluster-Menü besonders für die jene Einträge geeignet, die mehrfache Jahreszahlen enthalten, etwa 1992/93 und 1992-93. Wählen Sie für den neuen Eintrag eine Schreibweise, durch die sich die Einträge leicht in mehrere Spalten aufteilen lassen etwa 1992 ; 1993.

Auswahl eines Clusters

Fig. 4.57 Auswahl eines Cluster#

Nachdem Sie Ihre Änderungen ausgewählt haben, klicken sie auf den Button Merge selected & re-cluster, um von OpenRefine die Einträge entsprechend anpassen und neue Cluster erstellen zu lassen. Sie können nun mit einem neuen Algorithmus versuchen, weitere Cluster dieser Art zu finden – Sie werden allerdings vermutlich ausschließlich Cluster finden, die mehrere unterschiedliche Jahreszahlen enthalten.

Durch die Cluster-Funktion konnten noch nicht alle Einträge in der Spalte Jahr bereinigt werden. Es finden sich noch Angaben, die z.B. Schrägstriche oder den Vermerk “ca.” enthalten. Auf die weitere Bereinigung dieser Einträge gehen wir nach der folgenden Übung zur Cluster-Funktion genauer ein.

Übung

In den Verlagsspalten finden sich unterschiedliche Schreibweisen der selben Unternehmen. Vereinheitlichen Sie diese mittels der Cluster-Funktion.

Zurück zur Bereinigung der Jahresangaben: Durch die Kombination eines Text Facets mit einem Text Filter (siehe Kapitel Sichtung) ist es möglich, alle Einträge in der Spalte Jahr anzeigen zu lassen, die einen Schrägstrich enthalten.

Die Einträge mit einem Schrägstrich innerhalb der Spalte Jahr

Fig. 4.59 Die Einträge mit einem Schrägstrich innerhalb der Spalte Jahr#

Diese Einträge konnten leider mit der Cluster Funktion nicht erfasst werden, da es für sie kein ähnlichen Eintrag vorhanden ist, mit dem sie als sinnvolles Cluster zusammengefasst werden könnten.

GREL#

Die Anzahl an Einträgen mit Schrägstrichen ist überschaubar und ließe sich auch händisch bearbeiten. Stellen Sie sich jedoch einen Datensatz vor, der die hundertfache Anzahl der Filme dieses Datensatzes enthält. Generell sollten während der Bereinigung so wenige händische Änderungen vorgenommen werden wie möglich, um menschliche Fehler zu vermeiden. Das primäre Werkzeug zur automatischen Bereinigung in OpenRefine ist GREL, die General Refine Expression Language.

GREL ist eine an Javascript angelehnte Programmiersprache, die eigens für OpenRefine und die Bereinigung von Datensätzen entwickelt wurde. GREL ist auch für Personen ohne vorherige Programmierkenntnisse leicht verständlich und anwendbar, da keine eigene Programmierumgebung eingerichtet werden muss und GREL-Code typischerweise nur wenige Zeilen umfasst.

Öffnen Sie das Dropdown-Menü einer Spalte, den Reiter Edit cells und Transform…, um das das Menü zur Transformation von Zellen mittels GREL anzuzeigen.

Öffnen des Transform-Menüs

Fig. 4.60 Öffnen des Transform-Menüs#

Das sich nun öffnende Menü ist sehr einfach aufgebaut und Sie müssen neben dem GREL-Code keine Änderungen vornehmen. Den Code geben Sie im Expression Texfeld ein, dessen Größe Sie in der rechten unteren Ecke des Textfelds verändern können.

Das Transform-Menü

Fig. 4.61 Das Transform-Menü#

In der Preview-Anzeige darunter wird die aktuelle Auswahl des Datensatzes angezeigt. Die Änderungen, die durch den GREL-Code stattfinden würden, werden dort automatisch in einer Vorschau aktualisiert, noch bevor Sie diesen final durchführen.

Kombination von Filtern und Code

Im obigen Screenshot können Sie erkennen, dass weiterhin nur Einträge mit einem Schrägstrich angezeigt werden – das Text Facet und der Text Filter sind also weiterhin aktiviert und alle Transformationen werden nur auf diese Auswahl des Datensatzes angewendet.

Nun zu den Grundlagen von GREL. Im Expression Textfeld steht bereits das Wort value, welches die einzelnen Einträge repräsentiert. Der Code wird auf jeden einzelnen Eintrag in der Spalte identisch angewendet. Zwischen den Einträgen und den Spalten untereinander werden keine Verbindungen hergestellt – es sei denn, dass ein solches Verhalten explizit programmiert wird.

Die replace Methode#

Die values können mittels Methoden verändert werden. Eine solche Methode ist etwa replace, mittels derer ein Teil des Eintrags durch einen neuen Text ersetzt werden kann. valueund eine Methode wie replacewerden mit einem Punkt . miteinander verbunden; die Syntax lautet value.replace(). Innerhalb der Klammern einer Methode werden deren Argumente angegeben, sozusagen deren Optionen. replace enthält zwei Argumente: Den zu verändernden Text und den neuen Text. Texte werden in Abgrenzung zu Zahlen durch Anführungszeichen gekennzeichnet, zum Beispiel als "Text". Die Argumente werden mittels Kommata voneinander getrennt. Die vollständige Syntax lautet also value.replace("zu ändernder Text", "neuer Text").

Code Blocks

Der folgende Text enthält einige Code-Beispiele zur Veranschaulichung des Vorgehens und der GREL-Elemente. Wenn Sie möchten, können Sie jedes der Beispiele auch in ihrem eigenen Projekt ausprobieren. Selbst anwenden müssen sie allerdings nur den vollständigen Code, der in einem Code Block außerhalb des Fließtextes angezeigt wird. Ein Code Block sieht folgendermaßen aus:

Code Block

Wenn sie mit dem Mauszeiger auf den Codeblock zeigen, erscheint in der rechten oberen Ecke die Anzeige Copy to clipboard. Mit einem Klick auf diese Anzeige können Sie den Code in die Zwischenablage kopieren und in ihr OpenRefine-Projekt einfügen.

In obigen Beispiel sollen die Schrägstriche zwischen den Jahren durch ein anderes Sonderzeichen wie ein Semikolon mit Leerzeichen ersetzt werden. Der dafür zu verwendende Code lautet value.replace("/", " ; ").

Anwendung des Codes value.replace("/", " ; ")

Fig. 4.62 Anwendung des Codes value.replace("/", " ; ")#

Im Preview-Fenster ist zu sehen, wie die Einträge verändert und die Schrägstriche ersetzt werden. Allerdings zeigt sich ein Problem: Bei vielen der Einträge wurde die Jahrhundert-Angabe des zweiten Jahres abgekürzt, nach dem Schema 1995/96. Wird der Code auf solche Einträge angewendet, fehlt z.B. die 19 vor der 96. Insgesamt gibt es vier Kategorien, in die sich die Eintragungen einordnen lassen:

  1. Zwei Jahre aus den 90ern, vollständig ausgeschrieben: 1997/1998.

  2. Zwei Jahre aus den 90ern und 2000ern, vollständig ausgeschrieben: 1999/2007.

  3. Zwei Jahre aus den 90ern, abgekürzt: 1997/98.

  4. Zwei Jahre mit mindestens einem Jahr aus den 80ern, abgekürzt: 1985/86.

Um dieses Problem zu lösen, müssen für jede dieser Kategorien passende Argumente der replace-Methode gefunden werden.

Eine Möglichkeit ist es, neben dem Schrägstrich auch einen Teil des Jahres zu ersetzten und anschließend den fehlenden Teil des Jahres hinzuzufügen. Widmen wir uns den Kategorien in absteigender Reihenfolge ist der Anfang des Codes value.replace("/8", " ; 198").

Anwendung des Codes value.replace("/8", " ; 198")

Fig. 4.63 Anwendung des Codes value.replace("/8", " ; 198")#

Da nur Einträge der Kategorie vier die Zeichenfolge /8 enthalten, wurden auch nur diese bearbeitet, etwa der oben rot unterstrichene Eintrag. Auf dieselbe Weise kann für die Kategorie 3 verfahren werden und glücklicherweise lassen sich mehrere Methoden einfach hintereinander reihen, die nacheinander ausgeführt werden: value.replace("/8", " ; 198").replace("/9", " ; 199"). Die übrigen Kategorien 1 & 2 können nun mit den Code-Schnipsel vom Anfang bereinigt werden, da das Problem der abgekürzten Jahreszahlen bereits gelöst ist. Der vollständige Code lautet

value.replace("/8", " ; 198")
.replace("/9", " ; 199")
.replace("/", " ; ")
Anwendung des Codes value.replace("/8", " ; 198").replace("/9", " ; 199").replace("/", " ; ")

Fig. 4.64 Anwendung des Codes value.replace("/8", " ; 198").replace("/9", " ; 199").replace("/", " ; ")#

Damit sind alle Schrägstriche erfolgreich ersetzt! Entfernen Sie ggf. den zuvor eingestellten Text Filter, um wieder alle Einträge sehen zu können.

Hinweis

Falls Sie die Ausführungen zur Bereinigung der Jahreszahlen weiter selbst am Datensatz nachvollziehen möchten, müssen Sie die folgenden Übungen absolvieren. Die in den Übungen durchgeführten Bereinigungsschritte sind Teil des weiteren Bereinigungsprozesses.

Übung

Die Spalte Jahr enthält noch Einträge mit Bindestrich, z.B. 1993-1995. Adaptieren Sie den vorherigen Code, um auch die Bindestriche durch ein Semikolon und Leerzeichen ; zu ersetzen. Nutzen Sie dabei ein Text Facet und einen Text Filter, um sich sich die relevanten Einträge anzeigen zu lassen.

Übung

Entfernen Sie die eckigen Klammern, die einige der Einträge in der Spalte Jahr einrahmen.

Die contains Methode#

Die Spalte Jahr ist beinahe vollständig bereinigt. Ein Problem verhindert jedoch weiterhin, die Einträge in Jahr auf mehrere Spalten aufzuteilen und numerisch auszuwerten: Die ca. Angaben einiger Einträge.

Die Einträge mit einem "ca." innerhalb der Spalte Jahr

Fig. 4.65 Die Einträge mit einem ca. innerhalb der Spalte Jahr#

Achtung

Entfernen Sie diesen Filter wieder, bevor Sie den folgenden Code anwenden.

Wie können diese Einträge in Zahlen umgewandelt werden, ohne die ca. Angabe einfach zu entfernen? Die Lösung liegt im Anlegen einer neuen Spalte, in die die ca. Angabe übertragen wird.

Eine interessante Methode für dieses Ziel ist contains. contains gibt darüber Auskunft, ob ein Eintrag das Argument der Methode enthält oder nicht. Wird der Code value.contains("Hallo") auf den Eintrag “Hallo Welt” angewendet, ist das Ergebnis true, bei dem Eintrag “Welt” hingegen false. true und false sind dabei nicht einfache Texte, sondern Boolean Werte. Boolean, benannt nach George Boole, ist der grundlegende Datentyp in der Programmierung – ein Wert kann entweder wahr oder falsch sein, true oder false.

Wird value.contains("ca.") im Transform-Menü angewandt, werden alle Einträge durch true oder false ersetzt.

Anwendung des Codes value.contains("ca.")

Fig. 4.66 Anwendung des Codes value.contains("ca.")#

Das ist natürlich nicht das erwünschte Ergebnis. Stattdessen soll eine neue Spalte auf der Grundlage der Spalte Jahr erstellt werden, die dann wie Werte true oder false enthält. Die passende Funktion findet sich im Dropdown-Menü der entsprechenden Spalte: Im Reiter Edit columns klicken Sie auf Add column based on this column….

Öffnen des Menüs zur Erstellung einer neuen Spalte

Fig. 4.67 Öffnen des Menüs zur Erstellung einer neuen Spalte#

In diesem Menü kann ebenfalls GREL-Code angewendet werden, allerdings wird das Ergebnis auf eine neue Spalte übertragen, anstatt die Einträge der Spalte zu ersetzen. Wenden Sie die vorherigen Code value.contains("ca.") an und wählen Sie einen sinnvollen Namen für die neue Spalte im Feld New column name, wie z.B. Jahr_Schätzung. Achten Sie darauf, dass Sie vor der Anwendung des GREL-Codes den Text filter für “ca.” in der Spalte Jahr deaktiviert haben. Bleibt dieser aktiv, erhält die neue Spalte lediglich die true, nicht jedoch die false-Werte.

value.contains("ca.")
Anwendung des Codes value.contains("ca.") zur Erstellung einer neuen Spalte Jahr_Schätzung

Fig. 4.68 Anwendung des Codes value.contains("ca.") zur Erstellung einer neuen Spalte Jahr_Schätzung#

Nach der Erstellung der neuen Spalte können die ca.-Angaben in der Spalte Jahr mit dem folgenden Code entfernt werden:

value.replace("ca. ", "")

Wichtig ist dabei, auch das Leerzeichen nach dem ca. zu entfernen.

Nun kann die Spalte Jahr endlich über das Split into several columns…-Menü in mehrere Spalten mit jeweils einer Jahresangabe aufgeteilt werden (siehe Bereinigung der Spalten). Als Trennzeichen dient dabei das Semikolon eingerahmnt von Leerzeichen: ;. Wählen Sie die Option Guess cell type aus, wird OpenRefine automatisch die Einträge in den neuen Spalten als Zahlen erkennen (siehe Aufteilung von Spalten).

Öffnen des Menüs zum Aufteilen von Spalten

Fig. 4.69 Öffnen des Menüs zum Aufteilen von Spalten#

Das Menüs zum Aufteilen von Spalten

Fig. 4.70 Das Menüs zum Aufteilen von Spalten#

Das Endergebnis der Bereinigung der Spalte Jahr

Fig. 4.71 Das Endergebnis der Bereinigung der Spalte Jahr#

Zum Ende der Bereinigung einer Spalte lohnt es sich, das Ergebnis noch einmal mittels eines Facets zu überprüfen. Für die Spalte Jahr 1 fällt auf, dass ein Eintrag noch ein zweites Jahr in runden Klammern enthält:

Ein letzter fehlerhafter Eintrag

Fig. 4.72 Ein letzter fehlerhafter Eintrag#

Mit einem Klick auf den Eintrag wird Ihnen die entsprechende Zeile angezeigt. Dort können Sie nun die einzelnen Zellen mit einem Klick auf den edit-Button bearbeiten und den Eintrag so händisch bereinigen.

Die händische Bereinigung von Zellen

Fig. 4.73 Die händische Bereinigung von Zellen#

Ersetzten Sie in einem letzten Schritt erneut die Leerzeichen in den Namen der neuen Jahresspalten durch Unterstriche.

Übung

Die Spalte Stichwort konnte bisher nicht aufgeteilt werden, da sie mehrere Trennzeichen enthält. Nutzen Sie die Methoden aus diesem Kapitel, um die Trennzeichen zu vereinheitlichen und die Spalte anschließend aufzuteilen.