Usecase: Reconciling von Geodaten

openrefine

HistHub befasst sich in einer Blogserie mit der Aufbereitung und Anreicherung von Daten in Openrefine. Der heutige Beitrag widmet sich einem konkreten Anwendungsfall. Im Folgenden werden wir beschreiben, wie wir für die Vernetzung der Geodaten verschiedener Provider vorgegangen sind.

Probleme

Bei einem grossen, heterogenen Datensatz, in unserem Beispiel ist das eine Liste von geografischen Bezeichnungen, bestehend aus Ländern und Orten, aber auch Gebirgen oder Gewässern, ergeben sich bei der Reconciliation mit Wikidata zwei Probleme:

  • Die Daten mit einem spezifischen Wikidata Identifier (Q-ID) abzugleichen bringt nur wenige automatische Matches und keine oder kaum Vorschläge für ungematchte Daten.
  • Wenn man die geografischen Bezeichnungen gegen eine zu allgemeine Q-ID reconciled, erhält man zwar viele Vorschläge, aber kaum automatische Matches. In beiden Fällen müssten die restlichen Bezeichnungen von Hand gematched werden.

Lösung

Diese Probleme lassen sich teilweise lösen, indem man den Datensatz mehrmals reconciled, jeweils gegen eine genauere Q-ID. Es wird also über die Q-ID jeweils ein spezifischer Teil der Daten in unserer Tabelle angesprochen, bis am Schluss ein möglichst kleiner Rest übrig bleibt, der von Hand verlesen werden muss.

In diesem Beispiel wollen wir 12000 geografische Bezeichnungen mit Wikidata reconcilen. Es ergibt Sinn, den Datensatz in kleinere Stücke zu unterteilen, da die Reconciliation gerade bei grossen Datensätzen lange dauern kann (OpenRefine schafft ca. drei Zeilen bzw. Bezeichnungen pro Sekunde). Die Tabelle wird dafür in überschaubare «Päckchen» unterteilt, die jeweils in ein eigenes OpenRefine-Projekt überführt werden. An diesen Päckchen kann parallel (in mehreren offen Tabs) gearbeitet werden. In diesem Beispiel wurde mit Päckchen à 1000 Zeilen gearbeitet.

Zunächst die entsprechende gegen Wikidata reconcilen («no particular type»). Dabei wurden von 1000 lediglich 210 automatisch gematched. Für alle anderen war der Filter zu grob, die Q-ID also zu unpräzis. Jedoch haben wir jede Menge Vorschläge. Wir wählen über die Facette «by judgment» (nach der Reconciliation erscheint diese bereits automatisch auf der linken Seite) zuerst die «matched» aus und erstellen aus ihr eine neue Spalte («add column based on this column») und geben im Textfeld diesen Befehl ein:

cell.recon.match.id

und nennen die Spalte z.B. «NameQ». Damit haben wir die Q-Nummern der automatisch gematcheten Einträge in der neuen Spalte gesichert.

Nun wählen wir in der Facette die «none» an. Mit diesen Einträgen erstellen wir erneut eine neue Spalte, jedoch ohne den Command (nur «value» im Textfeld) und mit dem Namen der nächsten Q-ID. Dagegen wollen wir die übrigen 790 geografischen Bezeichnungen, welche nun in dieser Spalte sind, reconilen.

In unserem Beispiel nehmen wir nun «political entity» (Q16562419), mit der Absicht, dass Länder und Regionen darunter fallen und gematched werden. Es wurden nun weitere 242 gematched. Nun wird wiederholt aus den «matched» eine neue Spalte erstellt, welche den Befehl

cell.recon.match.id

enthält und den Namen «political entityQ» trägt. Aus den «none» in der Reconciling-Facette wird wieder eine Spalte erstellt, wie oben beschrieben. Die restlichen 548 können durch Wiederholen dieser Schritte mit jeweils auf möglichst viele Einträge passenden Q-IDs weiter reduziert werden.

