GREL

HistHub befasst sich in einer Blogserie mit der Aufbereitung und Anreicherung von Daten in OpenRefine. Alle Beiträge der Serie werden in einer Übersicht gesammelt.

Bereits in früheren Beiträgen sind wir auf die General Refine Expression Language, kurz GREL, gestossen. Befehle an OpenRefine werden in GREL formuliert, es ist jedoch auch möglich andere Sprachen (Python/Jython oder Clojure) zu verwenden. In diesem Beitrag werden wir uns mit GREL befassen, um eigene Befehle formulieren zu können.

Verwendung von GREL

GREL kann sowohl zum Bearbeiten von Zelleninhalten als auch zum Facettieren verwendet werden. Die Sprache funktioniert gleich, egal ob Inhalte gesucht oder geändert werden.

Immer zu beachten ist, dass GREL-Befehle nur über die aktuell gefilterten oder facettierten Einträge und Zeilen ausgeführt werden. Ist also bereits eine Facette aktiv, werden die dadurch «versteckten» Einträge von dem Befehl nicht betroffen. Ebenfalls wichtig ist, dass GREL case-sensitive ist.

Facettieren mit GREL

Bei einer Spalte kann über «Facet» –> «Custom Text facet» ein GREL-Bearbeitungsfenster aufgerufen werden.

Zu Übungszwecken ist diese Art GREL zu verwenden praktisch, weil keine Daten verändert werden.

Das selbe Fenster kann auch bei einer bereits in der linken Seitenleiste angezeigten Facette aufgerufen werden, indem bei der Facette oben rechts auf «change» geklickt wird.

Bearbeiten mit GREL

Häufiger als zum Facettieren wird GREL zum Bearbeiten von Zelleninhalten und Spalten verwendet. Sowohl beim Hinzufügen einer Spalte (Spaltenmenü -> «Edit column» –> «Add column based on this column») als auch beim Bearbeiten aller Zellen in einer Spalte (Spaltenmenü -> «Edit cells» –> «Transform») wird ein GREL-Bearbeitungsfenster geöffnet:

Der Aufbau von GREL

OpenRefine funktioniert sehr stark über Spalten. Befehle werden mithilfe von Variablen auf eine ganze Spalte (oder Zeile) angewendet, wobei auch andere Spalten miteinbezogen werden können.

In einem GREL-Befehl wird die Variable definiert, die über einen Punkt abgetrennt noch genauer spezifiziert werden kann. Daran werden Funktionen angehängt.

Variablen

Es gibt in GREL verschiedene Variablen:

  • value: der Wert in einer (jeder) Zelle der Spalte, über die der GREL-Befehl angewendet wird.
  • row: eine Zeile mit einer oder mehreren Zellen.
  • cells: alle Zellen der aktuellen Zeile.
  • cell: die Zelle in der Spalte, über die der Befehl ausgeführt wird. Für «cell» gibt es die beiden Ausprägungen:
    • cell.value: der Wert in der Zelle.
    • cell.recon: das Ergebnis des Reconciling für die Zelle.
  • recon: wird in Zusammenhang mit dem Reconciling, also dem Abgleich mit einer online verfügbaren Ressource wie z.B. Wikidata, verwendet. Dazu gibt es einen eigenen Beitrag.
  • record: ein «record» ist ein Zusammenschluss von einer oder mehr Zeilen. Zur Differenzierung von «row» und «record» und wie sie erstellt werden, haben wir einen eigenen Beitrag publiziert.

Genauere Beschreibungen der Variablen gibt es im Wiki zu OpenRefine.

Funktionen

GREL-Funktionen gibt es viele, im GREL-Bearbeitungsfenster ist unter «Help» eine Liste zu finden, in der die Funktionen erklärt werden. Deshalb gehen wir hier nicht vertieft darauf ein, welche Funktion was macht.

In OpenRefine sind die Funktionen alphabetisch geordnet. Thematisch geordnet und ausführlicher erklärt sind die Funktionen im Wiki. Dort sind sie zuerst inhaltlich unterteilt. Suchen wir beispielsweise eine Funktion für einen String, also einen Text, wählen wir die entsprechende Seite.

Befehle können auf verschiedene Arten aufgebaut werden:

  • zuerst die Funktion, also z.B.
    replace(WERT, "suchen nach", "ersetzen mit")
    «WERT» kann hier auch eine andere Spalte sein auf die mit
    cells["columnname"].value

    verwiesen wird.

  • zuerst der Ort, wo die Funktion angewendet wird, also z.B.
    value.replace("suchen nach", "ersetzen mit")

    Value wendet die Funktion auf die aktuelle Spalte an, auch hier kann mit

    cells["columnname"].value

    auf eine andere Spalte verwiesen werden.
    Vorteil dieser Variante ist, dass mehrere Funktionen aneinander gehängt werden können. Es können z. B. alle «:» mit «» ersetzt werden und danach noch Leerschläge am Anfang oder Ende entfernt werden:

    value.replace("suchen nach", "ersetzen mit").trim()

Controls sehen aus wie Funktionen. Controls ermöglichen Loops und Branches, also «wenn X dann Y sonst Z» Konstruktionen.

Arbeiten mit GREL

GREL-Befehle lassen sich mit der integrierten Hilfe zusammenstellen. Oft finden sich in Anleitungen, wie sie auch in diesem Blog publiziert werden, fertig formulierte Beispiele, in denen nur noch die Namen der Spalten für das eigene Projekt angepasst werden müssen.

OpenRefine bietet einige eingebaute Hilfen an. So wird bereits beim Eingeben die Syntax überprüft. Hat sich ein Fehler eingeschlichen, der der Grammatik von GREL widerspricht, wird dies rechts vom Eingabefenster gemeldet. Im Tab «Preview» wird angezeigt, was der Befehl mit den Inhalten der Spalte machen wird. So kann direkt überprüft werden, ob das Resultat den Erwartungen entspricht. Im Tab «History» sind die bisher verwendeten Befehle aufgelistet, sowohl aus dem aktuell offenen Projekt als auch aus anderen Projekten. Da diese Liste schnell unübersichtlich wird, bietet OpenRefine die Möglichkeit, Befehle mit einem Stern zu versehen. Diese werden dann im Tab «Starred» aufgelistet. Häufig genutzte Befehle können so leicht wieder abgerufen werden, und das über Projekte hinweg.

Fragen, Anregungen oder Wünsche zu histHub oder zur Blogserie zu OpenRefine nehmen wir gerne per Mail entgegen.