Dafür ist es gut zu wissen, welche Typen von Daten im Datensatz häufiger vorkommen. Es empfiehlt sich, nach jeder Reconciliation zu schauen, welche Daten übrig bleiben, oder weshalb sie nicht automatisch gematched wurden. In unserem Beispiel fällt z.B. auf, dass u.a. die Bezeichnung «Zürich (Stadt)» die Stadt Zürich, den Kanton Zürich und den Flughafen Zürich als Vorschlag hat. Also reconcilen wir gegen die Q-ID «human settlement» (Q486972) oder «city» (Q515).

Wenn möglich wollen wir immer möglichst viele Bezeichnungen abdecken. Finden sich im Datensatz viele Gewässer, lohnt sich eine Reconciliation gegen die jeweiligen Q-ID von Meeren, Flüssen, Seen, oder allgemein Gewässern. Je nach Datensatz lässt sich der nicht automatische gematchte Rest auf 10-40% der anfänglichen Daten reduzieren. Dieser muss noch von Hand gematched werden. Dazu nochmals die «none» auswählen und daraus eine neue Spalte erstellen, diese gegen «no particular type» matchen. So erhalten wir nochmals die grösstmögliche Auswahl an Vorschlägen. Nach dem dieser Rest so gut wie möglich gematched wurde, aus den «matched» eine neue Zeile mit der Q-ID erstellen.

Für die nächsten Schritte gibt es verschiedene Optionen. OpenRefine ist nicht ideal dafür, Informationen aus verschiedenen Spalten zusammen zu fügen. Deshalb zeigen wir eine Variante, bei der die Tabellen in Excel weiter bearbeitet werden, und danach die Möglichkeiten, die OpenRefine dafür bietet.

Variante Excel

Für den nächsten Schritt müssen wir das Projekt als Excel-Datei exportieren und in Excel öffnen. Dort wollen wir die vielen Q-Spalten zusammenführen. Die vielen Spalten mit den geografischen Bezeichnungen können wir dort bis auf die ursprüngliche löschen. Nun die Q-Spalten jeweils kopieren und über die Funktion «Inhalte einfügen» (Rechtsklick auf die 1. Q-Spalte>Inhalte einfügen). Wichtig ist, dass das Häkchen bei Leerzellen gesetzt wurde. Die kopierte Spalte kann gelöscht werden.

Blogbeitrag-OpenRefine_Inhalte-einfügen_gif

Wichtig ist, dass in einer Spalte alle Q-IDs sind und in der anderen die dazugehörigen geografischen Bezeichnungen. Nachdem nun alle Q-Spalten in eine zusammengefasst wurden, können wir die .xls-Datei als OpenRefine Projekt importieren. Die Q-ID-Spalte lässt sich jetzt gegen «Wikidata identifier» (Q43649390) reconcilien. Schliesslich haben wir eine Spalte, über die man nun Properties von Wikidata holen kann (z.B. Koordinaten), wie im letzten Blogbeitrag beschrieben.

Variante OpenRefine

In OpenRefine lassen sich die Inhalte von Spalten mit folgendem Befehl verbinden:

cells["Column 1"].value + " " + cells["Column 2"].value

Das Problem bei dem Befehl ist, dass er nicht mit leeren Feldern umgehen kann. Das heisst, zuerst müssen die leeren Zellen mit einem Leerschlag ersetzt werden (alle Spalten, die zusammengefügt werden sollen, facettieren. Bei jeder den Wert «(blank)» mit einem Leerschlag ersetzen). Dann obigen Befehl ausführen, und zwar auf einer der zu verbindenden Spalten (egal welche), über Edit cells – Transform. Danach unbedingt noch Collapse consecutive Whitespace und Trim leading and trailing whitespace aus dem Zellenmenü «Common Transforms» ausführen.

Anregungen, Fragen oder Kommentare zu histHub oder OpenRefine nehmen wir gerne per Mail entgegen.