<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tutorial | FDMLab@LABW</title><link>https://fdmlab.landesarchiv-bw.de/tag/tutorial/</link><atom:link href="https://fdmlab.landesarchiv-bw.de/tag/tutorial/index.xml" rel="self" type="application/rss+xml"/><description>Tutorial</description><generator>Wowchemy (https://wowchemy.com)</generator><language>de-de</language><lastBuildDate>Wed, 14 May 2025 00:00:00 +0000</lastBuildDate><image><url>https://fdmlab.landesarchiv-bw.de/media/sharing.jpg</url><title>Tutorial</title><link>https://fdmlab.landesarchiv-bw.de/tag/tutorial/</link></image><item><title>Workshop - Python in OpenRefine</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/20-python-mit-openrefine/</link><pubDate>Wed, 14 May 2025 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/20-python-mit-openrefine/</guid><description>&lt;p>Wir verwenden Python zusammen mit OpenRefine.&lt;/p>
&lt;blockquote>
&lt;p>Jython in der &lt;a href="https://openrefine.org/docs/manual/jythonclojure#jython" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;br>
Einsteiger Workshop &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/">19 Daten mit OpenRefine clustern&lt;/a>.&lt;br>
Blogbeitrag &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-08-ner-mit-openrefine-und-spacy/">Named Entity Recognition mit OpenRefine und spaCy&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;div class="alert alert-warning">
&lt;div>
Die in diesem Tutorial behandelten Funktionen sind teilweise erst verfügbar seit der Version OpenRefine &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;/div>
&lt;h2 id="jython">Jython&lt;/h2>
&lt;p>Quasi überall, wo man in OpenRefine GREL-Expressions schreiben kann, kann man stattdessen auch auf Jython umstellen.
Also beispielsweise für den
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/">Transformations-Dialog&lt;/a>,
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/">Facets&lt;/a> oder neu auch für
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/">eigene Clustering Methoden&lt;/a>.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-transformations-dialogs-mit-jython">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Transformations Dialogs mit Jython." srcset="
/workshop/openrefine-fortgeschrittene/20-python-mit-openrefine/screenshot-openrefine-transform-with-jython_hu0d55e479ad7a3691a7fe4df239345fc3_13960_8a8daaf36e58895df4e2bb5849538213.webp 400w,
/workshop/openrefine-fortgeschrittene/20-python-mit-openrefine/screenshot-openrefine-transform-with-jython_hu0d55e479ad7a3691a7fe4df239345fc3_13960_c46dff229eb7cc4e0469107a1fc091c1.webp 760w,
/workshop/openrefine-fortgeschrittene/20-python-mit-openrefine/screenshot-openrefine-transform-with-jython_hu0d55e479ad7a3691a7fe4df239345fc3_13960_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/20-python-mit-openrefine/screenshot-openrefine-transform-with-jython_hu0d55e479ad7a3691a7fe4df239345fc3_13960_8a8daaf36e58895df4e2bb5849538213.webp"
width="530"
height="162"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Transformations Dialogs mit Jython.
&lt;/figcaption>&lt;/figure>
&lt;p>Praktisch wird das Jython-Snippet, welches man wie in Abbildung 1 gezeigt im Dialog eingibt, in eine Python-Funktion gepackt und dann von Jython ausgeführt.
Daher benötigt man im Unterschied zu GREL ein &lt;code>return&lt;/code> Statement, um anzugeben, welcher Wert zurückgegeben wird.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">some_fun_name&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cell&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cells&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">rowIndex&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">value1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">value2&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das eingegebene Snippet wird quasi anstelle von &lt;code>...&lt;/code> eingesetzt.&lt;/p>
&lt;p>Zu den in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/#variablen">GREL zur Verfügung stehenden Variablen&lt;/a> haben wir schon einiges geschrieben. Diese stehen mit Ausnahmen in Jython unter OpenRefine ebenfalls zur Verfügung.
Beispielsweise fehlt die Variable &lt;code>columnName&lt;/code> mit dem aktuellen Spaltennamen.&lt;/p>
&lt;p>&lt;a href="https://www.jython.org/" target="_blank" rel="noopener">Jython&lt;/a> selbst ist eine Java Implementierung von Python.
Das bedeutet, dass es innerhalb von Java interpretiert wird und man auch von Jython Code aus auf verfügbare Java Methoden zugreifen kann.&lt;/p>
&lt;p>Leider hat das Projekt den Sprung auf Python 3 nicht geschafft und unterstützt daher nur die Funktionalität von &lt;a href="https://docs.python.org/2.7/" target="_blank" rel="noopener">Python 2.7&lt;/a>.
Das macht auch die &lt;a href="https://github.com/OpenRefine/OpenRefine/wiki/Extending-Jython-with-pypi-modules" target="_blank" rel="noopener">Verwendung von externen Python Bibliotheken&lt;/a> innerhalb von Jython deutlich komplexer.&lt;/p>
&lt;p>Es gibt nur noch selten Python Bibliotheken, die Python 2.7 unterstützen.
Und es können auch nur Python Bibliotheken verwendet werden, die komplett in Python geschrieben wurden.
Einige gerade sehr beliebte Python Projekte verwenden aus Performance Gründen unter der Haube kompilierte Programmiersprachen wie &lt;a href="https://www.c-language.org/" target="_blank" rel="noopener">C&lt;/a>, &lt;a href="https://fortran-lang.org/" target="_blank" rel="noopener">Fortran&lt;/a> oder &lt;a href="https://www.rust-lang.org/" target="_blank" rel="noopener">Rust&lt;/a>.
Diese können unter Jython &lt;strong>nicht&lt;/strong> direkt verwendet werden.&lt;/p>
&lt;p>Praktisch ist die Ausführung von Jython Code in OpenRefine auch deutlich langsamer, als z.B. GREL oder Clojure Code.
Das macht es eher schwierig komplexere Algorithmen z.B. für das Clustering direkt zu hinterlegen.&lt;/p>
&lt;p>Alternativ kann von OpenRefine aus, via Jython auf externen Python Code zugegriffen werden, was im folgenden Teil vertieft wird.&lt;/p>
&lt;h2 id="python">Python&lt;/h2>
&lt;h3 id="standard-setup">Standard Setup&lt;/h3>
&lt;p>Wir verfolgen die Idee von OpenRefine aus auf Python Code zuzugreifen, der &lt;strong>nicht&lt;/strong> innerhalb von Jython ausgeführt wird.
Dafür benötigen wir einen Blick in das Python Projekt Setup.&lt;/p>
&lt;div class="mermaid">---
title: Python Setup
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph web[fas:fa-globe Web]
subgraph python[fab:fa-python Python]
python_3_12[fab:fa-python 3.12]
python_3_13[fab:fa-python 3.13]
end
subgraph packages[fas:fa-folder-tree Packages]
typer_0_15[Typer 0.15]
fastapi_0_115[FastAPI 0.115]
spacy_3_8[spaCy 3.8]
my_project_0_1[My Project 0.1]
end
end
subgraph laptop[fas:fa-laptop Laptop]
subgraph local_python[fab:fa-python Python]
local_python_3_12[fab:fa-python 3.12]
local_python_3_13[fab:fa-python 3.13]
end
subgraph local_packages[fas:fa-folder-tree Packages]
local_typer_0_15[Typer 0.15]
local_fastapi_0_115[FastAPI 0.115]
subgraph local_spacy_3_8[spaCy 3.8]
c_code[fab:fa-c Code]
compiled_c_code[fab:fa-c compiled]
end
end
subgraph my_project[My Project]
subgraph venv[fas:fa-folder-open venv]
venv_python_3_12[fab:fa-python 3.12]
venv_typer_0_15[Typer 0.15]
venv_fastapi_0_115[FastAPI 0.115]
venv_spacy_3_8[spaCy 3.8]
end
package_my_project[My Project]
end
end
python --(1)--> local_python
python_3_12 ~~~ local_python_3_12
python_3_13 ~~~ local_python_3_13
packages --(2)--> local_packages
typer_0_15 ~~~ local_typer_0_15
fastapi_0_115 ~~~ local_fastapi_0_115
spacy_3_8 ~~~ local_spacy_3_8
c_code --(3)--> compiled_c_code
local_python_3_12 --(4)--> venv_python_3_12
local_typer_0_15 --(4)--> venv_typer_0_15
local_fastapi_0_115 --(4)--> venv_fastapi_0_115
local_spacy_3_8 --(4)--> venv_spacy_3_8
my_project_0_1 ~~~ package_my_project
package_my_project --(5)--> my_project_0_1
&lt;/div>
&lt;p>Für ein typisches Python Projekt benötigt man fünf Schritte, die durch verschiedene Tools in unterschiedlichem Ausmaß unterstützt werden.&lt;/p>
&lt;h4 id="schritt-1-python-interpreter">Schritt 1: Python Interpreter&lt;/h4>
&lt;p>Zuerst benötigt man einen Python Interpreter, der es ermöglicht Python Code auf dem eigenen Rechner auszuführen.
Zur Verwaltung verschiedener Python Versionen auf dem Rechner gibt es zum Beispiel das Projekt &lt;a href="https://github.com/pyenv/pyenv" target="_blank" rel="noopener">pyenv&lt;/a>.&lt;/p>
&lt;h4 id="schritt-2-dependency-management">Schritt 2: Dependency Management&lt;/h4>
&lt;p>Üblicherweise werden verschiedene externe Bibliotheken benötigt.
Diese stehen zum Beispiel im &lt;a href="https://pypi.org/" target="_blank" rel="noopener">Python Package Index (PyPI)&lt;/a> zur Verfügung und können mit &lt;a href="https://pip.pypa.io/" target="_blank" rel="noopener">pip&lt;/a> verwaltet werden.&lt;/p>
&lt;p>Alternativen zur Verwaltung der Abhängigkeiten sind &lt;a href="https://python-poetry.org/" target="_blank" rel="noopener">Poetry&lt;/a>, &lt;a href="https://pip-tools.readthedocs.io/" target="_blank" rel="noopener">pip-tools&lt;/a> und &lt;a href="https://pipx.pypa.io/" target="_blank" rel="noopener">pipx&lt;/a>.&lt;/p>
&lt;h4 id="schritt-3-compiler">Schritt 3: Compiler&lt;/h4>
&lt;p>Wie schon angesprochen beinhalten manche Python Projekte nicht nur Python Code, sondern auch Code in kompilierten Sprachen.
Wenn für die von euch verwendete Kombination aus CPU und Betriebssystem (noch) kein kompiliertes Binärpaket für die Bibliothek zur Verfügung steht, dann muss das Paket ggf. auf eurem Rechner kompiliert werden.
Dafür werden entsprechende Compiler und Entwicklungspakete auf dem Rechner benötigt.&lt;/p>
&lt;p>Alternativ gibt es auf &lt;a href="https://conda-forge.org/" target="_blank" rel="noopener">conda-forge&lt;/a> eine Sammlung schon kompilierter Pakete.&lt;/p>
&lt;h4 id="schritt-4-virtuelle-umgebung">Schritt 4: Virtuelle Umgebung&lt;/h4>
&lt;p>Erfahrungsgemäß bleibt es nicht bei einem Python Projekt auf dem eigenen Rechner.
Um Konflikte zwischen den Python Versionen und/oder Abhängigkeiten zu vermeiden, ist es üblich für jedes Projekt eine eigene virtuelle Umgebung anzulegen.&lt;/p>
&lt;p>Dafür gibt es das Werkzeug &lt;a href="https://docs.python.org/3/library/venv.html" target="_blank" rel="noopener">venv&lt;/a>, welches früher ein separates Paket war, und seit Python 3.3 in den Standard übernommen wurde.&lt;/p>
&lt;h4 id="schritt-5-package-und-release-management">Schritt 5: Package und Release Management&lt;/h4>
&lt;p>Möchte man das Projekt anschließend für andere z.B. im &lt;em>Python Package Index&lt;/em> zur Verfügung stellen, dann muss es davor noch in das passende Paketformat umgewandelt werden.
Da das für die Benutzung mit OpenRefine nicht relevant ist, wird dieser Schritt hier nicht vertieft.&lt;/p>
&lt;h2 id="uv">uv&lt;/h2>
&lt;p>Das oben beschriebene Setup klingt recht kompliziert und daher abschreckend gerade für kleinere Experimente.
Spätestens seit 2025 setzt sich bei Python Entwicklern hier das Projekt &lt;a href="https://docs.astral.sh/uv/" target="_blank" rel="noopener">uv&lt;/a> durch, welches die Schritte 1, 2, 4 und 5 in einem Werkzeug vereint und das Python Setup dadurch deutlich vereinfacht.&lt;/p>
&lt;p>Für die &lt;a href="https://docs.astral.sh/uv/getting-started/installation/" target="_blank" rel="noopener">Installation von uv&lt;/a> werden mehrere einfache und direkte Wege beschrieben.&lt;/p>
&lt;div class="alert alert-info">
&lt;div>
Sollte man mit dem &lt;em>Windows-Subsystem for Linux&lt;/em> (WSL) arbeiten, dann benötigt man die Installationsanleitung für Linux, auch wenn man Windows als Betriebssystem hat.
&lt;/div>
&lt;/div>
&lt;p>&lt;strong>uv&lt;/strong> hat (quasi) drei für uns relevante Modi:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>uvx&lt;/strong> zum Ausführen von Tools.&lt;/li>
&lt;li>&lt;strong>uv run&lt;/strong> zum Ausführen von Skripten.&lt;/li>
&lt;li>&lt;strong>uv&lt;/strong> zum Arbeiten mit Projekten&lt;br>
(mehrere abhängige Python Dateien, separates Dependency Management).&lt;/li>
&lt;/ul>
&lt;p>Wir konzentrieren uns in dieser Anleitung auf die ersten beiden.&lt;/p>
&lt;h2 id="reconciliation-service">Reconciliation Service&lt;/h2>
&lt;p>Um die Verwendung von &lt;em>uvx&lt;/em> zum Ausführen von externen Python Werkzeugen zu demonstrieren, erstellen wir einen eigenen &lt;em>Reconciliation Service&lt;/em> basierend auf einer CSV-Datei mit &lt;em>uvx&lt;/em> und &lt;a href="https://github.com/gitonthescene/csv-reconcile" target="_blank" rel="noopener">csv-reconcile&lt;/a>.
Zum Herunterladen der CSV-Datei von &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/">12 Daten zwischen Projekten abgleichen&lt;/a> verwenden wir &lt;em>uvx&lt;/em> mit &lt;a href="https://httpie.io/" target="_blank" rel="noopener">httpie&lt;/a>.&lt;/p>
&lt;p>In einem Terminal wie iTerm, xTerm, Bash oder Powershell führen wir den folgenden Befehl aus.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uvx --from httpie http --download GET https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/12_staedte-in-bw-geokoordinaten.csv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dieses kompakte Snippet lädt die zu diesem Zeitpunkt standardmäßige Python Version und die aktuellste Version von &lt;em>httpie&lt;/em> herunter, erstellt damit eine virtuelle Umgebung (&lt;em>venv&lt;/em>) und führt darin den Befehl &lt;code>http --download GET ...&lt;/code> aus.&lt;/p>
&lt;p>Den &lt;em>Reconciliation Service&lt;/em> basierend auf der im letzten Schritt heruntergeladenen Datei erstellen wir in zwei Schritten:&lt;/p>
&lt;ol>
&lt;li>Datenbank für &lt;em>Reconcilation Service&lt;/em> erstellen&lt;/li>
&lt;li>&lt;em>Reconciliation Service&lt;/em> starten&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uvx csv-reconcile init 12_staedte-in-bw-geokoordinaten.csv &lt;span class="s2">&amp;#34;GND ID&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;Name&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Mit diesem Snippet erstellen wir die Datenbank für den &lt;em>Reconciliation Service&lt;/em> und legen die Spalte &amp;ldquo;GND ID&amp;rdquo; als ID-Spalte fest und die Spalte &amp;ldquo;Name&amp;rdquo; als Standardspalte für den Abgleich.
Den &lt;em>Reconciliation Service&lt;/em> selbst starten wir mit dem folgenden Befehl.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uvx csv-reconcile serve
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In OpenRefine können wir den &lt;em>Reconciliation Service&lt;/em> anschließend hinzufügen mit: &lt;code>http://127.0.0.1:5000/reconcile&lt;/code>.&lt;/p>
&lt;h3 id="datenbank-mit-eigener-konfiguration">Datenbank mit eigener Konfiguration&lt;/h3>
&lt;p>Der oben erstelle &lt;em>Reconciliation Service&lt;/em> ist recht generisch und es fehlt z.B. noch die Vorschaufunktion für die einzelnen Elemente.
Um den Service nach unseren Anforderungen zu konfigurieren, erstellen wir eine Datei &lt;code>config.py&lt;/code> mit dem folgenden Inhalt.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">SERVER_NAME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;localhost:5000&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CSVKWARGS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s1">&amp;#39;delimiter&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;,&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;quotechar&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;&amp;#34;&amp;#39;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CSVENCODING&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;UTF-8&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">MANIFEST&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Städte in BW Reconciliation Service&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;identifierSpace&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;https://normdaten.landesarchiv-bw.de/ids&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;schemaSpace&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;https://normdaten.landesarchiv-bw.de/schema&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;extend&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;propose_properties&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;service_url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://localhost:5000&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;service_path&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;/properties&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;preview&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://localhost:5000/preview/{{id}}&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;width&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">500&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;height&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">300&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anschließend erstellen wir die &lt;em>Reconciliation&lt;/em> Datenbank mit der neuen Konfiguration.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uvx csv-reconcile init --config config.py 12_staedte-in-bw-geokoordinaten.csv &lt;span class="s2">&amp;#34;GND ID&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;Name&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Der neue Service ist nach dem Starten unter &lt;code>http://localhost:5000/reconcile&lt;/code> erreichbar.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uvx csv-reconcile serve
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="alert alert-info">
&lt;div>
In OpenRefine müssen wir den CSV &lt;em>Reconciliation Service&lt;/em> aktuell bei jeder Änderung der &lt;strong>Konfiguration&lt;/strong> neu hinzufügen.
&lt;/div>
&lt;/div>
&lt;p>Der &lt;em>Reconciliation Service&lt;/em> kann jetzt wie in Abbildung 2 mit dem Beispiel aus &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/">12 Daten zwischen Projekten abgleichen&lt;/a> getestet werden.&lt;/p>
&lt;figure id="figure-screencast-zum-reconciling-mit-openrefine-und-csv-datei">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Screencast zum *Reconciling* mit OpenRefine und CSV-Datei."
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/20-python-mit-openrefine/screencast-openrefine-csv-reconciling.gif"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Screencast zum &lt;em>Reconciling&lt;/em> mit OpenRefine und CSV-Datei.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="eigene-skripte">Eigene Skripte&lt;/h2>
&lt;p>Um &lt;em>Command Line Interfaces&lt;/em> (CLIs) zu erstellen, gibt es in Python die Standardbibliothek &lt;a href="https://docs.python.org/3/library/argparse.html" target="_blank" rel="noopener">argparse&lt;/a>.
Meistens möchte man aber &amp;ldquo;nur mal schnell&amp;rdquo; aus einer Python Funktion ein Werkzeug erstellen, welches von der Kommandozeile aufgerufen werden kann.
Ein nützliches Python Projekt dafür ist &lt;a href="https://typer.tiangolo.com/" target="_blank" rel="noopener">typer&lt;/a>.&lt;/p>
&lt;h3 id="typer-hello-world-beispiel">Typer Hello World Beispiel&lt;/h3>
&lt;p>Ein einfaches &amp;ldquo;Hello World&amp;rdquo; Beispiel mit &lt;em>uv&lt;/em> und &lt;em>Typer&lt;/em> ist im folgenden Quellcode aus &lt;code>hello_world.py&lt;/code> abgebildet.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># /// script&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># requires-python = &amp;#34;&amp;gt;=3.12&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># dependencies = [&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># &amp;#34;typer&amp;#34;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ///&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">typer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">hello_world&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Hello World&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">typer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hello_world&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Zu Beginn wird über &lt;a href="https://packaging.python.org/en/latest/specifications/inline-script-metadata/#script-type" target="_blank" rel="noopener">Inline Metadaten&lt;/a> definiert, dass das Skript mit Python 3.12 oder neuer ausgeführt werden soll und das Skript zusätzlich die externe Abhängigkeit &lt;a href="https://typer.tiangolo.com/" target="_blank" rel="noopener">typer&lt;/a> benötigt.&lt;/p>
&lt;p>Das Werkzeug &lt;em>uv&lt;/em> unterstützt diese inline Metadaten, so dass zum Ausführen dieses Skriptes in einem Terminal lediglich &lt;code>uv run hello_world.py&lt;/code> ausgeführt werden muss.&lt;/p>
&lt;p>Das Werkzeug &lt;em>Typer&lt;/em> übersetzt den CLI-Aufruf für die Python Funktion, und validiert und konvertiert dabei die Eingabedaten.&lt;/p>
&lt;h3 id="typer-beispiel-mit-parametern">Typer Beispiel mit Parametern&lt;/h3>
&lt;p>Wir beginnen mit einem einfachen Beispiel.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># /// script&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># requires-python = &amp;#34;&amp;gt;=3.12&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># dependencies = [&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># &amp;#34;typer&amp;#34;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ///&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">typer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">typer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die Funktion &lt;code>add&lt;/code> soll zwei Parameter &lt;code>a&lt;/code> und &lt;code>b&lt;/code> miteinander addieren und dann ausgeben.
Zum Ausgeben des Ergebnisses verwenden wir die Funktion &lt;code>print&lt;/code>.
Das Werkzeug &lt;code>typer&lt;/code> erkennt automatisch die beiden Parameter &lt;code>a&lt;/code> und &lt;code>b&lt;/code> und meldet, wenn diese nicht gesetzt sind.
Unter &lt;code>uv run add.py --help&lt;/code> erhalten wir einen Informationstext zur Benutzung unseres CLI-Tools.&lt;/p>
&lt;p>Standardmäßig werden die Parameter als Text interpretiert.
Mit so genannten &lt;a href="https://docs.python.org/3/library/typing.html" target="_blank" rel="noopener">Type Hints&lt;/a> können wir &lt;em>Typer&lt;/em> mitteilen, dass wir hier Zahlen erwarten.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Es ist auch möglich, optionale Parameter wie &lt;code>c&lt;/code> mit anzugeben.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">c&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">int&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">c&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Individuelle Konfigurationen können mit &lt;a href="https://docs.python.org/3/library/typing.html#typing.Annotated" target="_blank" rel="noopener">Type Annotations&lt;/a> hinterlegt werden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">c&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Annotated&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">typer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Argument&lt;/span>&lt;span class="p">()]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">c&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Mit den Annotationen lässt sich bei Bedarf der Text für die Hilfe weiter spezifizieren.
Hier das fertige Skript mit ausführlicherem Hilfstext.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># /// script&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># requires-python = &amp;#34;&amp;gt;=3.12&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># dependencies = [&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># &amp;#34;typer&amp;#34;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ///&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">typer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">typing_extensions&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Annotated&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">add&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Annotated&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">typer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;The first number to add.&amp;#34;&lt;/span>&lt;span class="p">)],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">b&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Annotated&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">typer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;The second number to add.&amp;#34;&lt;/span>&lt;span class="p">)],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">c&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Annotated&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">typer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;The optionally third number to add.&amp;#34;&lt;/span>&lt;span class="p">)]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> Add the numbers in `a` and `b` and optionally `c` if `c` is provided.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">c&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">typer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das Praktische an &lt;em>Typer&lt;/em> ist, dass man &amp;ldquo;nur zum Ausprobieren&amp;rdquo; lediglich die &lt;em>type hints&lt;/em> und den Aufruf von &lt;em>Typer&lt;/em> im Skript ergänzen muss.
Bei Bedarf können ausführlichere Hilfstexte oder Validierungen hinterlegt werden, deren Ergebnis in Abbildung 3 gezeigt ist.&lt;/p>
&lt;figure id="figure-screenshot-terminal-mit-von-typer-generierten-hilfstext">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Screenshot Terminal mit von *Typer* generierten Hilfstext." srcset="
/workshop/openrefine-fortgeschrittene/20-python-mit-openrefine/screenshot-terminal-typer_hu0d8bcb7ebbd1732e66a8e438ddf2504c_22144_b0035b32e843cd9c416ec72c36cdae2a.webp 400w,
/workshop/openrefine-fortgeschrittene/20-python-mit-openrefine/screenshot-terminal-typer_hu0d8bcb7ebbd1732e66a8e438ddf2504c_22144_02ae2c3f464e13330fa05f52c91a98b6.webp 760w,
/workshop/openrefine-fortgeschrittene/20-python-mit-openrefine/screenshot-terminal-typer_hu0d8bcb7ebbd1732e66a8e438ddf2504c_22144_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/20-python-mit-openrefine/screenshot-terminal-typer_hu0d8bcb7ebbd1732e66a8e438ddf2504c_22144_b0035b32e843cd9c416ec72c36cdae2a.webp"
width="542"
height="231"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Screenshot Terminal mit von &lt;em>Typer&lt;/em> generierten Hilfstext.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="zugriff-von-openrefine-auf-python-skript">Zugriff von OpenRefine auf Python Skript&lt;/h3>
&lt;p>Von OpenRefine heraus, lässt sich mit Jython recht unkompliziert auf das externe Python Skripte zugreifen.
Es muss lediglich der Pfad des Skriptes in dem Jython Snippet unten angepasst werden.
Ggf. müssen auch noch Parameter für das Skript ergänzt werden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">subprocess&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">script&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;C:&lt;/span>&lt;span class="se">\\&lt;/span>&lt;span class="s2">...&lt;/span>&lt;span class="se">\\&lt;/span>&lt;span class="s2">python_script.py&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">subprocess&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">check_output&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;uv&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;run&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">script&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shell&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="n">res&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="probleme-beim-zugriff-von-openrefine-auf-python-skripte">Probleme beim Zugriff von OpenRefine auf Python Skripte&lt;/h3>
&lt;p>Der direkte Zugriff auf ein Skript ist erst einmal relativ performant, hat in der Praxis aber mehrere Probleme.&lt;/p>
&lt;ol>
&lt;li>Die korrekte Übergabe von Daten an das Skript via Parametern ist nicht ganz so einfach. Besonders, wenn die Daten größer sind ggf. Sonderzeichen enthalten, &amp;hellip;&lt;/li>
&lt;li>Man ist selbst für die Fehlerbehandlung verantwortlich. Also dass die Skripte auch irgendwann beendet werden, bei zu langer Laufzeit abgebrochen werden, usw.&lt;/li>
&lt;li>Es wird lediglich Text zurückgegeben. Die Interpretation in ein bestimmtes Format muss dann in Jython oder in einem Nachbearbeitungsschritt erfolgen.&lt;/li>
&lt;li>Manche Skripte oder Tools müssen initial erst einmal Daten in den Arbeitsspeicher laden. Insbesondere bei Machine Learning Anwendungen kann das mehrere Sekunden dauern. Dies erfolgt bei jedem Skriptaufruf wieder erneut.&lt;/li>
&lt;/ol>
&lt;p>Daher ist es wesentlich stabiler stattdessen mit eigenen Web-APIs zu arbeiten.&lt;/p>
&lt;h2 id="eigene-web-apis-mit-fastapi">Eigene Web-APIs mit FastAPI&lt;/h2>
&lt;div class="mermaid">---
title: Script vs Web-API
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph openrefine["OpenRefine"]
subgraph jython["Jython"]
jython_code["Jython Code"]
end
end
subgraph venv
script["fab:fa-python Skript"]
end
subgraph uvicorn["Uvicorn"]
subgraph fastapi["FastAPI"]
python_code["fab:fa-python Code"]
end
end
jython_code -.-> script
jython_code -.-> script
jython_code -.-> script
jython_code -.-> script
jython_code -.-> script
jython_code -.-> script
jython_code -.-> script
jython_code -.-> script
jython_code -.-> script
jython_code &lt;--HTTP--> python_code
&lt;/div>
&lt;p>Für Web-APIs gibt es etablierte und stabile Protokolle zum Austausch von Daten.
Ähnlich wie mit &lt;em>Typer&lt;/em> können wir mit &lt;a href="https://fastapi.tiangolo.com/" target="_blank" rel="noopener">FastAPI&lt;/a> unsere Python-Funktionen als Web-API zur Verfügung stellen.
Mit einem Server wie &lt;a href="https://www.uvicorn.org/" target="_blank" rel="noopener">uvicorn&lt;/a> sorgen wir dabei für eine Stabilität der angestoßenen Prozesse für die Abfragen.&lt;/p>
&lt;h3 id="beispielcode-für-spacy">Beispielcode für spaCy&lt;/h3>
&lt;p>Das folgende Skript lädt ein deutschsprachiges Modell von &lt;a href="https://spacy.io" target="_blank" rel="noopener">spaCy&lt;/a> und berechnet über &lt;a href="https://de.wikipedia.org/wiki/Worteinbettung" target="_blank" rel="noopener">Word Embeddings&lt;/a> die Ähnlichkeit bzw. hier die Distanz der beiden übergebenen Texte.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># /// script&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># requires-python = &amp;#34;&amp;gt;=3.12,&amp;lt;3.13&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># dependencies = [&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># &amp;#34;spacy&amp;#34;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># &amp;#34;typer&amp;#34;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># &amp;#34;de_core_news_lg @ https://github.com/explosion/spacy-models/releases/download/de_core_news_lg-3.8.0/de_core_news_lg-3.8.0.tar.gz&amp;#34;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ///&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">typer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">de_core_news_lg&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">model&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">spacy_distance&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nlp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">doc_a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">nlp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">doc_b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">nlp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">doc_a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">similarity&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">doc_b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dist&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">typer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">spacy_distance&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das Skript hat den eindeutigen Nachteil, dass es bei jedem Aufruf das &amp;ldquo;große&amp;rdquo; Sprachmodell laden muss, was mehrere Sekunden dauert.
Hier im Vergleich das Skript &lt;code>spacy_distance_fastapi.py&lt;/code>, welches die Funktionalität via &lt;a href="https://fastapi.tiangolo.com/" target="_blank" rel="noopener">FastAPI&lt;/a> zur Verfügung stellt.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># /// script&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># requires-python = &amp;#34;&amp;gt;=3.12,&amp;lt;3.13&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># dependencies = [&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># &amp;#34;spacy&amp;#34;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># &amp;#34;fastapi&amp;#34;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># &amp;#34;uvicorn&amp;#34;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># &amp;#34;de_core_news_lg @ https://github.com/explosion/spacy-models/releases/download/de_core_news_lg-3.8.0/de_core_news_lg-3.8.0.tar.gz&amp;#34;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ///&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">de_core_news_lg&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">model&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">uvicorn&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">fastapi&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">FastAPI&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">app&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">FastAPI&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">nlp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@app.get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;/distance&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">spacy_distance&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="nb">float&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">doc_a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">nlp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">doc_b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">nlp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">doc_a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">similarity&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">doc_b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">dist&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">uvicorn&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;spacy_distance_fastapi:app&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">host&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;127.0.0.1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">port&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5000&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die Verarbeitungspipeline für die Texte mit dem &amp;ldquo;großen&amp;rdquo; Sprachmodell wird außerhalb der Python Methode definiert, weshalb das Modell pro Aufruf nur einmal aufgerufen werden muss.
Im Vergleich zum direkten Skriptaufruf, ist der Zugriff auf unsere lokale Web-API zwar etwas langsamer.
Wir profitieren aber von der Müglichkeit ladeintensive Prozesse nur einmal beim Starten auszuführen, sowie von dem zusätzlichen Protokoll im Bereich Fehlerbehandlung, Validierung von Eingaben und Antworten.&lt;/p>
&lt;p>Ähnlich wie bei &lt;em>Typer&lt;/em> übernimmt &lt;em>FastAPI&lt;/em> hier das Mapping der Benutzeranfrage auf die entsprechende Python Funktion.
Gleich wie bei &lt;em>Typer&lt;/em> werden &lt;em>Type Hints&lt;/em> für das Mapping, die Dokumentation und die Validierung verwendet.
Auch bei &lt;em>FastAPI&lt;/em> kann die Dokumentation mit weiteren Annotationen erweitert und personalisiert werden.&lt;/p>
&lt;p>Somit lassen sich mit FastAPI eigene Web-APIs ähnlich leicht erstellen, wie einfache Python Skripte mit &lt;em>Typer&lt;/em>.
Ausführliche Beispiele stehen im Anhang bzw. als GitHub Gist unter &lt;a href="https://gist.github.com/b2m/cadf88263f7978be96c164a89968c44c" target="_blank" rel="noopener">spacy_fastapi.py&lt;/a> und &lt;a href="https://gist.github.com/b2m/91f3b812bcf0975c4d2cb3230099366a" target="_blank" rel="noopener">rapidfuzz_fastapi.py&lt;/a> zur Verfügung.&lt;/p>
&lt;p>Von OpenRefine heraus kann man via Jython auf die (lokalen) Web-APIs zugreifen.&lt;/p>
&lt;h3 id="zugriff-via-get">Zugriff via GET&lt;/h3>
&lt;p>Web-APIs unterscheiden für den Abruf von Daten zwischen &lt;em>GET-&lt;/em> und &lt;em>POST-Requests&lt;/em> (Anfragen).
Für &lt;em>GET-Requests&lt;/em> gibt es in OpenRefine die Möglichkeit den Dialog &lt;a href="https://openrefine.org/docs/manual/columnediting#add-column-by-fetching-urls" target="_blank" rel="noopener">Add column by fetching URLs&lt;/a> zum Nachladen von Daten zu verwenden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;http://localhost:5000/ner?text=&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Hier kann man mit einfachem GREL die benötigte URL zusammen bauen.
Man sollte jedoch daran denken, die Parameter mit &lt;a href="https://openrefine.org/docs/manual/grelfunctions#escapes-s-mode" target="_blank" rel="noopener">escape&lt;/a> für die URL kompatibel aufzubereiten.&lt;/p>
&lt;p>In Abbildung 4 ist der Dialog aus &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/">18 Nachladen von Geokoordinaten&lt;/a> gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialogs-zum-nachladen-von-urls-für-geonames">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="../18-nachladen-von-geokoordinaten/screenshot-openrefine-add-by-url.png" alt="Bildschirmfoto des Dialogs zum Nachladen von URLs für GeoNames." loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialogs zum Nachladen von URLs für GeoNames.
&lt;/figcaption>&lt;/figure>
&lt;p>Möchte man eine Web-API z.B. von einem &lt;em>Facet&lt;/em> oder einem Clustering-Dialog heraus aufrufen, benötigt man dafür das folgende Jython-Snippet um einen validen &lt;em>GET-Request&lt;/em> zu erstellen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="nn">urllib&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="nn">urllib2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;http://localhost:5000/ner&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">request_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urlencode&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">value&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib2&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urlopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;?&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">request_data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dumps&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">ensure_ascii&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="alert alert-note">
&lt;div>
&lt;strong>Zur Erinnerung:&lt;/strong> Es gibt Python Bibliotheken wie &lt;a href="https://requests.readthedocs.io/" target="_blank" rel="noopener">requests&lt;/a>, die das Erstellen und Verarbeiten von Web-Requests deutlich vereinfachen. Wir arbeiten in OpenRefine aber mit Jython und können daher nicht einfach auf externe Bibliotheken zugreifen.
&lt;/div>
&lt;/div>
&lt;h3 id="zugriff-via-get-und-form">Zugriff via GET und Form&lt;/h3>
&lt;p>Manche Web-APIs erwarten einen &lt;em>GET-Request&lt;/em> mit zusätzlichem Nutzdaten z.B. aus einem Formular.
Das lässt sich in Jython / Python 2.7 mit folgendem Snippet umsetzen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="nn">urllib&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="nn">urllib2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;http://localhost:5000/ner&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">request_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urlencode&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">value&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib2&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urlopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">request_data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dumps&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">ensure_ascii&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Der Unterschied zum letzten Beispiel ist, dass &lt;code>request_data&lt;/code> als zusätzliche Nutzdaten mit einem Komma getrennt an &lt;code>urllib2&lt;/code> übergeben werden, anstatt sie mit an die URL zu kodieren.&lt;/p>
&lt;h3 id="zugriff-via-post">Zugriff via POST&lt;/h3>
&lt;p>Der in den Beispielen im Anhang verwende &lt;em>Use-Case&lt;/em> ist das Verwenden von &lt;em>POST-Requests&lt;/em>.
Hier werden die Nutzdaten als &lt;a href="https://www.json.org/" target="_blank" rel="noopener">JSON&lt;/a> kodiert an den &lt;em>Request&lt;/em> angehängt.
Das macht die Kodierung der Daten in der Anfrage komplexer, gleichzeitig aber die Übermittlung stabiler.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="nn">urllib&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="nn">urllib2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;http://localhost:5000/ner&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">request_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dumps&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">value&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">request&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib2&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Request&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">request_data&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;Content-Type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;application/json&amp;#34;&lt;/span>&lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib2&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urlopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">request&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dumps&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">ensure_ascii&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Der komplette Workflow vom Starten des Web-Service, bis zur Verwendung von &lt;a href="https://rapidfuzz.github.io/RapidFuzz/" target="_blank" rel="noopener">RapidFuzz&lt;/a> als eigene Clustering Methode in OpenRefine ist in dem Screencast in Abbildung 5 gezeigt.&lt;/p>
&lt;figure id="figure-screencast-zur-verwendung-von-uv-fastapi-und-rapidfuzz-als-eigene-clustering-methode-bei-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Screencast zur Verwendung von uv, FastAPI und RapidFuzz als eigene Clustering Methode bei OpenRefine."
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/20-python-mit-openrefine/screencast-openrefine-custom-clustering-distance-rapidfuzz.gif"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Screencast zur Verwendung von uv, FastAPI und RapidFuzz als eigene Clustering Methode bei OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Kleinere Skripte mit Jython / Python 2.7 in OpenRefine sind möglich, jedoch gerade beim Clustering oder bei der Nachnutzung von externen Python Projekten problematisch.&lt;/p>
&lt;p>Mit &lt;a href="https://typer.tiangolo.com/" target="_blank" rel="noopener">Typer&lt;/a> und &lt;a href="ttps://fastapi.tiangolo.com/">FastAPI&lt;/a> lassen sich aus Python Funktionen heraus schnell CLI-Tools oder Web-APIs erstellen.
Die beiden Werkzeuge ermöglichen es sowohl mit wenig Aufwand Prototypen zu erstellen, als auch diese zu dokumentierten praktischen Tools zu erweitern.&lt;/p>
&lt;p>Mit &lt;a href="https://docs.astral.sh/uv/" target="_blank" rel="noopener">uv&lt;/a> sind die Hürden für das Erstellen von indivduellen Python Umgebungen für einzelne Skripte sehr stark gesenkt worden.
Das reduziert nicht nur den Entwicklungsaufwand, sondern erleichtert auch die Nachnutzung von Skripten für Nutzerinnen und Nutzer.&lt;/p>
&lt;p>Mit der Kombination aus Jython, uv und wahlweise Typer oder FastAPI lassen sich dadurch modernste Python Anwendungen direkt mit OpenRefine verbinden.&lt;/p>
&lt;h2 id="anhang">Anhang&lt;/h2>
&lt;h3 id="fastapi-wrapper-für-spacy">FastAPI Wrapper für spaCy&lt;/h3>
&lt;script type="application/javascript" src="https://gist.github.com/b2m/cadf88263f7978be96c164a89968c44c.js?file=spacy_fastapi.py">&lt;/script>
&lt;h3 id="fastapi-wrapper-für-rapidfuzz">FastAPI Wrapper für RapidFuzz&lt;/h3>
&lt;script type="application/javascript" src="https://gist.github.com/b2m/91f3b812bcf0975c4d2cb3230099366a.js?file=rapidfuzz_fastapi.py">&lt;/script></description></item><item><title>Workshop - Erweitertes Clustering</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/</link><pubDate>Mon, 05 May 2025 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/</guid><description>&lt;p>Wir verwenden &lt;strong>eigene&lt;/strong> Clustering Methoden in OpenRefine, um Schreibweisen zu vereinheitlichen.&lt;/p>
&lt;blockquote>
&lt;p>Clustering in der &lt;a href="https://openrefine.org/docs/manual/cellediting#custom-clustering-methods" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;br>
Clustering im &lt;a href="https://openrefine.org/docs/technical-reference/clustering-in-depth" target="_blank" rel="noopener">OpenRefine Wiki&lt;/a>.&lt;br>
Einsteiger Workshop &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/05-clustering/">05 Daten mit OpenRefine clustern&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;div class="alert alert-warning">
&lt;div>
Die in diesem Tutorial behandelte Funktionalität ist verfügbar seit OpenRefine &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;/div>
&lt;h2 id="daten">Daten&lt;/h2>
&lt;p>Wir benötigen die folgenden Dateien als OpenRefine Projekt:&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/19_erweitertes-clustering.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Erweitertes Clustering&lt;/a>
&lt;hr>
&lt;p>In der nachfolgenden Tabelle sind typische Probleme dargestellt, die mit den Standard Clusteringverfahren von OpenRefine nicht direkt zu lösen sind.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;strong>Ort&lt;/strong>&lt;/th>
&lt;th>&lt;strong>Name&lt;/strong>&lt;/th>
&lt;th>&lt;strong>Name 2&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XY, Ort in Bayern&lt;/td>
&lt;td>Hans Meier&lt;/td>
&lt;td>Hans Meier&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>XY (Bayern)&lt;/td>
&lt;td>Maier, Hans&lt;/td>
&lt;td>Hans Peter Meier&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>XY in Bayern&lt;/td>
&lt;td>Hans Peter Meyer&lt;/td>
&lt;td>Hans P. Meier&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>XY; Bayern&lt;/td>
&lt;td>Hans (Peter) Maier&lt;/td>
&lt;td>Hans (Peter) Meier&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>XY | Bayern&lt;/td>
&lt;td>Hans P. Mayer&lt;/td>
&lt;td>Hans Müller&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>XY, liegt in Bayern&lt;/td>
&lt;td>Meier, Hans (Peter)&lt;/td>
&lt;td>Hans Peter Müller&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>In der Spalte &lt;em>Ort&lt;/em> gibt es unterschiedliche Ansetzungen für einen &lt;em>Ort in Bayern&lt;/em>.
Die Spalte &lt;em>Name&lt;/em> enthält unterschiedliche Schreibweisen für den Namen &lt;em>Hans Peter Meier&lt;/em>.
Und die Spalte &lt;em>Name 2&lt;/em> enthält &lt;em>Hans Peter &lt;strong>Meier&lt;/strong>&lt;/em> und &lt;em>Hans Peter &lt;strong>Müller&lt;/strong>&lt;/em> jeweils mit und ohne Zweitnamen.&lt;/p>
&lt;h2 id="keying-functions">Keying Functions&lt;/h2>
&lt;p>Eine von OpenRefine unterstützte Art des Clusterings sind so genannte &lt;em>key collision&lt;/em> Verfahren.&lt;/p>
&lt;p>Die Idee dahinter ist, dass ein Eingabetext nach einheitlichen Regeln umgewandelt wird.
Die Ergebnisse der Umwandlungen werden dann verglichen und die gleichen Ergebnisse zusammengefasst.&lt;/p>
&lt;p>Typische Beispiele für Umwandlungsregein sind:&lt;/p>
&lt;ul>
&lt;li>Wörter sortieren&lt;/li>
&lt;li>Sonderzeichen entfernen oder umwandeln&lt;/li>
&lt;li>Wörter auf Normalformen bringen&lt;/li>
&lt;li>Synonyme auflösen&lt;/li>
&lt;li>n-Gramme erstellen&lt;/li>
&lt;li>&amp;hellip;&lt;/li>
&lt;/ul>
&lt;p>Einige dieser Methoden sind in OpenRefine implementiert.
Dennoch sind sie häufig nicht ausreichend für spezifischere Probleme.
Seit OpenRefine 3.9.3 ist es möglich eigene Clustering Algorithmen in den von OpenRefine unterstützten Programmiersprachen zu hinterlegen.&lt;/p>
&lt;p>Im Folgenden stellen werden zwei Algorithmen für das &lt;em>Keying&lt;/em> vorstellt.&lt;/p>
&lt;h3 id="ortfingerprint">OrtFingerprint&lt;/h3>
&lt;p>Das Problem bei den Werten in der Spalte &lt;em>Ort&lt;/em> ist, dass wir unterschiedliche Sonderzeichen, als auch &amp;ldquo;überflüssige&amp;rdquo; Wörter haben, die eine Zusammenführung via Clustering erschweren.&lt;/p>
&lt;p>Der Screencast in Abbildung 1 zeigt, wie im &lt;em>Clustering Dialog&lt;/em> unter &lt;em>Manage clustering functions&lt;/em> eigene Clustering Funktionen hinterlegt werden.
In dem Beispiel ist das ein GREL-Ausdruck, der die &lt;em>Fingerprint&lt;/em> Methode von OpenRefine mit unserem domänenspezifischem Wissen kombiniert.&lt;/p>
&lt;figure id="figure-screencast-zum-anlegen-und-anwenden-eigener-clustering-funktionen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Screencast zum Anlegen und Anwenden eigener Clustering Funktionen."
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/screencast-openrefine-openrefine-custom-clustering-keying.gif"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Screencast zum Anlegen und Anwenden eigener Clustering Funktionen.
&lt;/figcaption>&lt;/figure>
&lt;p>In dem nachfolgenden GREL-Ausdruck werden vor der Anwendung der &lt;em>Fingerprint&lt;/em> Methode von Openrefine die folgenden Schritte durchgeführt:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Sonderzeichen&lt;/strong> entfernen, die die &lt;em>Fingerprint&lt;/em> Methode nicht berücksichtigt (&lt;code>&amp;quot;|&amp;quot;&lt;/code>).&lt;/li>
&lt;li>&lt;strong>Stoppworte&lt;/strong> entfernen (&lt;code>&amp;quot;Ort&amp;quot;&lt;/code>).&lt;/li>
&lt;li>&lt;strong>Klein geschriebene Wörter&lt;/strong> entfernen (&lt;code>/\b[a-z]+\b/&lt;/code>).&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">fingerprint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;|&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Ort&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\b[a-z]+\b/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das Ergebnis ist eine spezifische Fingerprintmethode, die wie in Abbildung 1 gezeigt, unterschiedliche Ansetzungen bei Orten berücksichtigen kann.&lt;/p>
&lt;h3 id="colognefingerprint">CologneFingerprint&lt;/h3>
&lt;p>Die in OpenRefine implementierten Clustering-Methoden lassen sich nachnutzen und kombinieren.
Der folgende GREL-Ausdruck wendet zuerst das &lt;em>Fingerprinting&lt;/em> und dann die Normalisierung bzgl. der deutschen Aussprache mit &lt;em>Cologne Phonetic&lt;/em> an.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">fingerprint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">phonetic&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;cologne-phonetic&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Auf diese Weise können die Werte in der Spalte &lt;em>Name&lt;/em> wie in Abbildung 2 gezeigt (größtenteils) zusammengeführt werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-clustering-dialogs-mit-kombiniertem-fingerprinting-und-cologne-phonetic-algorithmus">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Clustering Dialogs mit kombiniertem *Fingerprinting* und *Cologne Phonetic* Algorithmus." srcset="
/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_hu557c93bd5851f710a57d61642747f8c7_39907_30051010093b8fbe6868182c1ab9915f.webp 400w,
/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_hu557c93bd5851f710a57d61642747f8c7_39907_cb76e61c1d2e762b3ba3f689826bbfc2.webp 760w,
/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_hu557c93bd5851f710a57d61642747f8c7_39907_1b7d0e091f8e7a9de9fc63c9405bb16a.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_hu557c93bd5851f710a57d61642747f8c7_39907_30051010093b8fbe6868182c1ab9915f.webp"
width="760"
height="510"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Clustering Dialogs mit kombiniertem &lt;em>Fingerprinting&lt;/em> und &lt;em>Cologne Phonetic&lt;/em> Algorithmus.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="distance-functions">Distance Functions&lt;/h2>
&lt;p>Bei den Distanzfunktionen werden die Texte nicht umgewandelt, sondern mit unterschiedlichen Metriken berechnet, wie &amp;ldquo;weit&amp;rdquo; sie voneinander entfernt sind. Dafür erhält man Zugriff auf die Variablen &lt;code>value1&lt;/code> und &lt;code>value2&lt;/code> und gibt eine Zahl zurück, die die Distanz zwischen den beiden Werten repräsentiert. Je größer die Zahl, desto &amp;ldquo;unähnlicher&amp;rdquo; sind die Texte.&lt;/p>
&lt;p>Manche Algorithmen betrachten auch positiv die Ähnlichkeit (&lt;em>Similarity&lt;/em>) von Texten.
Dabei sind die beiden Metriken einfach umzurechnen: $distance = 1 - similarity$.&lt;/p>
&lt;p>Manche Algorithmen betrachten die Ähnlichkeit bzw. die Distanz auch nicht als Wert zwischen 0 und 1.0, sondern zwischen 0 und 100.&lt;/p>
&lt;h3 id="fingerprintdistance">FingerprintDistance&lt;/h3>
&lt;p>Ein typisches Problem ist, dass man sowohl unterschiedliche Ansetzungen, als auch leichte Abweichungen hat.
Hier lässt sich zum Beispiel das &lt;em>Fingerprinting&lt;/em> in OpenRefine mit der Implementierung der &lt;a href="https://de.wikipedia.org/wiki/Levenshtein-Distanz" target="_blank" rel="noopener">Levenshtein-Distanz&lt;/a> kombinieren.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">levenshteinDistance&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">fingerprint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value1&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">fingerprint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value2&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In Abbildung 3 sind die Ergebnisse der kombinierten Algorithmen auf der Spalte &lt;em>Name&lt;/em> gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-clustering-dialogs-mit-kombiniertem-fingerprinting-und-levenshtein-algorithmus">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Clustering Dialogs mit kombiniertem *Fingerprinting* und Levenshtein-Algorithmus." srcset="
/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_hu54ae07f60dcf3d447427ef35ad01c799_55161_70dfc912f5aaa293e8c8480382c7f85d.webp 400w,
/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_hu54ae07f60dcf3d447427ef35ad01c799_55161_c7cda403648e0733ff558be0ed940ce5.webp 760w,
/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_hu54ae07f60dcf3d447427ef35ad01c799_55161_787c91335cb08a2bd3558ca70ef4e0fd.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_hu54ae07f60dcf3d447427ef35ad01c799_55161_70dfc912f5aaa293e8c8480382c7f85d.webp"
width="760"
height="513"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Clustering Dialogs mit kombiniertem &lt;em>Fingerprinting&lt;/em> und Levenshtein-Algorithmus.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="absolutedistance">AbsoluteDistance&lt;/h3>
&lt;p>In der Spalte &lt;em>Name 2&lt;/em> ist das Problem mit Extrabegriffen wie Zweitnamen etwas deutlicher gezeigt.
Hier könnte man Methoden anwenden, die Distanzen auf Wortebene berechnen.&lt;/p>
&lt;p>Im Folgenden Code Beispiel ist ein &lt;em>Jython&lt;/em>-Algorithmus, der die Datenstruktur &lt;a href="https://docs.python.org/2.7/library/collections.html#collections.Counter" target="_blank" rel="noopener">Counter&lt;/a> verwendet um eine Art &lt;a href="https://en.wikipedia.org/wiki/Bag-of-words_model" target="_blank" rel="noopener">Bag-of-words Model&lt;/a> zu erstellen.&lt;/p>
&lt;p>Die Distanz ist hier, die Anzahl an &lt;strong>unterschiedlichen Worten&lt;/strong> zwischen den beiden Texten.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">re&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">collections&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Counter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">splitter&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">re&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">compile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">r&lt;/span>&lt;span class="s2">&amp;#34;\W+&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">words&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Counter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">splitter&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">value1&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">words&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">subtract&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Counter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">splitter&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">value2&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">())))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">dist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">sum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">abs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">count&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">words&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">values&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="n">dist&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wie in Abbildung 4 gezeigt, hilft diese Methode bei dem Problem von einzelnen Extrabegriffen, die den auf Buchstabenebene arbeitenden Levenshtein-Algorithmus &amp;ldquo;überfordern&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-clustering-dialogs-mit-absolutedistance-funktion">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Clustering Dialogs mit *AbsoluteDistance* Funktion." srcset="
/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_huaa044c427fe71821db5b58c1a0606c2a_54454_a45af42208a0da073390ddd309881e05.webp 400w,
/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_huaa044c427fe71821db5b58c1a0606c2a_54454_ebe42d56ba0b5db2dedfdb842e06aeb7.webp 760w,
/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_huaa044c427fe71821db5b58c1a0606c2a_54454_122a702caeef589ceeeb044ffd77e0ad.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_huaa044c427fe71821db5b58c1a0606c2a_54454_a45af42208a0da073390ddd309881e05.webp"
width="760"
height="513"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Clustering Dialogs mit &lt;em>AbsoluteDistance&lt;/em> Funktion.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="cosinedistance">CosineDistance&lt;/h3>
&lt;p>Eine wichtige Distanzmetrik zur Berechnung der Ähnlichkeit (oder in dem Fall der Distanz) zwischen Vektoren ist die &lt;a href="https://de.wikipedia.org/wiki/Kosinus-%C3%84hnlichkeit" target="_blank" rel="noopener">Kosinus-Ähnlichkeit&lt;/a>.
Dies ist exemplarisch in dem folgenden &lt;em>Jython&lt;/em>-Code umgesetzt.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">re&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">collections&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Counter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">splitter&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">re&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">compile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">r&lt;/span>&lt;span class="s2">&amp;#34;\W+&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Counter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">splitter&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">value1&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Counter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">splitter&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">value2&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">words&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="nb">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a_vec&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">word&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">word&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">words&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">b_vec&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">word&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">word&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">words&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">v_len&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">lambda&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">sum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">**&lt;/span> &lt;span class="mf">0.5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">v_dot&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">lambda&lt;/span> &lt;span class="n">v1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">v2&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">sum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">zip&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">v1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">v2&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">dist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">v_dot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a_vec&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b_vec&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">v_len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a_vec&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">v_len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b_vec&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="n">dist&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Ähnlich wie bei der &lt;em>AbsoluteDistance&lt;/em> zählen wir, wie oft ein Wort im Text vorkommt.
Diesmal berücksichtigen wir (vereinfacht ausgedrückt) zusätzlich die Länge der Texte.
Dadurch ist der Rückgabewert eine Zahl zwischen 0 und 1.
Wie in Abbildung 5 gezeigt, erhält man mit dem in OpenRefine voreingestellten Standardradius von 1.0 dadurch alle möglichen Cluster.
Für sinnvolle Ergebnisse sollte man den Radius bei Verwendung der Kosinus-Ähnlichkeit also auf Werte zwischen 0.1 und 0.3 reduzieren.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-clustering-dialogs-mit-cosinedistance-funktion">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Clustering Dialogs mit *CosineDistance* Funktion." srcset="
/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_hu8fcf2c0e37b6552bcd65b3342dd4aa4a_57708_be5ee4258255c5ce0160acae8c3cb245.webp 400w,
/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_hu8fcf2c0e37b6552bcd65b3342dd4aa4a_57708_09d64a7bf8aa4842d54fcfb9a6560f78.webp 760w,
/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_hu8fcf2c0e37b6552bcd65b3342dd4aa4a_57708_e59c1b10f2c1615cb85a7cee3d60ce7c.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/_hu8fcf2c0e37b6552bcd65b3342dd4aa4a_57708_be5ee4258255c5ce0160acae8c3cb245.webp"
width="760"
height="513"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Clustering Dialogs mit &lt;em>CosineDistance&lt;/em> Funktion.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="weitere-ideen">Weitere Ideen&lt;/h2>
&lt;p>Mit &lt;em>Jython&lt;/em> lassen sich auch Skripte auf dem eigenen Rechner ausführen oder Web-APIs ansprechen.
Damit kann man komplexere und effizientere Algorithmen implementieren und/oder auf andere Python Pakete zurückgreifen.&lt;/p>
&lt;p>Hier ist eine kleine Sammlung von weiteren Ideen:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Keying&lt;/strong>
&lt;ul>
&lt;li>Liste mit Synonymen einlesen und Synonym-Cluster-ID zurückgeben.&lt;/li>
&lt;li>Lemma, Normalform oder Lexem berechnen z.B. mit &lt;a href="https://spacy.io/api/token#attributes" target="_blank" rel="noopener">spaCy&lt;/a>.&lt;/li>
&lt;li>&amp;hellip;&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Distance&lt;/strong>
&lt;ul>
&lt;li>Texte z.B. mit &lt;a href="https://spacy.io/usage/linguistic-features#vectors-similarity" target="_blank" rel="noopener">spaCy&lt;/a> in Wortvektoren umwandeln und Abstand berechnen.&lt;/li>
&lt;li>Levenshtein-Distanz mit mehr Einstellmöglichkeiten via &lt;a href="https://github.com/rapidfuzz/RapidFuzz" target="_blank" rel="noopener">RapidFuzz&lt;/a>.&lt;/li>
&lt;li>&amp;hellip;&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Eigene Clustering-Funktionen hinterlegen zu können ermöglicht komplett andere Arbeitsabläufe und reduziert regelmäßige manuelle Nacharbeiten.&lt;/p>
&lt;p>In Kombination mit der Möglichkeit z.B. über &lt;em>Jython&lt;/em> Web-APIs anzusprechen, können zusätzlich Funktionalitäten von externen Werkzeugen für das Clustering genutzt werden.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns Python mit OpenRefine zu verwenden.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/20-python-mit-openrefine" class="btn btn-primary px-3 py-3">20 Python mit OpenRefine&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Nachladen von Geokoordinaten</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/</link><pubDate>Thu, 08 Aug 2024 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/</guid><description>&lt;p>In diesem Tutorial beschäftigen wir uns mit dem Nachladen von Geokoordinaten.&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>Reconciling in der &lt;a href="https://docs.openrefine.org/manual/reconciling" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;br>
Spalten via URL hinzufügen in der &lt;a href="https://openrefine.org/docs/manual/columnediting#add-column-by-fetching-urls" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>&lt;br>
OpenRefine API in der &lt;a href="https://lobid.org/gnd/api#openrefine" target="_blank" rel="noopener">lobid API Dokumentation&lt;/a>.&lt;br>
Getty Research Institute zu &lt;a href="https://www.getty.edu/research/tools/vocabularies/obtain/openrefine.html" target="_blank" rel="noopener">OpenRefine Reconciliation&lt;/a>.&lt;br>
Informationssammlung zu &lt;a href="https://wikidata.reconci.link/" target="_blank" rel="noopener">OpenRefine Wikidata Reconciliation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;div class="alert alert-warning">
&lt;div>
Die Situation von Orten in den Datenquellen unterscheidet sich teils stark und ändert sich stets.
Daher werden in diesem Tutorial unterschiedliche Strategien gezeigt.
&lt;/div>
&lt;/div>
&lt;p>OpenRefine unterstützt für den Abgleich mit Datenquellen die &lt;a href="https://reconciliation-api.github.io/" target="_blank" rel="noopener">Reconciliation Service API&lt;/a>.
In dem Workshop wurde schon gezeigt, wie Daten mit der &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/">GND&lt;/a>, &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/">Wikidata&lt;/a> und &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/">Getty&lt;/a> abgeglichen werden können.
In diesem Teil des Workshops beschäftigen wir uns im ersten Teil, wie wir von Normdatenverknüpfungen zu Geokoordinaten kommen.
Im zweiten Teil behandeln wir den allgemeinen Umgang mit Zugriff auf Daten von &lt;a href="https://www.geonames.org/" target="_blank" rel="noopener">GeoNames&lt;/a> und &lt;a href="https://www.openstreetmap.org/" target="_blank" rel="noopener">OpenStreetMap&lt;/a> über allgemeine &lt;em>Geocoding APIs&lt;/em>.&lt;/p>
&lt;div class="mermaid">---
title: Zusammenhang (Norm-)datenquellen
config:
look: handDrawn
theme: neutral
---
flowchart LR
ort["Ort"]
gnd["GND"]
wikipedia["Wikipedia"]
wikidata["Wikidata"]
tgn["Getty TGN"]
geonames["GeoNames"]
coordinates[[Koordinaten]]
ort --Recon--> gnd &amp; wikidata &amp; tgn
ort --API--> geonames
gnd --Extend--> wikipedia
gnd &lt;--Extend--> wikidata
gnd --Extend--> geonames
wikipedia --API--> coordinates &amp; wikidata
wikidata --Extend--> coordinates
wikidata --Extend---> geonames
wikidata --Extend--> tgn
tgn --Extend--> coordinates
geonames --API--> coordinates
&lt;/div>
&lt;p>In dem Diagramm sind verschiedene Wege gezeigt, die zum Nachladen von Geokoordinaten genommen werden können.
Teilweise sind nicht bei allen Orten in den Datenquellen Geokoordinaten hinterlegt, so dass wir der &lt;em>Extend&lt;/em> Funktionalität der &lt;em>Reconciliation Service Specification&lt;/em> z.B. von der GND-ID zu Wikidata und von dort zu GeoNames &amp;ldquo;springen&amp;rdquo;.&lt;/p>
&lt;h3 id="problemstellung">Problemstellung&lt;/h3>
&lt;p>Die Situation der Orte in den einzelnen Datenquellen unterscheidet sich teilweise stark.
In der folgenden Tabelle sind einige zufällig ausgewählten Orte aus Baden-Württemberg gelistet, um das Problem zu verdeutlichen.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Datenquelle&lt;/th>
&lt;th>Wohnplatz&lt;/th>
&lt;th>Gemeinde (historisch)&lt;/th>
&lt;th>Ortsteil (aktuell)&lt;/th>
&lt;th>Gemeinde (aktuell)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Ort&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Kaltenbach&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Marlsburg&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Marlsburg&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Marlsburg-Marzell&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GND&lt;/td>
&lt;td>7824222-8&lt;/td>
&lt;td>4422940-9&lt;/td>
&lt;td>&lt;/td>
&lt;td>4422938-0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Wikidata&lt;/td>
&lt;td>Q65183925&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>Q62032&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Getty TGN&lt;/td>
&lt;td>7153012&lt;/td>
&lt;td>&lt;/td>
&lt;td>7141027&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GeoNames&lt;/td>
&lt;td>2893651&lt;/td>
&lt;td>&lt;/td>
&lt;td>2874049&lt;/td>
&lt;td>6555902&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Wikipedia&lt;/td>
&lt;td>&lt;a href="https://de.wikipedia.org/wiki/Kaltenbach_%28Malsburg-Marzell%29" target="_blank" rel="noopener">Kaltenbach&lt;/a>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;a href="https://de.wikipedia.org/wiki/Malsburg-Marzell" target="_blank" rel="noopener">Malsburg-Marzell&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Ort&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Luisenheim&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Marzell&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Marzell&lt;/strong>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GND&lt;/td>
&lt;td>7818883-0&lt;/td>
&lt;td>4422941-0&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Wikidata&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Getty TGN&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>7129879&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GeoNames&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>2873068&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Wikipedia&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Ort&lt;/strong>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;strong>Altdorf&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Ettenheim-Altdorf&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Ettenheim&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GND&lt;/td>
&lt;td>&lt;/td>
&lt;td>4260757-7&lt;/td>
&lt;td>10099367-9&lt;/td>
&lt;td>4015632-1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Wikidata&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>Q47520099&lt;/td>
&lt;td>Q506871&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Getty TGN&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>7216262&lt;/td>
&lt;td>1039035&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GeoNames&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>2958031&lt;/td>
&lt;td>6558103&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Wikipedia&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;a href="https://de.wikipedia.org/wiki/Altdorf_%28Ettenheim%29" target="_blank" rel="noopener">Altdorf&lt;/a>&lt;/td>
&lt;td>&lt;a href="https://de.wikipedia.org/wiki/Ettenheim" target="_blank" rel="noopener">Ettenheim&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Der Wohnplatz Kaltenbach kam schon 1823 zur Gemeinde Malsburg dazu, welche dann 1974 zur Doppelgemeinde Marlsburg-Marzell wurde.
Dies ist in der GND auch entsprechend &amp;ldquo;abgebildet&amp;rdquo;. Was quasi fehlt, ist ein separater Eintrag für Marlsburg als heutigen Teilort von Marlsburg-Marzell. Dies ist in der Tabelle am Beispiel der ehemaligen Gemeinde Altdorf gezeigt, für die es in der GND sowohl für die historische Gemeinde, als auch für den heutigen Teilort separate Eintragungen gibt.&lt;/p>
&lt;p>In Wikidata und Wikipedia gibt es nur Hinweise auf Kaltenbach und die aktuelle Doppelgemeinde Marlsburg-Marzell.
Für die vorangegangenen Gemeinden Marlsburg und Marzell gibt es auf Wikipedia (noch) keine Einträge.&lt;/p>
&lt;p>Dafür sind Marlsburg und Marzell sowohl bei Getty TGN, als auch bei GeoNames zu finden, wobei sich das eher auf die aktuellen Teilorte bezieht. Die aktuelle Doppelgemeinde Marlsburg-Marzell ist bei Getty TGN nicht zu finden, wobei das auch mit Problemen mit dem Bindestrich bei Suchanfragen zu tun haben kann, worauf wir später in diesem Tutorial nochmal zu sprechen kommen.&lt;/p>
&lt;p>Luisenheim als im Vergleich zu Kaltenbach weniger bedeutender und zu Marzell zugehöriger Wohnplatz ist beispielsweise nur in der GND zu finden.&lt;/p>
&lt;p>Was im Zuge des Reconciling also passieren kann ist, dass man historische Orte wie Altdorf verknüpft.
Die Verknüpfung zu anderen Datenquellen wie GeoNames oder Wikidata aber am aktuellen Ortsteil Ettenheim-Altdorf hängt.
Oder man umgekehrt den aktuellen Teilort verknüpft, die Informationen zu GeoNames oder Wikidata aber mit dem historischen Ort verknüpft sind.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Stuttgart&lt;/th>
&lt;th>Wohnort&lt;/th>
&lt;th>Stadtkreis&lt;/th>
&lt;th>Regierungsbezirk&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>GND&lt;/td>
&lt;td>4058282-6&lt;/td>
&lt;td>&lt;/td>
&lt;td>4058287-5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Wikidata&lt;/td>
&lt;td>Q1022&lt;/td>
&lt;td>&lt;/td>
&lt;td>Q8172&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Getty TGN&lt;/td>
&lt;td>7004425&lt;/td>
&lt;td>7077331&lt;/td>
&lt;td>7075017&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GeoNames&lt;/td>
&lt;td>6690189&lt;/td>
&lt;td>3220785&lt;/td>
&lt;td>3214105&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Wikipedia&lt;/td>
&lt;td>&lt;a href="https://de.wikipedia.org/wiki/Stuttgart" target="_blank" rel="noopener">Stuttgart&lt;/a>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;a href="https://de.wikipedia.org/wiki/Regierungsbezirk_Stuttgart" target="_blank" rel="noopener">Regierungsbezirk&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Ein anderes Problem ist teilweise die Unterscheidung zwischen Wohnort, Stadtkreis, Regierungsbezirk und teilweise sogar Bundesland (Stadtstaaten), die verwaltungstechnisch unterschiedliche Ebenen einnehmen, aber teilweise die exakt gleiche Fläche abdecken.&lt;/p>
&lt;p>Hier wird in der GND und Wikidata zum Beispiel bei Stuttgart nicht zwischen Wohnort und Stadtkreis unterschieden, bei Getty TGN und GeoNames aber schon.&lt;/p>
&lt;p>Dies sind nur ein paar exemplarische Beispiele, die neben Duplikaten, fehlenden Daten und unterschiedlichen Schreibweisen zu Problemen bei der Arbeit mit Normdaten für Orte und deren Eignung für das Nachladen von Geoinformationen führen.&lt;/p>
&lt;h2 id="daten-laden">Daten laden&lt;/h2>
&lt;p>Wir benötigen die folgenden Dateien als OpenRefine Projekt:&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/18_orte.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Orte&lt;/a>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Ort&lt;/th>
&lt;th>GND&lt;/th>
&lt;th>Wikidata&lt;/th>
&lt;th>Getty TGN&lt;/th>
&lt;th>GeoNames&lt;/th>
&lt;th>Wikipedia&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Kaltenbach&lt;/td>
&lt;td>7824222-8&lt;/td>
&lt;td>Q65183925&lt;/td>
&lt;td>7153012&lt;/td>
&lt;td>2893651&lt;/td>
&lt;td>&lt;a href="https://de.wikipedia.org/wiki/Kaltenbach_%28Malsburg-Marzell%29" target="_blank" rel="noopener">https://de.wikipedia.org/wiki/Kaltenbach_(Malsburg-Marzell)&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Luisenheim&lt;/td>
&lt;td>7818883-0&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Marlsburg&lt;/td>
&lt;td>4422940-9&lt;/td>
&lt;td>&lt;/td>
&lt;td>7141027&lt;/td>
&lt;td>2874049&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Marzell&lt;/td>
&lt;td>4422941-0&lt;/td>
&lt;td>&lt;/td>
&lt;td>7129879&lt;/td>
&lt;td>2873068&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Marlsburg-Marzell&lt;/td>
&lt;td>4422938-0&lt;/td>
&lt;td>Q62032&lt;/td>
&lt;td>&lt;/td>
&lt;td>6555902&lt;/td>
&lt;td>&lt;a href="https://de.wikipedia.org/wiki/Malsburg-Marzell" target="_blank" rel="noopener">https://de.wikipedia.org/wiki/Malsburg-Marzell&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Altdorf&lt;/td>
&lt;td>4260757-7&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ettenheim-Altdorf&lt;/td>
&lt;td>10099367-9&lt;/td>
&lt;td>Q47520099&lt;/td>
&lt;td>7216262&lt;/td>
&lt;td>2958031&lt;/td>
&lt;td>&lt;a href="https://de.wikipedia.org/wiki/Altdorf_%28Ettenheim%29" target="_blank" rel="noopener">https://de.wikipedia.org/wiki/Altdorf_(Ettenheim)&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ettenheim&lt;/td>
&lt;td>4015632-1&lt;/td>
&lt;td>Q506871&lt;/td>
&lt;td>1039035&lt;/td>
&lt;td>6558103&lt;/td>
&lt;td>&lt;a href="https://de.wikipedia.org/wiki/Ettenheim" target="_blank" rel="noopener">https://de.wikipedia.org/wiki/Ettenheim&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Stuttgart&lt;/td>
&lt;td>4058282-6&lt;/td>
&lt;td>Q1022&lt;/td>
&lt;td>7004425&lt;/td>
&lt;td>3214105&lt;/td>
&lt;td>&lt;a href="https://de.wikipedia.org/wiki/Stuttgart" target="_blank" rel="noopener">https://de.wikipedia.org/wiki/Stuttgart&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Die oben besprochenen Orte gibt es, wie in der obigen Tabelle dargestellt, als CSV-Datei schon mit GND-ID, Wikidata QID, Getty TGN Identifikations-Nummer, GeoNames ID und Wikipedia Link. So können die einzelnen Schritte dieses Tutorials auch unabhängig voneinander durchgespielt werden.&lt;/p>
&lt;h2 id="reconciliation-service-api">Reconciliation Service API&lt;/h2>
&lt;p>Wie schon beschrieben, wird die &lt;em>Reconciliation Service API&lt;/em> von OpenRefine direkt unterstützt, so dass es dafür entsprechende Komponenten in der Oberfläche von OpenRefine gibt. Über diese Komponenten können Daten mit Datenquellen abgeglichen werden, ohne dass dafür &amp;ldquo;programmiert&amp;rdquo; werden muss.&lt;/p>
&lt;h3 id="gnd">GND&lt;/h3>
&lt;p>Wie der Abgleich mit der &lt;em>lobid gnd API&lt;/em> funktioniert, haben wir bereits in anderen Tutorials besprochen:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/">06 Reconciling mit OpenRefine und der GND&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/">15 Erweiterter GND Abgleich mit lobid&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Prinzipiell sieht die GND Ontology ein Feld für &lt;a href="https://d-nb.info/standards/elementset/gnd#coordinates" target="_blank" rel="noopener">Koordinaten&lt;/a> vor, es gibt aktuell aber keinen Eintrag in der Linked-OpenData-Version der GND, wo diese Eigenschaft gesetzt ist.
Die GND ist für Geokoordinaten trotzdem interessant, da die &lt;em>lobid gnd API&lt;/em> sehr komfortabel zu benutzen ist und wir mit GND-IDs als Ausgangspunkt zu anderen Datenquellen &amp;ldquo;springen&amp;rdquo; können.&lt;/p>
&lt;p>Dafür verwenden wir in unserem OpenRefine Projekt das Spaltenmenü
&amp;ldquo;GND&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Use values as identifiers&amp;hellip;&amp;rdquo;.
In dem Dialog wählen wir dann Service &amp;ldquo;GND reconciliation for OpenRefine&amp;rdquo;. Sollte der Service nicht in der Auswahl stehen, dann nochmal in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/">06 Reconciling mit OpenRefine und der GND&lt;/a> nachlesen, wie man den Service hinzufügt.&lt;/p>
&lt;p>Um basierend auf den Informationen in der GND Links zu anderen Datenquellen nachzuladen, verwenden wir wieder das Spaltenmenü
&amp;ldquo;GND&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add columns from reconciled values&amp;hellip;&amp;rdquo; und suchen dort nach der Eigenschaft &amp;ldquo;Siehe auch&amp;rdquo;.&lt;/p>
&lt;p>In der GND selbst sind eigentlich nur wenig Verlinkungen z.B. zu GeoNames gepflegt.
Aber von der lobid GND Schnittstelle werden zusätzlich Rückverlinkungen z.B. von Wikidata auf die GND gesammelt und mit ausgeliefert.&lt;/p>
&lt;p>Wir haben anschließend eine &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/">Record-Struktur&lt;/a>, da es für einen Ort in der GND mehrere Verlinkungen zu anderen Datenquellen geben kann.&lt;/p>
&lt;p>Mit einem Text Facet können wir die Datenquellen schnell identifizieren.
Dafür Verwenden wir
&amp;ldquo;Siehe auch&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Custom text facet&amp;hellip;&amp;rdquo;
mit dem folgenden GREL-Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/https?:\/\/[^\/]+/&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-bildschirmfoto-des-facets-mit-den-link-quellen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Facets mit den Link Quellen." srcset="
/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/screenshot-openrefine-facet-siehe-auch_hu7a10e03970f9c88aec06c874b21b035b_12058_1c2ff22f5d23a085b0de7c5192284aae.webp 400w,
/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/screenshot-openrefine-facet-siehe-auch_hu7a10e03970f9c88aec06c874b21b035b_12058_aa8804cd1320a1f3a5b45ad442ea3b82.webp 760w,
/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/screenshot-openrefine-facet-siehe-auch_hu7a10e03970f9c88aec06c874b21b035b_12058_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/screenshot-openrefine-facet-siehe-auch_hu7a10e03970f9c88aec06c874b21b035b_12058_1c2ff22f5d23a085b0de7c5192284aae.webp"
width="296"
height="317"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Facets mit den Link Quellen.
&lt;/figcaption>&lt;/figure>
&lt;p>Wie in dem Screenshot in Abbildung 1 zu sehen, haben wir unter anderem Verlinkungen zu Wikipedia, Wikidata und GeoNames.
Die sind für uns interessant, da wir über diese höchstwahrscheinlich Geokoordinaten beziehen können.&lt;/p>
&lt;p>Wie schon im Einleitungstext beschrieben, sind die Verlinkungen teilweise aber auch am vorherigen oder nachfolgenden Geografikum erstellt worden.
Diese Orte können analog zu der Eigenschaft &amp;ldquo;Siehe auch&amp;rdquo; mit &lt;a href="https://d-nb.info/standards/elementset/gnd#precedingPlaceOrGeographicName" target="_blank" rel="noopener">Vorheriges Geografikum&lt;/a> und &lt;a href="https://d-nb.info/standards/elementset/gnd#succeedingPlaceOrGeographicName" target="_blank" rel="noopener">Nachfolgendes Geografikum&lt;/a> nachgeladen werden. Je nach Organisationsstruktur lässt sich auch via &lt;a href="https://d-nb.info/standards/elementset/gnd#place" target="_blank" rel="noopener">Ort&lt;/a> oder &lt;a href="https://d-nb.info/standards/elementset/gnd#hierarchicalSuperiorOfPlaceOrGeographicName" target="_blank" rel="noopener">Administrative Überordnung des Geografikums&lt;/a> ein passendes Geografikum mit Verlinkungen zu anderen Datenquellen nachladen.&lt;/p>
&lt;p>Hier riskiert man es ungenauer zu werden. Nachfolgende oder übergeordnete Geographika tendieren dazu flächenmäßig deutlich größer zu sein, wodurch sich die Positionierung der Geokoordinaten im Vergleich zum eigentlich gemeinten Geografikum deutlich verschieben kann. Es kommt also auf den Anwendungsfall und die Dichte der beschriebenen Orte an.&lt;/p>
&lt;p>Auf einer Europa-Karte wäre ein Geomarker für Kaltenbach mittig auf dem Gebiet von Marlsburg-Marzell weniger problematisch.
Möchte man jedoch die einzelnen Teilorte von Marlsburg-Marzell unterscheiden, dann kann die Strategie des Nachladens von nachfolgenden bzw. übergeordneten Geografika zu Problemen führen.&lt;/p>
&lt;p>Aus den Listen der Verlinkungen zu anderen Datenquellen lassen sich einzelne Spalten generieren.
Das wird im Folgenden für Wikipedia, Wikidata und GeoNames gezeigt.&lt;/p>
&lt;h4 id="wikipedia-url">Wikipedia Url&lt;/h4>
&lt;p>Um eine Spalte mit den deutschsprachigen Wikipedia Urls zu erstellen gehen wir über das Spaltenmenü
&amp;ldquo;Siehe auch&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden in dem Dialog den folgenden GREL-Befehl.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">contains&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;de.wikipedia.org&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="wikidata-qid">Wikidata QID&lt;/h4>
&lt;p>Um eine Spalte mit den Wikidata QIDs zu erstellen, gehen wir über das Spaltenmenü
&amp;ldquo;Siehe auch&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden in dem Dialog den folgenden GREL-Befehl.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">contains&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;wikidata.org&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;/&amp;#34;&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="geonames-id">GeoNames ID&lt;/h4>
&lt;p>Um eine Spalte mit den GeoNames IDs zu erstellen, gehen wir über das Spaltenmenü
&amp;ldquo;Siehe auch&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden in dem Dialog den folgenden GREL-Befehl.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">contains&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;geonames.org&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;/&amp;#34;&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="wikidata">Wikidata&lt;/h3>
&lt;p>Wie der Abgleich mit der &lt;em>Wikidata Reconciliation Service API&lt;/em> funktioniert, haben wir bereits in anderen Tutorials besprochen:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/">07 Reconciling mit OpenRefine und Wikidata&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/">16 Erweiterter Abgleich mit Wikidata&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Um Daten von Wikidata nachladen zu können, verwenden wir in unserem Projekt das Spaltenmenü
&amp;ldquo;Wikidata&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Use values as identifiers&amp;hellip;&amp;rdquo;.
In dem Dialog wählen wir den Service &amp;ldquo;Wikidata reconci.link (de)&amp;rdquo;. Sollte der nicht in der Auswahl stehen, dann nochmal in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/">07 Reconciling mit OpenRefine und Wikidata&lt;/a> nachlesen, wie man den Service hinzufügt. Eine Verwendung des deutschsprachigen Service hilft uns dabei, dass die Spaltennamen der erzeugten Spalten automatisch mit dem entsprechenden deutschsprachigen Bezeichnung versehen werden.&lt;/p>
&lt;p>Von Wikidata aus können wir unterschiedlichste Informationen nachladen.
Für uns interessant sind &lt;a href="https://www.wikidata.org/wiki/Property:P625" target="_blank" rel="noopener">geographische Koordinaten (P625)&lt;/a>, sowie &lt;a href="https://www.wikidata.org/wiki/Property:P1566" target="_blank" rel="noopener">GeoNames-Kennung (P1566)&lt;/a> und &lt;a href="https://www.wikidata.org/wiki/Property:P1667" target="_blank" rel="noopener">TGN-Kennung (P1667)&lt;/a>, falls für den Ort bei Wikidata keine Koordinaten hinterlegt sind.&lt;/p>
&lt;p>Das Nachladen dieser Eigenschaften erfolgt wieder via
&amp;ldquo;Wikidata&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add columns from reconciled values&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;p>Die geographischen Daten im &lt;a href="https://de.wikipedia.org/wiki/World_Geodetic_System_1984" target="_blank" rel="noopener">WGS84 Format&lt;/a> können wir anschließend in separate Spalten für den Breiten- und Längengrad aufteilen.
Dafür verwenden wir das Spaltenmenü
&amp;ldquo;geographische Koordinaten&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split into several columns&amp;hellip;&amp;rdquo;
und verwenden im folgenden Dialog das Trennzeichen &lt;code>,&lt;/code>.
Die erste Spalte beinhaltet dann die geographische Breite &lt;code>lat&lt;/code> und die zweite Spalte die geographische Länge &lt;code>lng&lt;/code> und sollten entsprechend umbenannt werden.&lt;/p>
&lt;h3 id="getty-tgn">Getty TGN&lt;/h3>
&lt;p>Wie der Abgleich mit der &lt;em>Getty Reconciliation Service API&lt;/em> funktioniert, haben wir bereits in einem anderen Tutorial besprochen:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/">17 Erweiterter Abgleich mit Getty&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Haben wir IDs von Getty TGN, dann sollten wir diese zuerst noch umformatieren, um dem Getty Service mitzuteilen, dass es sich um IDs aus dem TGN Katalog handelt. Dafür verwenden wir das Spaltenmenü
&amp;ldquo;Getty TGN&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
mit dem folgenden GREL Ausdruck:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isNull&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;tgn/&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anschließend können wir wie gewohnt die Spalte für das Reconciling vorbereiten
&amp;ldquo;Getty TGN&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Use values as identifiers&amp;hellip;&amp;rdquo;.
In dem Dialog wählen wir den Service &amp;ldquo;Getty Vocabularies Reconciliation Service&amp;rdquo;. Sollte der nicht in der Auswahl stehen, dann nochmal in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/">17 Erweiterter Abgleich mit Getty&lt;/a> nachlesen, wie man den Service hinzufügt.&lt;/p>
&lt;p>Anschließend können wir die Spalte &amp;ldquo;Coordinates&amp;rdquo; nachladen via
&amp;ldquo;Getty TGN&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add columns from reconciled values&amp;hellip;&amp;rdquo;&lt;/p>
&lt;p>Bei Getty ist sowohl die Reihenfolge als auch das Format anders als gewohnt.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="mf">7.733333&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">47.75&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Um die Koordinaten in Breiten- und Längengrad aufzuspalten verwenden wir daher
&amp;ldquo;Coordinates&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
mit den folgenden GREL Ausdrücken.&lt;/p>
&lt;p>Für die geographische Breite (&lt;code>lat&lt;/code>) verwenden wir den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Für die geographische Länge (&lt;code>lng&lt;/code>) verwenden wir den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="allgemeine-api">Allgemeine API&lt;/h2>
&lt;p>Neben der speziellen &lt;em>Reconciliation Service API&lt;/em> gibt es auch allgemeine Programmierschnittstellen (engl. abgekürzt &lt;em>API&lt;/em>) um mit Diensten im Internet zu kommunizieren. Das Abrufen von Daten (Fachsprache &lt;em>GET-Request&lt;/em>) lässt sich in OpenRefine mit dem Dialog zum Hinzufügen von Spalten über URLs umsetzen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialogs-zum-nachladen-von-urls-für-geonames">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialogs zum Nachladen von URLs für GeoNames." srcset="
/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/screenshot-openrefine-add-by-url_hu6245ecfb10cef64a2ad7941666928a2a_65777_fff607e1341027d6f2f19cbbd97fb961.webp 400w,
/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/screenshot-openrefine-add-by-url_hu6245ecfb10cef64a2ad7941666928a2a_65777_72c4cdf951a479c3d952b6318ef00aa4.webp 760w,
/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/screenshot-openrefine-add-by-url_hu6245ecfb10cef64a2ad7941666928a2a_65777_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/screenshot-openrefine-add-by-url_hu6245ecfb10cef64a2ad7941666928a2a_65777_fff607e1341027d6f2f19cbbd97fb961.webp"
width="760"
height="707"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialogs zum Nachladen von URLs für GeoNames.
&lt;/figcaption>&lt;/figure>
&lt;p>Wie in Abbildung 2 gezeigt, lässt sich in dem Dialog pro Zeile im Projekt eine URL zusammenbasteln, deren Inhalte dann von OpenRefine angefragt werden. Die Anfragen lassen sich meistens komplett über die URL steuern, manche Optionen sollten jedoch auch als so genannte &lt;em>HTTP header&lt;/em> gesetzt werden.&lt;/p>
&lt;p>Bei kostenpflichtigen APIs ist das häufig ein Zugangsschlüssel für das &lt;em>Authorization&lt;/em> Feld. Kostenlose Dienste bitten häufig darum z.B. die E-Mailadresse im Feld &lt;em>User-Agent&lt;/em> mit anzugeben. So haben die Betreiber eine Möglichkeit mit euch in Kontakt zu treten, falls ihr unbewusst oder ungewollt gegen die Benutzungsregeln verstoßt. Die Alternative ist, dass die IP-Adresse von euch bzw. euem Arbeitgeber bei groben Regelverstößen direkt gesperrt wird.&lt;/p>
&lt;p>Im Feld &lt;em>Throttle delay&lt;/em> könnt ihr eine automatische Pause zwischen einzelnen Anfragen definieren, um den Dienst nicht mit zu vielen Anfragen nacheinander zu überlasten.&lt;/p>
&lt;p>Als Ergebnis dieser Anfragen erhält man häufig Daten im so genannten &lt;a href="https://www.json.org/json-de.html" target="_blank" rel="noopener">JSON Format&lt;/a>.&lt;/p>
&lt;h3 id="exkursion-zu-json">Exkursion zu JSON&lt;/h3>
&lt;p>Bei &lt;a href="https://www.json.org/json-de.html" target="_blank" rel="noopener">JSON&lt;/a> handelt es sich um ein leichtgewichtiges Textformat für den Datenaustausch.
Für diesen Workshop benötigen wir lediglich ein paar einfache Grundlagen von JSON.&lt;/p>
&lt;p>&lt;strong>Ein Objekt wird in JSON geschweifte Klammern eingefasst:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Hier sind alle Informationen für ein Objekt zusammengefasst
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Informationen in Objekten bestehen aus Schlüssel-Werte-Paaren:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Kaltenbach (Malsburg-Marzell)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">47.75388981&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lon&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">7.72699657&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Informationen können geschachtelt werden:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Kaltenbach (Malsburg-Marzell)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;coordinates&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">47.75388981&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lon&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">7.72699657&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Informationen können mit eckigen Klammern in Listen gespeichert werden:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Kaltenbach (Malsburg-Marzell)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;coordinates&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">47.75388981&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">7.72699657&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="wikipedia-api">Wikipedia API&lt;/h3>
&lt;p>Je nach Projekt kann es sein, dass man eine Liste von Wikipedia URLs hat, für die man Normdaten nachladen möchte.
Für Orte gibt es in Wikipedia auch direkt Geodaten, die man ebenfalls auslesen kann.&lt;/p>
&lt;p>Wikipedia hat eine eigene API, welche unter &lt;a href="https://de.wikipedia.org/api/rest_v1/" target="_blank" rel="noopener">Wikimedia REST API&lt;/a> mit der &lt;a href="https://swagger.io/specification/" target="_blank" rel="noopener">OpenAPI Spezifikation&lt;/a> dokumentiert wird.
In der OpenAPI Spezifikation der Wikimedia REST API gibt es auch nochmal Hinweise auf die Benutzungsregeln, also z.B. dass doch bitte, wie weiter oben beschrieben, identifizierbare &lt;code>User-Agents&lt;/code> verwendet werden.&lt;/p>
&lt;p>Die API Dokumentation ist interaktiv, so dass Anfragen zu den einzelnen Endpunkten direkt ausprobiert und getestet werden können.&lt;/p>
&lt;p>Um die Wikidata QID oder die Geokoordinaten zu einer Wikipedia Seite auszulesen, bietet sich der &lt;a href="https://de.wikipedia.org/api/rest_v1/#/Page%20content/get_page_summary__title_" target="_blank" rel="noopener">Endpunkt für die Seitenzusammenfassung&lt;/a> an.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-interaktiven-openapi-dokumentation-der-wikimedia-rest-api">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der interaktiven OpenAPI Dokumentation der Wikimedia REST API." srcset="
/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/screenshot-openapi-interaktiv_hu7385babe6fc0f651d3b08441ee90368b_98359_c6605ad335677108fae32e871a2ffa8f.webp 400w,
/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/screenshot-openapi-interaktiv_hu7385babe6fc0f651d3b08441ee90368b_98359_67c14b0481ad5d16b5415877af527f48.webp 760w,
/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/screenshot-openapi-interaktiv_hu7385babe6fc0f651d3b08441ee90368b_98359_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/screenshot-openapi-interaktiv_hu7385babe6fc0f651d3b08441ee90368b_98359_c6605ad335677108fae32e871a2ffa8f.webp"
width="735"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der interaktiven OpenAPI Dokumentation der Wikimedia REST API.
&lt;/figcaption>&lt;/figure>
&lt;p>In Abbildung 3 ist das Ergebnis einer interaktiven Anfrage für die &lt;a href="https://de.wikipedia.org/wiki/Kaltenbach_%28Malsburg-Marzell%29" target="_blank" rel="noopener">Wikipedia Seite für Kaltenbach&lt;/a> gezeigt. Über der Anzeige der Rückgabedaten (&lt;em>Response&lt;/em>) gibt es auch die &lt;em>Request URL&lt;/em>, die wir in OpenRefine direkt weiterverwenden können.&lt;/p>
&lt;p>Um die Daten zeilenweise mit OpenRefine über die Wikimedia REST API zu laden, filtern wir zuerst die Zeilen, die eine Wikipedia URL haben über via &amp;ldquo;Wikipedia&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Customized facets&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Facet by blank (null or empty string)&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;p>Anschließend verwenden wir das Spaltenmenü
&amp;ldquo;Wikipedia&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Customized facets&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Facet by blank (null or empty string)&amp;hellip;&amp;rdquo;
und erstellen eine neu Spalte &amp;ldquo;Wikipedia JSON&amp;rdquo; mit dem folgenden GREL Ausdruck (&lt;code>User-Agent&lt;/code>&amp;hellip; nicht vergessen).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;https://de.wikipedia.org/api/rest_v1/page/summary/&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;/&amp;#34;&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;?redirect=true&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Der GREL Ausdruck nimmt den letzten Teil der Wikipedia URL und setzt ihn als Titel an die entsprechende Stelle in der API Anfrage.
Dabei verwenden wir eine URL spezifische Umwandlung von Sonderzeichen.&lt;/p>
&lt;p>Als Resultat erhalten wir in jeder Zeile eine Antwort im so genannten &lt;a href="https://www.json.org/" target="_blank" rel="noopener">JSON Format&lt;/a>, welches hier gekürzt dargestellt wird.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;standard&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Kaltenbach (Malsburg-Marzell)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;wikibase_item&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Q65183925&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lang&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;de&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;coordinates&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">47.75388981&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lon&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">7.72699657&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;extract&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Kaltenbach ist ein Wohnplatz auf 730 m ü. NN, der zur Gemeinde Malsburg-Marzell im Landkreis Lörrach gehört. Die Gemarkungsfläche umfasst 450 Hektar.&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Da wir nur relativ wenig Datenpunkte aus dem JSON extrahieren wollen, machen wir das spaltenweise über
&amp;ldquo;Wikipedia JSON&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;p>Für die geographische Breite (&lt;code>lat&lt;/code>) benötigen wir den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="s2">&amp;#34;coordinates&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s2">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Für die geographische Breite (&lt;code>lng&lt;/code>) benötigen wir den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="s2">&amp;#34;coordinates&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s2">&amp;#34;lon&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Für die Wikidata QID benötigen wir den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="s2">&amp;#34;wikibase_item&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="geonames-api">GeoNames API&lt;/h3>
&lt;p>Für GeoNames gibt es anders als für die Wikimedia REST API (noch) keine OpenAPI Spezifikation.
Hier beschränken wir uns darauf basierend auf der GeoNames ID die zugehörigen Geokoordinaten von dem Service abzurufen.
Hierfür benötigen wir einen Account bei &lt;a href="https://www.geonames.org/" target="_blank" rel="noopener">GeoNames&lt;/a>, da der Benutzername ein Bestandteil der Anfrage ist.&lt;/p>
&lt;p>Zuerst filtern wir Zeilen mit GeoNames IDs via
&amp;ldquo;GeoNames&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Customized facets&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Facet by blank (null or empty string)&amp;hellip;&amp;rdquo;
. Anschließend fügend wir eine neue Spalte hinzu via
&amp;ldquo;GeoNames&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column by fetching URLs&amp;hellip;&amp;rdquo;
, die wir &amp;ldquo;GeoNames JSON&amp;rdquo; nennen.&lt;/p>
&lt;p>In dem GREL Ausdruck für die URL setzen wir dann die GeoNames ID an die vorgesehene Stelle ein.
Diese brauchen wir nicht explizit für URLs aufzubereiten, da sie nur aus Zahlen besteht.&lt;/p>
&lt;p>Nicht vergessen den Parameter &lt;code>USERNAME&lt;/code> mit dem eigenen Benutzernamen zu ersetzen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;http://api.geonames.org/getJSON?formatted=true&amp;amp;geonameId=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;username=USERNAME&amp;amp;style=short&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die JSON kodierte Antwort sieht gekürzt und umsortiert dann etwa wie folgt aus.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;bbox&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;east&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">7.737455174771594&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;south&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">47.74660464350438&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;north&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">47.76459194100723&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;west&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">7.710695459994031&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;accuracyLevel&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;47.7556&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lng&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;7.72408&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Kaltenbach&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;adminName4&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Malsburg-Marzell&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;adminName3&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Landkreis Lörrach&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;adminName2&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Freiburg Region&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;adminName1&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Baden-Wurttemberg&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;countryName&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Germany&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;continentCode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;EU&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Neben dem Längen- und Breitengrad erhalten wir zusätzlich auch ein minimal umgebendes Rechteck (engl. &amp;ldquo;bounding box&amp;rdquo;) und weitere Informationen zu dem angefragten Ort.&lt;/p>
&lt;p>Um die Längen- und Breitengrade in separate Spalten zu überführen, verwenden wir wieder das Spaltenmenü
&amp;ldquo;GeoNames JSON&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;p>Für die geographische Breite (&lt;code>lat&lt;/code>) benötigen wir den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="s2">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Für die geographische Breite (&lt;code>lng&lt;/code>) benötigen wir den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="s2">&amp;#34;lng&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>GeoNames bietet noch deutlich mehr WebServices an um zum Beispiel Orte via Postleitzahlen oder Geokoordinaten zu finden.
Es sind jedoch nicht alle Services kostenfrei, es stehen teilweise Daten nur für einzelne Länder zur Verfügung und teilweise sind die Services auch nur aus den USA nutzbar.&lt;/p>
&lt;h3 id="openstreetmap-api">OpenStreetMap API&lt;/h3>
&lt;p>Das Projekt &lt;a href="https://www.openstreetmap.de/" target="_blank" rel="noopener">OpenStreetMap&lt;/a> sammelt mit Freiwilligen weltweit Geoinformationen, die unter freien Lizenzen weitergenutzt werden können. Hierfür gibt es unterschiedliche APIs um auf die Daten zuzugreifen.&lt;/p>
&lt;p>Zwei dieser APIs verwenden wir in diesem Tutorial, um Geokoordinaten für Orte abzurufen, ohne sie davor mit Normdaten abzugleichen.&lt;/p>
&lt;p>Da OpenStreetMap teilweise sehr genaue Daten hat, können wir darüber auch deutlich genauere Geokoordinaten z.B. auf Gebäude- oder Straßenebene abrufen. Das sind Informationen, die aus Relevanzgründen in den bisher besprochenen Datenquellen nicht erfasst sind.&lt;/p>
&lt;p>Die Arbeit mit den Ergebnissen dieser Suchdienste in OpenRefine ist jedoch nicht ganz so komfortabel, wie mit der &lt;em>Reconciliation Service API&lt;/em>.&lt;/p>
&lt;h4 id="photon">Photon&lt;/h4>
&lt;p>&lt;a href="https://photon.komoot.io/" target="_blank" rel="noopener">Photon&lt;/a> ist ein Service von der Outdoor-Routenplanung-Plattform &lt;a href="https://www.komoot.com/" target="_blank" rel="noopener">Komoot&lt;/a>.
Der Service wird als &lt;a href="https://github.com/komoot/photon" target="_blank" rel="noopener">OpenSource Projekt auf GitHub&lt;/a> zur Verfügung gestellt.
Das bedeutet, dass man sowohl die öffentliche API unter &lt;a href="https://photon.komoot.io/" target="_blank" rel="noopener">Photon&lt;/a> nutzen, als auch diesen Dienst intern selbst betreiben kann. Das ist gerade für größere Projekte interessant, bei denen es schwer fällt die &lt;em>fair use&lt;/em> Bedingungen von öffentlichen APIs einzuhalten.&lt;/p>
&lt;p>Die Datenbasis ist hier die gleiche, wie für die Nominatim Schnittstelle, die wir uns im nächsten Abschnitt ansehen.&lt;/p>
&lt;p>In Photon können wir die Daten semi-strukturiert eingeben und auf Basis von Layern einschränken.
Dafür laden wir die Daten zeilenweise via
&amp;ldquo;Ort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column by fetching URLs&amp;hellip;&amp;rdquo;
in die neue Spalte &amp;ldquo;Photon JSON&amp;rdquo; mit dem folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;https://photon.komoot.io/api?q=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;, Baden-Württemberg&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;layer=city&amp;amp;layer=district&amp;amp;lang=de&amp;amp;limit=3&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Zusätzlich zum Ortsnamen (&lt;code>value&lt;/code>) ergänzen wir noch den Begriff &amp;ldquo;Baden-Württemberg&amp;rdquo;, um die Suchergebnisse besser einzuschränken.
Hier könnten wir auch noch mehr Daten einbinden, wie Landkreise usw., wenn wir diese Daten denn vorliegen haben.&lt;/p>
&lt;p>Die Rückgabedaten erhalten wir wieder im JSON Format, wie im folgenden Beispiel verkürzt dargestellt.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;features&amp;#34;&lt;/span>&lt;span class="p">:[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;geometry&amp;#34;&lt;/span>&lt;span class="p">:{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;coordinates&amp;#34;&lt;/span>&lt;span class="p">:[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mf">8.239959&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mf">48.7610716&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Point&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Feature&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;properties&amp;#34;&lt;/span>&lt;span class="p">:{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Baden-Baden&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;state&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Baden-Württemberg&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;country&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Deutschland&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;city&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;geometry&amp;#34;&lt;/span>&lt;span class="p">:{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;coordinates&amp;#34;&lt;/span>&lt;span class="p">:[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mf">7.7255337&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mf">47.7549089&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Point&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Feature&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;properties&amp;#34;&lt;/span>&lt;span class="p">:{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Kaltenbach&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;city&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Malsburg-Marzell&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;county&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Landkreis Lörrach&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;state&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Baden-Württemberg&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;country&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Deutschland&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;district&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;FeatureCollection&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anders als bei dem Beispiel mit GeoNames erhalten wir mehrere Ergebnisse, wo wir uns zuerst noch für das passende Ergebnis entscheiden sollten. Dafür nutzen wir das erworbene Wissen aus &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/">10 Arbeiten mit Records&lt;/a>, so dass jedes Ergebnis in einer eigenen Zeile steht.
Das funktioniert über das Spaltenmenü
&amp;ldquo;Photon JSON&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
mit dem folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="s2">&amp;#34;features&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>&lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;||&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anschließend erzeugen wir die Record-Struktur über
&amp;ldquo;Photon JSON&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split multi-valued cells&amp;hellip;&amp;rdquo;
mit dem Trennzeichen &lt;code>||&lt;/code>.&lt;/p>
&lt;p>Um die Ergebnisse im JSON Format besser lesbar zu machen, formatieren wir die Spalte noch via
&amp;ldquo;Photon JSON&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
und verwenden diesmal &lt;strong>Python&lt;/strong> anstatt GREL um das JSON lesbar zu formatieren.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dumps&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">loads&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">indent&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Jetzt können wir die einzelnen Zeilen mit den passenden Ergebnissen zum Beispiel mit Sternchen markieren und anschließend filtern.
Wir können uns bei der Auswahl aber auch von OpenRefine etwas helfen lassen.&lt;/p>
&lt;p>Zum Beispiel können wir via
&amp;ldquo;Photon JSON&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;.
eine neue Spalte mit dem Namen &amp;ldquo;Photon Match&amp;rdquo; hinzufügen.&lt;/p>
&lt;p>Im GREL Ausdruck greifen wir auf Funktionen zurück, die wir auch im Teil zu &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/05-clustering/">Clustering mit OpenRefine&lt;/a> besprochen haben. Hier vergleichen wir konkret den Namen des Ortes mit der Eigenschaft &lt;code>name&lt;/code> in JSON, mit den Methoden &lt;a href="https://openrefine.org/docs/manual/grelfunctions#phonetics-s-encoding" target="_blank" rel="noopener">Cologne Phonetic&lt;/a> und &lt;a href="https://openrefine.org/docs/manual/grelfunctions#fingerprints" target="_blank" rel="noopener">Fingerprint&lt;/a>. Sollte der Vergleich einer der beiden Methoden übereinstimmen, wird &lt;code>true&lt;/code> in der neuen Spalte gespeichert. Das können wir dann wieder zum Filtern von (möglicherweise) passenden Ergebnissen nutzen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Ort&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">ort&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="s2">&amp;#34;properties&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s2">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nx">json_name&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">or&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">phonetic&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">ort&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;cologne&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="nx">phonetic&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">json_name&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;cologne&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">fingerprint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">ort&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="nx">fingerprint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">json_name&lt;/span>&lt;span class="p">))))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die Geokoordinaten selbst extrahieren wir wieder über das Spaltenmenü
&amp;ldquo;Photon JSON&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;p>Für die geographische Breite (&lt;code>lat&lt;/code>) benötigen wir den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s2">&amp;#34;geometry&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s2">&amp;#34;coordinates&amp;#34;&lt;/span>&lt;span class="p">](&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Für die geographische Breite (&lt;code>lng&lt;/code>) benötigen wir den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s2">&amp;#34;geometry&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s2">&amp;#34;coordinates&amp;#34;&lt;/span>&lt;span class="p">](&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Generell ist die Photon API durch die relativ freie Textsuche recht einfach zu benutzen.
Es gibt aber auch schnell Falsch-Positive, weil z.B. der zusätzliche Suchbegriff &amp;ldquo;&lt;strong>Baden&lt;/strong>-Württemberg&amp;rdquo; zu einem hohen Ranking der Orte &amp;ldquo;&lt;strong>Baden&lt;/strong>-&lt;strong>Baden&lt;/strong>&amp;rdquo; und &amp;ldquo;&lt;strong>Baden&lt;/strong>weiler&amp;rdquo; führt.&lt;/p>
&lt;h4 id="nominatim">Nominatim&lt;/h4>
&lt;p>&lt;a href="https://nominatim.org/" target="_blank" rel="noopener">Nominatim&lt;/a> ist die offizielle &lt;a href="https://github.com/osm-search/Nominatim" target="_blank" rel="noopener">OpenSource Suchmaschine zur Arbeit mit Daten in OpenStreetMap&lt;/a>.
Für unseren Anwendungsfall verwenden wir den &lt;a href="https://nominatim.org/release-docs/develop/api/Search/" target="_blank" rel="noopener">Search Endpunkt der Nominatim API&lt;/a>. Im Gegensatz zu der recht einfach gehaltenen Photon API, können wir die Daten bei Nominatim auch strukturiert übermitteln.
Außerdem kann zwischen verschiedenen Rückgabeformaten gewählt werden.&lt;/p>
&lt;p>Wir laden die Daten zeilenweise via
&amp;ldquo;Ort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column by fetching URLs&amp;hellip;&amp;rdquo;
in die neue Spalte &amp;ldquo;Nominatim JSON&amp;rdquo; mit dem folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;https://nominatim.openstreetmap.org/search?city=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;state=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Baden-Württemberg&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;countrycodes=de&amp;amp;featureType=city,settlement&amp;amp;format=jsonv2&amp;amp;limit=3&amp;amp;email=YOUR_MAIL_ADDRESS&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Hier nicht vergessen am Ende den Platzhalter durch die eigene E-Mailadresse zu ersetzen.&lt;/p>
&lt;p>Das im folgenden gezeigte und gekürzte Ergebnis ist etwas weniger strukturiert wie das von Photon, was die Aufarbeitung jedoch vereinfacht.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Kaltenbach&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;display_name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Kaltenbach, Malsburg-Marzell, Verwaltungsgemeinschaft Kandern, Landkreis Lörrach, Baden-Württemberg, 79429, Deutschland&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;village&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;47.7549089&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lon&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;7.7255337&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;licence&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Kaltenbach&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;display_name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Kaltenbach, Forbach, Landkreis Rastatt, Baden-Württemberg, Deutschland&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;isolated_dwelling&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;48.6319441&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lon&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;8.357038733877207&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;licence&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wie bei der Arbeit mit den Ergebnissen von Photon arbeiten wir wieder mit &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/">Records&lt;/a>, so dass jedes Ergebnis in einer eigenen Zeile steht.
Das funktioniert über das Spaltenmenü
&amp;ldquo;Nominatim JSON&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
mit dem folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;||&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anschließend erzeugen wir die Record-Struktur über
&amp;ldquo;Nominatim JSON&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split multi-valued cells&amp;hellip;&amp;rdquo;
mit dem Trennzeichen &lt;code>||&lt;/code>.&lt;/p>
&lt;p>Um die Ergebnisse im JSON Format besser lesbar zu machen, formatieren wir die Spalte wieder via
&amp;ldquo;Nominatim JSON&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
und verwenden wieder &lt;strong>Python&lt;/strong> anstatt GREL um das JSON lesbar zu formatieren.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dumps&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">loads&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">indent&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Nachdem wir die passenden Ergebnisse ausgewählt und gefiltert haben, extrahieren wir die Geokoordinaten wieder über das Spaltenmenü
&amp;ldquo;Nominatim JSON&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;p>Für die geographische Breite (&lt;code>lat&lt;/code>) benötigen wir den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">](&lt;/span>&lt;span class="s2">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Für die geographische Breite (&lt;code>lng&lt;/code>) benötigen wir den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">](&lt;/span>&lt;span class="s2">&amp;#34;lon&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Hat man die Daten schon einigermaßen strukturiert vorliegen, dann liefert die Nominatim API in unseren Experimenten passendere Ergebnisse als Photon. Wir haben hier aber auch nur einen kleinen Teil der API getestet und genutzt.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Arbeitet man sowieso mit Normdaten, so lassen sich je nach Datenlage Geokoordinaten mit OpenRefine aus der genutzten oder einer verknüpften Normdatenquelle über die &lt;em>Reconciliation Service API&lt;/em> nachladen.
In einigen Fällen kann man die Ergebnisse mit einfachen API Anfragen an Wikipedia oder GeoNames vervollständigen.&lt;/p>
&lt;p>Möchte man genauere Geokoordinaten zum Beispiel auf Adressebene, dann lohnt sich ein Blick auf die OpenStreepMap APIs.&lt;/p>
&lt;p>Es gibt noch viele andere Geocoding APIs von hauptsächlich kommerziellen Anbietern mit einem bestimmten Freikontingent an Anfragen.
Diese können mit OpenRefine ähnlich genutzt werden, wie bei den OpenStreetMap APIs beschrieben.&lt;/p>
&lt;p>Ein ähnliches Projekt zur Arbeit mit OpenRefine und WebAPIs haben wir bei &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/">Entfernungen zu GPX Tracks mit OpenRefine ermitteln&lt;/a> dokumentiert.&lt;/p>
&lt;h2 id="lizenzhinweise">Lizenzhinweise&lt;/h2>
&lt;p>Dieser Artikel und die Bildschirmfotos enthalten Informationen aus der &lt;a href="https://www.geonames.org/" target="_blank" rel="noopener">GeoNames geographische Datenbank&lt;/a>, welche verfügbar ist unter der &lt;a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="noopener">CC BY 4.0 Lizenz&lt;/a>.&lt;/p>
&lt;p>Dieser Artikel und die Bildschirmfotos enthalten Informationen aus &lt;a href="https://www.openstreetmap.org/" target="_blank" rel="noopener">OpenStreetMap&lt;/a>, welche verfügbar sind unter der &lt;a href="https://opendatacommons.org/licenses/odbl/1-0/" target="_blank" rel="noopener">ODbL 1.0&lt;/a>.&lt;/p>
&lt;p>Dieser Artikel und die Bildschirmfotos enthalten Informationen aus dem &lt;a href="https://www.getty.edu/research/tools/vocabularies/tgn/index.html" target="_blank" rel="noopener">Thesaurus of Geographic Names (TGN) ®&lt;/a>, welcher verfügbar ist unter der &lt;a href="https://opendatacommons.org/licenses/by/1-0/" target="_blank" rel="noopener">ODC Attribution License v1.0&lt;/a>.&lt;/p>
&lt;p>Dieser Artikel und die Bildschirmfotos enthalten Informationen aus &lt;a href="https://de.wikipedia.org/" target="_blank" rel="noopener">Wikipedia&lt;/a>, welche verfügbar sind unter der &lt;a href="https://creativecommons.org/licenses/by-sa/4.0" target="_blank" rel="noopener">CC BY SA 4.0 Lizenz&lt;/a>.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns mit dem erweiterten Möglichkeiten zum Clustering mit OpenRefine.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering" class="btn btn-primary px-3 py-3">19 Erweitertes Clustering&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Erweiterter Abgleich mit Getty</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/</link><pubDate>Wed, 01 Mar 2023 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/</guid><description>&lt;p>In diesem Tutorial vertiefen wir den Abgleich von Daten mit den Vokabularen von Getty.&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>Reconciling in der &lt;a href="https://docs.openrefine.org/manual/reconciling" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;br>
Getty Research Institute zu &lt;a href="https://www.getty.edu/research/tools/vocabularies/obtain/openrefine.html" target="_blank" rel="noopener">OpenRefine Reconciliation&lt;/a>.&lt;br>
Tutorial zur &lt;a href="https://www.getty.edu/research/tools/vocabularies/obtain/getty_vocabularies_openrefine_tutorial.pdf" target="_blank" rel="noopener">Verwendung des Getty Vokabulars in OpenRefine&lt;/a>.&lt;br>
Portal zu &lt;a href="http://vocab.getty.edu/" target="_blank" rel="noopener">Getty Vokabularen in ihrer LOD Form&lt;/a>.&lt;br>
Sammlung von &lt;a href="http://vocab.getty.edu/doc/queries/" target="_blank" rel="noopener">Beispielanfragen mit SPARQL&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;p>Das &lt;a href="https://www.getty.edu/" target="_blank" rel="noopener">Getty Research Institute&lt;/a> verwaltet verschiedene Vokabulare:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.getty.edu/research/tools/vocabularies/aat/index.html" target="_blank" rel="noopener">Art &amp;amp; Architecture Thesaurus (AAT) ®&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.getty.edu/research/tools/vocabularies/cona/index.html" target="_blank" rel="noopener">Cultural Objects Name Authority (CONA) ®&lt;/a> (noch nicht veröffentlicht)&lt;/li>
&lt;li>&lt;a href="https://www.getty.edu/research/tools/vocabularies/tgn/index.html" target="_blank" rel="noopener">Getty Thesaurus of Geographic Names (TGN) ®&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.getty.edu/research/tools/vocabularies/ulan/index.html" target="_blank" rel="noopener">Union List of Artist Names (ULAN) ®&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="alert alert-note">
&lt;div>
Anders als die &lt;a href="https://creativecommons.org/publicdomain/zero/1.0/deed.de" target="_blank" rel="noopener">quasi gemeinfrei&lt;/a> verfügbaren Daten in der GND und in Wikidata, sind die Daten von Getty unter der &lt;a href="https://opendatacommons.org/licenses/by/1-0/" target="_blank" rel="noopener">Open Data Commons Attribution License (OCD-BY) v1.0&lt;/a> veröffentlicht.
&lt;/div>
&lt;/div>
&lt;p>Die Getty Vokabulare stehen in verschiedenen Formaten zum Download zur Verfügung und sind über unterschiedliche APIs abrufbar.
Wir interessieren uns hier explizit für die &lt;a href="https://www.getty.edu/research/tools/vocabularies/obtain/openrefine.html" target="_blank" rel="noopener">OpenRefine Reconciliation API&lt;/a>.
Bei entsprechenden Kenntnissen ist es womöglich interessanter direkt über die &lt;a href="https://data.getty.edu/vocab/sparql-ui" target="_blank" rel="noopener">SPARQL Oberfläche&lt;/a> mit den Vokabularen zu arbeiten, oder über OpenRefine den &lt;a href="https://data.getty.edu/vocab/sparql" target="_blank" rel="noopener">SPARQL Endpunkt&lt;/a> anzusprechen.
Für die Arbeit mit &lt;a href="https://www.w3.org/TR/sparql11-overview/" target="_blank" rel="noopener">SPARQL&lt;/a> gibt es auch eine &lt;a href="http://vocab.getty.edu/doc/queries/" target="_blank" rel="noopener">Sammlung von Beispielanfragen&lt;/a>.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
Im FDMLab verwenden wir die Vokabulare von Getty bisher nicht, so dass die hier gezeigten Methoden sehr wahrscheinlich unvollständig sind.
&lt;/div>
&lt;/div>
&lt;h2 id="aufgabe-1-daten-verknüpfen">Aufgabe 1: Daten verknüpfen&lt;/h2>
&lt;h3 id="projekt-anlegen">Projekt anlegen&lt;/h3>
&lt;p>Hier verwenden wir das gleiche Datenbeispiel, wie bei &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/#aufgabe-2-daten-verkn%c3%bcpfen">Aufgabe 2 von 07 Reconciling mit OpenRefine und Wikidata&lt;/a>.&lt;/p>
&lt;p>Es handelt sich um eine Liste der Mitgliedstaaten der Europäischen Union (Stand März 2023).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl"> - Belgien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Bulgarien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Dänemark
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Deutschland
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Estland
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Finnland
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Frankreich
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Griechenland
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Irland
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Italien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Kroatien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Lettland
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Litauen
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Luxemburg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Malta
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Niederlande
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Österreich
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Polen
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Portugal
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Rumänien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Schweden
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Slowakei
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Slowenien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Spanien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Tschechien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Ungarn
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Zypern
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wir legen diese Liste via Zwischenablage (&amp;ldquo;Clipboard&amp;rdquo;) als OpenRefine Projekt an.&lt;/p>
&lt;h3 id="einfacher-abgleich">Einfacher Abgleich&lt;/h3>
&lt;p>Nachdem wir die Daten aufgeräumt haben, starten wir den Abgleich mit Getty via
&amp;ldquo;Land&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo;
und fügen den folgenden Standard Service hinzu:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">https://services.getty.edu/vocab/reconcile/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-bildschirmfoto-der-einstellungen-für-den-reconciliation-vorgang-mit-getty---typeinschränkung">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Einstellungen für den Reconciliation Vorgang mit Getty - Typeinschränkung." srcset="
/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/screenshot-openrefine-reconciliation-getty-settings-01_hu83f508489f44879cd82bdb9e9f5f78fc_23334_d8a9b04a0931edf372c40f6377b2f834.webp 400w,
/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/screenshot-openrefine-reconciliation-getty-settings-01_hu83f508489f44879cd82bdb9e9f5f78fc_23334_e58a0d037e50e82768890594af8f5ed6.webp 760w,
/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/screenshot-openrefine-reconciliation-getty-settings-01_hu83f508489f44879cd82bdb9e9f5f78fc_23334_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/screenshot-openrefine-reconciliation-getty-settings-01_hu83f508489f44879cd82bdb9e9f5f78fc_23334_d8a9b04a0931edf372c40f6377b2f834.webp"
width="760"
height="495"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Einstellungen für den Reconciliation Vorgang mit Getty - Typeinschränkung.
&lt;/figcaption>&lt;/figure>
&lt;p>Wie in Abbildung 1 zu sehen, gibt es bei den Getty Vokabularen keine spezifischen Typeinschränkungen, wie wir sie von der lobid gnd oder Wikidata kennen. Wir können uns hier lediglich auf einzelne Vokabulare beschränken.&lt;/p>
&lt;p>Trotz englischsprachigem Vokabular und deutschsprachigen Suchbegriffen, bekommen wir bei unserem Reconciliation Vorgang passende Ergebnisse von TGN vorgeschlagen.&lt;/p>
&lt;p>Das liegt daran, dass der gesuchte Begriff nicht nur im Namen der Entität gesucht wird, sondern in mehreren Feldern. &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>
So finden wir mit dem deutschsprachigen Begriff &amp;ldquo;Deutschland&amp;rdquo; auch das passende &amp;ldquo;Germany&amp;rdquo; im TGN.
Gleichzeitig können dadurch auch unerwartete Ergebnisse mit hoher Trefferquote auftauchen, da wir nicht beeinflussen können, welche Felder alles durchsucht werden sollen.&lt;/p>
&lt;h3 id="erweiterter-abgleich">Erweiterter Abgleich&lt;/h3>
&lt;p>Wir können bei den Getty Vokabularen zwar nicht explizit nach Typen filtern, wir können die Bewertung der Suchergebnisse jedoch positiv beeinflussen. Dazu erweitern wir das Projekt.&lt;/p>
&lt;ol>
&lt;li>Wir fügen eine Kopie der Spalte &amp;ldquo;Land&amp;rdquo; via
&amp;ldquo;Land&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
mit dem Namen &amp;ldquo;Land2&amp;rdquo; hinzu.&lt;/li>
&lt;li>Von der Spalte &amp;ldquo;Land2&amp;rdquo; legen wir eine weitere Kopie via
&amp;ldquo;Land2&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
an und nennen die neue Spalte &amp;ldquo;Label&amp;rdquo;.&lt;/li>
&lt;li>Neben der Spalte &amp;ldquo;Label&amp;rdquo; erzeugen wir eine neue Spalte via
&amp;ldquo;Label&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und nennen die neue Spalte &amp;ldquo;Art des Ortes&amp;rdquo; und verwenden als Wert den Text &lt;code>&amp;quot;nation&amp;quot;&lt;/code>.&lt;/li>
&lt;/ol>
&lt;p>Das Ergebnis der drei Operationen kann in einem Ausschnitt in Abbildung 3 betrachtet werden.&lt;/p>
&lt;p>Anschließend können wir einen neuen Reconciliation Vorgang auf der Spalte &amp;ldquo;Land2&amp;rdquo; starten und zusätzlich wie in Abbildung 2 die Spalte &amp;ldquo;Label&amp;rdquo; als Eigenschaft &lt;code>label&lt;/code> und die Spalte &amp;ldquo;Art des Ortes&amp;rdquo; als Eigenschaft &lt;code>placeTypePref&lt;/code> verwenden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-einstellungen-für-den-reconciliation-vorgang-mit-getty---zusätzliche-eigenschaften">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Einstellungen für den Reconciliation Vorgang mit Getty - Zusätzliche Eigenschaften." srcset="
/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/screenshot-openrefine-reconciliation-getty-settings-02_hu72011706122c888c932e114efa380d54_28173_37c3591a29b0330934832d7dfc2dc7ea.webp 400w,
/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/screenshot-openrefine-reconciliation-getty-settings-02_hu72011706122c888c932e114efa380d54_28173_b4838555035030b6434688e54e9d4366.webp 760w,
/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/screenshot-openrefine-reconciliation-getty-settings-02_hu72011706122c888c932e114efa380d54_28173_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/screenshot-openrefine-reconciliation-getty-settings-02_hu72011706122c888c932e114efa380d54_28173_37c3591a29b0330934832d7dfc2dc7ea.webp"
width="760"
height="493"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Einstellungen für den Reconciliation Vorgang mit Getty - Zusätzliche Eigenschaften.
&lt;/figcaption>&lt;/figure>
&lt;p>Das hat zur Folge, dass die von uns gesuchten Länder im Vergleich zu den anderen Ergebnissen deutlich besser bewertet werden und in der Sortierung nach oben rutschen.&lt;/p>
&lt;p>Mit der Spalte &amp;ldquo;Label&amp;rdquo;, bzw. dem Mapping auf die Eigenschaft &lt;code>label&lt;/code> beim Reconciliation Vorgang, geben wir den Ergebnissen einen &amp;ldquo;boost&amp;rdquo;, die den deutschsprachigen Namen des Landes explizit als deutsche Übersetzung haben.&lt;/p>
&lt;p>Mit der Spalte &amp;ldquo;Art des Ortes&amp;rdquo;, bzw. dem Mapping auf die Eigenschaft &lt;code>placeTypePref&lt;/code>, bekommen die Ergebnisse einen &amp;ldquo;boost&amp;rdquo;, die als Land eingestuft werden.&lt;/p>
&lt;p>Wie in Abbildung 3 an den Beispielen Luxemburg und Malta zu sehen, können wir die gesuchten Länder somit von den restlichen Treffern differenzieren und einfacher zuordnen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-ergebnisse-des-abgleichs-mit-getty">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Ergebnisse des Abgleichs mit Getty." srcset="
/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/screenshot-openrefine-reconciliation-getty-results_hu17661db05f4546dbc7c7c7e4a3d77a03_56319_c8c88d201866c7597ccbacbc8ada2aa4.webp 400w,
/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/screenshot-openrefine-reconciliation-getty-results_hu17661db05f4546dbc7c7c7e4a3d77a03_56319_1dee3f13e1d782699dc73353740cc190.webp 760w,
/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/screenshot-openrefine-reconciliation-getty-results_hu17661db05f4546dbc7c7c7e4a3d77a03_56319_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/screenshot-openrefine-reconciliation-getty-results_hu17661db05f4546dbc7c7c7e4a3d77a03_56319_c8c88d201866c7597ccbacbc8ada2aa4.webp"
width="760"
height="722"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Ergebnisse des Abgleichs mit Getty.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Die Bewertung der Suchtreffer bei Getty ist etwas gewöhnungsbedürftig, jedoch können wir uns das zu Nutze machen, um die Bewertung der Suchanfragen auf unsere Daten anzupassen.&lt;/p>
&lt;p>Die dann doch recht eingeschränkten Such- und Filteroptionen könnten erklären, weshalb Wissenschaftler dann doch lieber direkt mit einem Datendownload der Vokabulare, oder der SPARQL Schnittstelle arbeiten.&lt;/p>
&lt;h2 id="lizenzhinweise">Lizenzhinweise&lt;/h2>
&lt;p>Dieser Artikel und die Bildschirmfotos enthalten Informationen aus dem &lt;a href="https://www.getty.edu/research/tools/vocabularies/tgn/index.html" target="_blank" rel="noopener">Thesaurus of Geographic Names (TGN) ®&lt;/a>, welcher verfügbar ist unter der &lt;a href="https://opendatacommons.org/licenses/by/1-0/" target="_blank" rel="noopener">ODC Attribution License v1.0&lt;/a>.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns mit dem Nachladen von Geokoordinaten für Orte.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten" class="btn btn-primary px-3 py-3">16 Erweiterter Abgleich mit Getty&lt;/a>
&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Wir konnten keine aktuellen Informationen finden, welche Felder bei welchen Vokabularen standardmäßig durchsucht werden.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Workshop - Erweiterter Abgleich mit Wikidata</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/</link><pubDate>Wed, 01 Mar 2023 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/</guid><description>&lt;p>In diesem Tutorial vertiefen wir den Abgleich von Daten mit Wikibase Instanzen wie Wikidata.&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>Reconciling in der &lt;a href="https://docs.openrefine.org/manual/reconciling" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;br>
Informationssammlung zu &lt;a href="https://wikidata.reconci.link/" target="_blank" rel="noopener">OpenRefine Wikidata Reconciliation&lt;/a>.&lt;br>
&lt;a href="https://openrefine-wikibase.readthedocs.io/en/latest/index.html" target="_blank" rel="noopener">OpenRefine Wikibase Dokumentation&lt;/a>.&lt;br>
&lt;a href="https://gitlab.com/nfdi4culture/ta1-data-enrichment/openrefine-wikibase" target="_blank" rel="noopener">OpenRefine Wikibase Projekt&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;p>Auch wenn das Protokoll zum Durchführen eines Abgleichs über eine &lt;a href="https://reconciliation-api.github.io/specs/latest/" target="_blank" rel="noopener">Reconciliation Service API&lt;/a> standardisiert ist, so ist die konkrete Umsetzung der Suchfunktionalität von Dienst zu Dienst unterschiedlich.&lt;/p>
&lt;p>Um dies zu zeigen, verwenden wir ähnliche Daten wie in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/#aufgabe-2-nutzung-in-openrefine">Aufgabe 2 von Erweiterter GND Abgleich mit lobid&lt;/a>.
Diesmal gleichen wir die Daten jedoch mit &lt;a href="https://www.wikidata.org/" target="_blank" rel="noopener">Wikidata&lt;/a> ab.
Diese Plattform basiert auf der Software &lt;a href="https://wikiba.se/" target="_blank" rel="noopener">Wikibase&lt;/a> und kann mit &lt;a href="https://gitlab.com/nfdi4culture/ta1-data-enrichment/openrefine-wikibase" target="_blank" rel="noopener">OpenRefine-Wikibase&lt;/a> um eine &lt;a href="https://reconciliation-api.github.io/" target="_blank" rel="noopener">Reconciliation Service API&lt;/a> erweitert werden.&lt;/p>
&lt;p>Wie schon in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/">Reconciling mit OpenRefine und Wikidata&lt;/a> beschrieben, ist in OpenRefine standardmäßig schon der englischsprachige Service für Wikidata aktiviert.
Es ist aber auch möglich den Service in einer spezifischen Sprache zu verwenden.&lt;/p>
&lt;p>Wir verwenden in diesem Tutorial die deutschsprachige Schnittstelle über:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">https://wikidata.reconci.link/de/api
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="aufgabe-1-abgleich-mit-wikidata">Aufgabe 1: Abgleich mit Wikidata&lt;/h2>
&lt;p>Wir benötigen die folgenden Dateien als OpenRefine Projekt:&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/16_kretschmann-kabinett-iii-mit-fehlern.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kretschmann Kabinett III mit Fehlern&lt;/a>
&lt;p>In dieser Datei ist das Kabinett Kretschmann III.
Wie in Abbildung 1 zu erkennen, sind die Namen mit OCR üblichen Fehlern versehen.
Wir ignorieren die Spalte &amp;ldquo;QID&amp;rdquo;, mit der wir die Namen sofort wieder korrekt aus Wikidata nachladen könnten.
Diese Spalte benötigen wir später zur schnellen Überprüfung der Ergebnisse. Unser Szenario lautet wieder: Wir haben eine Liste mit Namen, deren genaue Schreibweise wir nicht kennen, können diese Namen für den Abgleich jedoch mit einem ungefähren Geburtsdatum und einem Geburtsort ergänzen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-direkt-nach-dem-import">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes direkt nach dem Import." srcset="
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-datenset_hud64c547331e2ac5280ba5bb7ce2ff844_29044_95fc74b3c48d0e0e6681bc7e950ac62e.webp 400w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-datenset_hud64c547331e2ac5280ba5bb7ce2ff844_29044_c0827939165853712852855ff32cf722.webp 760w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-datenset_hud64c547331e2ac5280ba5bb7ce2ff844_29044_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-datenset_hud64c547331e2ac5280ba5bb7ce2ff844_29044_95fc74b3c48d0e0e6681bc7e950ac62e.webp"
width="507"
height="308"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes direkt nach dem Import.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="transformation-1-name-fuzzy">Transformation 1: Name fuzzy&lt;/h3>
&lt;p>Die Daten in der Spalte &amp;ldquo;Name&amp;rdquo; beinhaltet nicht ganz so viele OCR-Fehler, wie in der Aufgabe zum Abgleich mit der lobid.
Das liegt daran, dass beim OpenRefine-Wikidata Reconciliation Service zwar angegeben werden kann, dass der Name &lt;em>fuzzy&lt;/em> gematcht werden soll.
Anders als bei der lobid gnd API lässt sich jedoch nicht angeben, wie viele Fehler erlaubt sein dürfen. &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p>
&lt;p>Auch hier fügen wir jedem Wort, welches Fehler beinhalten könnte, den Fuzzy-Operator &lt;code>~&lt;/code> hinzu.
Dafür transformieren wir die Spalte via
&amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
und fügen mit dem folgenden GREL Ausdruck zu jedem Wort &lt;code>~&lt;/code> hinzu.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;~&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-warning">
&lt;div>
Die Kombination aus Bindestrich &lt;code>-&lt;/code> und Fuzzy-Operator &lt;code>~&lt;/code> scheint zu Problemen zu führen, weshalb wir den Fuzzy-Operator bei dem Nachnamen von Nicole Hoffmeister-Kraut wieder entfernen.
&lt;/div>
&lt;/div>
&lt;h3 id="transformation-2-geburtsdatum-reduzieren">Transformation 2: Geburtsdatum reduzieren&lt;/h3>
&lt;p>Auch bei Wikidata haben wir das Problem, dass uns teilweise nur das Geburtsjahr bekannt ist bzw. umgekehrt in Wikidata nur das Geburtsjahr eingetragen wurde. Bei Wikidata haben wir jedoch kein Wildcard-Zeichen zur Verfügung und müssen uns daher anders behelfen.&lt;/p>
&lt;p>Mit so genannten &lt;em>subfields&lt;/em> können wir beim Reconciliation Vorgang wie in Abbildung 3 direkt angeben, dass es sich bei den Daten in unserer Spalte um eine Jahresangabe aus einem Datum handelt. Um das einheitlich zu handhaben entfernen wir in der Spalte &amp;ldquo;Geburtsdatum&amp;rdquo; den Geburtsmonat und den Geburtstag, sofern vorhanden.
Das funktioniert via
&amp;ldquo;Geburtsdatum&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
und dem folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;-&amp;#34;&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="subfields">Subfields&lt;/h4>
&lt;p>Die &amp;ldquo;Unterfelder&amp;rdquo; werden nicht bei den Daten selbst erfasst, sondern im Mapping der Datenspalten auf die zusätzlichen Eigenschaften bei den Einstellungen im Reconciliation Dialog. In der folgenden Tabelle ist eine Liste von verfügbaren &lt;em>subfields&lt;/em>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>Beispiel&lt;/th>
&lt;th>Bedeutung&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>@year&lt;/code>&lt;/td>
&lt;td>2023&lt;/td>
&lt;td>Jahresbestandteil eines Datums.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>@month&lt;/code>&lt;/td>
&lt;td>12&lt;/td>
&lt;td>Monatsbestandteil eines Datums.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>@day&lt;/code>&lt;/td>
&lt;td>24&lt;/td>
&lt;td>Tagesbestandteil eines Datums.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>@isodate&lt;/code>&lt;/td>
&lt;td>2023-12-24&lt;/td>
&lt;td>Datum im Format von ISO 8601.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>@iso&lt;/code>&lt;/td>
&lt;td>2023-12-24:12:00+00:00&lt;/td>
&lt;td>Datum und Zeitangabe im Format von ISO 8601 in UTC.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>@lat&lt;/code>&lt;/td>
&lt;td>48.77909743853026&lt;/td>
&lt;td>Längengrad&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>@lng&lt;/code>&lt;/td>
&lt;td>9.18665139434279&lt;/td>
&lt;td>Breitengrad&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>@urlscheme&lt;/code>&lt;/td>
&lt;td>https://&lt;/td>
&lt;td>Schema einer URL&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>@netloc&lt;/code>&lt;/td>
&lt;td>fdmlab.landesarchiv-bw.de&lt;/td>
&lt;td>Adresse einer URL&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>@urlpath&lt;/code>&lt;/td>
&lt;td>/kontakt/&lt;/td>
&lt;td>Pfad einer URL&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="keine-transformation-beim-geburtsort">Keine Transformation beim Geburtsort&lt;/h3>
&lt;p>Die Spalte &amp;ldquo;Geburtsort&amp;rdquo; beinhaltet zwar ebenfalls kleinere Schreib- oder Tippfehler.
Bei zusätzlichen Spalten wird bei OpenRefine-Wikibase automatisch die Fuzzy-Suche aktiviert.&lt;/p>
&lt;p>Die für den Reconciliation Vorgang umgewandelten Spalten sind in Abbildung 2 abgebildet.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-nach-den-transformationen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes nach den Transformationen." srcset="
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-datenset-modified_hu8a50896a136b864b5b5efb595900f5d6_28741_8bb2bca467f6dcff84d8b2f29f04a7a3.webp 400w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-datenset-modified_hu8a50896a136b864b5b5efb595900f5d6_28741_c25c5069e0e885978bda3261db9cf6d6.webp 760w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-datenset-modified_hu8a50896a136b864b5b5efb595900f5d6_28741_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-datenset-modified_hu8a50896a136b864b5b5efb595900f5d6_28741_8bb2bca467f6dcff84d8b2f29f04a7a3.webp"
width="512"
height="307"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes nach den Transformationen.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="abgleich-durchführen">Abgleich durchführen&lt;/h3>
&lt;p>Den Reconciliation Vorgang starten wir mit
&amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo;
und den in Abbildung 3 gezeigten Einstellungen.
Dabei ist darauf zu achten, dass beim Geburtsdatum nicht nach dem Namen der Eigenschaft (&amp;ldquo;Geburtsdatum&amp;rdquo;) gesucht wird, sondern stattdessen die &lt;em>Property-ID&lt;/em> &lt;code>P569&lt;/code> mit der &lt;em>subfield&lt;/em> Ergänzung &lt;code>@year&lt;/code> verwendet wird.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-einstellungen-für-den-reconciliation-dialog">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Einstellungen für den Reconciliation Dialog." srcset="
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-dialog-settings_hu6bb4ece65fbf59914203758c62c9de4e_29991_7efa3e9ec8efe06d69d92ae8330c9f87.webp 400w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-dialog-settings_hu6bb4ece65fbf59914203758c62c9de4e_29991_2f45f9499045371d9e46f4e0642383fa.webp 760w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-dialog-settings_hu6bb4ece65fbf59914203758c62c9de4e_29991_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-dialog-settings_hu6bb4ece65fbf59914203758c62c9de4e_29991_7efa3e9ec8efe06d69d92ae8330c9f87.webp"
width="760"
height="499"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Einstellungen für den Reconciliation Dialog.
&lt;/figcaption>&lt;/figure>
&lt;p>Durch die ergänzenden Spalten konnten bei unserem Experiment 12 von 13 Politikern mit hoher Konfidenz automatisch zugeordnet werden.
Wie in Abbildung 4 gezeigt, konnte für Peter Hauk kein Treffer gefunden werden, weil &lt;code>Haucl&lt;/code> für das Fuzzy-Matching zu weit von &lt;code>Hauk&lt;/code> entfernt ist.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-ergebnisse-des-reconciliation-vorgangs">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Ergebnisse des Reconciliation Vorgangs." srcset="
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-results_huf3975027bcb76935fe0b42adfa4767f3_46907_d930d39a42761681504df7b1d50972f6.webp 400w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-results_huf3975027bcb76935fe0b42adfa4767f3_46907_3478d5c21e600d30046437e8ee461a4e.webp 760w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-results_huf3975027bcb76935fe0b42adfa4767f3_46907_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-wikidata-results_huf3975027bcb76935fe0b42adfa4767f3_46907_d930d39a42761681504df7b1d50972f6.webp"
width="707"
height="537"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Ergebnisse des Reconciliation Vorgangs.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="weiterführende-informationen">Weiterführende Informationen&lt;/h3>
&lt;p>Es lohnt sich die &lt;a href="https://openrefine-wikibase.readthedocs.io/en/latest/scoring.html" target="_blank" rel="noopener">Dokumentation über die Bewertung einzelner Feldtypen&lt;/a> genauer durchzulesen.
Zum Beispiel hat die Bewertung einen Bereich von 0 bis 100 (keine Übereinstimmung bis volle Übereinstimmung), und es wird ein Abgleich von Geokoordinaten unterstützt. Wobei beim Koordinatenabgleich schon eine Abweichung von 1km als &amp;ldquo;keine Übereinstimmung&amp;rdquo; interpretiert wird.&lt;/p>
&lt;h2 id="aufgabe-2-suchbereich-einschränken">Aufgabe 2: Suchbereich einschränken&lt;/h2>
&lt;p>In Wikidata befinden sich deutlich mehr Daten, als in der GND, und auch das Datenschema ist deutlich komplexer.
Als Ergänzung bietet der OpenRefine-Wikibase Reconciliation Service die Möglichkeit so genannte &lt;a href="https://www.w3.org/TR/sparql11-query/#propertypaths" target="_blank" rel="noopener">Property Paths&lt;/a> zu verwenden.
Bei den &lt;em>Property Paths&lt;/em> werden aktuell nur die Operatoren &lt;code>/&lt;/code> und &lt;code>|&lt;/code> unterstützt.&lt;/p>
&lt;p>Dies zeigen wir an einem konkreten Beispiel.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/16_staedte.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Städte&lt;/a>
&lt;p>Was an dem Projekt &amp;ldquo;Städte&amp;rdquo; direkt auffällt ist, dass wir es hier nicht nur mit Städten zu tun haben.
Das Projekt beinhaltet Bundesländer aus Deutschland, Bundestaaten in den USA, sowie gleichnamige Städte in den jeweiligen Ländern.&lt;/p>
&lt;p>Da die im Folgenden entwickelten Anfragen recht lange rechnen, reduzieren wir zum Testen wie in Abbildung 5 die Einträge mit einem Sternchen-Filter auf vier.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-mit-sternen-gefilterten-einträge">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der mit Sternen gefilterten Einträge." srcset="
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-cities-starred_hu2489efc0302daaf77ee8417a46d4a3b3_7660_46de870d33f2eea77162344c85956591.webp 400w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-cities-starred_hu2489efc0302daaf77ee8417a46d4a3b3_7660_8cf90b151e5af99251fc0bf0f4b35c8b.webp 760w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-cities-starred_hu2489efc0302daaf77ee8417a46d4a3b3_7660_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-cities-starred_hu2489efc0302daaf77ee8417a46d4a3b3_7660_46de870d33f2eea77162344c85956591.webp"
width="390"
height="118"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der mit Sternen gefilterten Einträge.
&lt;/figcaption>&lt;/figure>
&lt;p>Ein direktes Vorgehen wäre, den Reconciliation Vorgang in vier Schritten durchzuführen:&lt;/p>
&lt;ol>
&lt;li>Filtern nach &amp;ldquo;Country Code&amp;rdquo; &lt;code>US&lt;/code> und Abgleich mit &lt;a href="https://www.wikidata.org/wiki/Q35657" target="_blank" rel="noopener">Bundesstaat der Vereinigten Staaten&lt;/a>.&lt;/li>
&lt;li>Filtern nach &amp;ldquo;Country Code&amp;rdquo; &lt;code>US&lt;/code> und Abgleich mit &lt;a href="https://www.wikidata.org/wiki/Q1093829" target="_blank" rel="noopener">City in den Vereinigten Staaten&lt;/a>.&lt;/li>
&lt;li>Filtern nach &amp;ldquo;Country Code&amp;rdquo; &lt;code>DE&lt;/code> und Abgleich mit &lt;a href="https://www.wikidata.org/wiki/Q1221156" target="_blank" rel="noopener">Bundesland&lt;/a>.&lt;/li>
&lt;li>Filtern nach &amp;ldquo;Country Code&amp;rdquo; &lt;code>DE&lt;/code> und Abgleich mit &lt;a href="https://www.wikidata.org/wiki/Q42744322" target="_blank" rel="noopener">Stadt in Deutschland&lt;/a>.&lt;/li>
&lt;/ol>
&lt;p>In diesem Fall wollen wir aber einige erweiterte Features der &lt;em>OpenRefine-Wikibase Reconciliation API&lt;/em> testen.&lt;/p>
&lt;h3 id="einfacher-abgleich">Einfacher Abgleich&lt;/h3>
&lt;p>Starten wir direkt auf den vier gefilterten Einträgen einen Reconciliation Vorgang gegen die deutschsprachige Version der Wikidata Reconciliation API, so bekommen wir direkt schon einige Entitätstypen vorgeschlagen.
Nach kurzer Recherche können wir die &lt;a href="https://www.wikidata.org/wiki/Q56061" target="_blank" rel="noopener">Verwaltungseinheit&lt;/a> (&lt;code>Q56061&lt;/code>) als gemeinsame Oberklasse identifizieren.&lt;/p>
&lt;div class="mermaid">---
title: Abfrage in Wikidata - einfacher Abgleich
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph entities["Entitäten"]
direction LR
arkansas["Arkansas"]
click bw href "https://www.wikidata.org/wiki/Q1612" "Q1612" _blank
bw["Baden-Württemberg"]
click bw href "https://www.wikidata.org/wiki/Q985" "Q985" _blank
stuttgart_bw["Stuttgart, BW"]
click bw href "https://www.wikidata.org/wiki/Q1022" "Q1022" _blank
stuttgart_ar["Stuttgart, AR"]
click bw href "https://www.wikidata.org/wiki/Q79844" "Q79844" _blank
end
adminBody[["Verwaltungseinheit"]]
click adminBody href "https://www.wikidata.org/wiki/Q56061" "Q56061" _blank
p_instanceOf{{"ist ein(e)"}}
click p_instanceOf href "https://www.wikidata.org/wiki/Property:P31" "P31" _blank
bw --> p_instanceOf --> adminBody
&lt;/div>
&lt;p>Wie in Abbildung 6 gezeigt, verwenden wir also &lt;code>Q56061&lt;/code> als Typ für den Reconciliation Vorgang.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-einstellungen-für-den-reconciliation-vorgang-mit-wikidata---typeinschränkung">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Einstellungen für den Reconciliation Vorgang mit Wikidata - Typeinschränkung." srcset="
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_hufa7d57f95e6721aad0e68555810f3fdc_38405_64258401194b3e2b1257ec7403649729.webp 400w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_hufa7d57f95e6721aad0e68555810f3fdc_38405_4bdfef1ff7a7b6c3b958140f416bc895.webp 760w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_hufa7d57f95e6721aad0e68555810f3fdc_38405_3e1cd8ec225e2b86f73af42c6220e1f5.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_hufa7d57f95e6721aad0e68555810f3fdc_38405_64258401194b3e2b1257ec7403649729.webp"
width="760"
height="496"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Einstellungen für den Reconciliation Vorgang mit Wikidata - Typeinschränkung.
&lt;/figcaption>&lt;/figure>
&lt;p>Hier bekommen wir zwar schon richtige Ergebnisse zurück.
Diese sind jedoch gemischt mit Wahlbezirken, historischen Orten, usw. und müssten manuell richtig zugeordnet werden.&lt;/p>
&lt;h3 id="abgleich-mit-instanzfilter">Abgleich mit Instanzfilter&lt;/h3>
&lt;p>Wenn wir in einem Reconciliation Vorgang nach mehreren Typen suchen wollen, so können wir das mit einem Trick in OpenRefine umsetzen.
Konkret suchen wir nach &lt;a href="https://www.wikidata.org/wiki/Q107390" target="_blank" rel="noopener">Bundesstaat&lt;/a>, &lt;a href="https://www.wikidata.org/wiki/Q515" target="_blank" rel="noopener">Stadt&lt;/a> und &lt;a href="https://www.wikidata.org/wiki/Q3957" target="_blank" rel="noopener">Kleinstadt&lt;/a>.
Dafür deaktivieren wir den Filter auf die markierten Zeilen und fügen via
&amp;ldquo;Item&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
eine neue Spalte &amp;ldquo;Types&amp;rdquo; hinzu.&lt;/p>
&lt;p>Als Werte für die neue Spalte &amp;ldquo;Types&amp;rdquo; nehmen wir &lt;code>&amp;quot;Bundesstaat|Stadt|Kleinstadt&amp;quot;&lt;/code> und wandeln sie via
&amp;ldquo;Types&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split multi-valued cells&amp;hellip;&amp;rdquo;
auf dem Trennzeichen &lt;code>|&lt;/code> in eine Record Struktur um. Das gefilterte Ergebnis sollte dann aussehen, wie in Abbildung 7.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-nach-dem-hinzufügen-der-spalte-types">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes nach dem Hinzufügen der Spalte Types." srcset="
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-cities-starred-record_hu81fd005f3aa34aa450a0571d2c1568d7_18927_c17aba1946a60fc32020ab1ca2c8212f.webp 400w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-cities-starred-record_hu81fd005f3aa34aa450a0571d2c1568d7_18927_72bd73753af08e62bc4b4955d0df4439.webp 760w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-cities-starred-record_hu81fd005f3aa34aa450a0571d2c1568d7_18927_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/screenshot-openrefine-cities-starred-record_hu81fd005f3aa34aa450a0571d2c1568d7_18927_c17aba1946a60fc32020ab1ca2c8212f.webp"
width="460"
height="295"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes nach dem Hinzufügen der Spalte Types.
&lt;/figcaption>&lt;/figure>
&lt;p>Der Hintergrund für diese Datenerweiterung ist, dass OpenRefine mehrere Werte in einer Record Struktur als &amp;ldquo;Oder&amp;rdquo; verknüpft betrachtet.
Baden-Württemberg kann also ein Bundesstaat sein, oder eine Stadt, oder eine Kleinstadt. &lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>&lt;/p>
&lt;div class="mermaid">---
title: Abfrage in Wikidata - Abgleich mit Instanzfilter
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph entities["Entitäten"]
direction LR
arkansas["Arkansas"]
click bw href "https://www.wikidata.org/wiki/Q1612" "Q1612" _blank
bw["Baden-Württemberg"]
click bw href "https://www.wikidata.org/wiki/Q985" "Q985" _blank
stuttgart_bw["Stuttgart, BW"]
click bw href "https://www.wikidata.org/wiki/Q1022" "Q1022" _blank
stuttgart_ar["Stuttgart, AR"]
click bw href "https://www.wikidata.org/wiki/Q79844" "Q79844" _blank
end
adminBody[["Verwaltungseinheit"]]
click adminBody href "https://www.wikidata.org/wiki/Q56061" "Q56061" _blank
federatedState["Bundesstaat"]
click federatedState href "https://www.wikidata.org/wiki/Q107390" "Q107390" _blank
city["Stadt"]
click city href "https://www.wikidata.org/wiki/Q515" "Q515" _blank
town["Kleinstadt"]
click town href "https://www.wikidata.org/wiki/Q3957" "Q3957" _blank
p_instanceOf{{"ist ein(e)"}}
click p_instanceOf href "https://www.wikidata.org/wiki/Property:P31" "P31" _blank
p_instanceOf2{{"ist ein(e)"}}
click p_instanceOf2 href "https://www.wikidata.org/wiki/Property:P31" "P31" _blank
or{"oder"}
bw --> p_instanceOf --> adminBody
bw --> p_instanceOf2 --> or --> federatedState &amp; city &amp; town
&lt;/div>
&lt;p>Die neue Spalte &amp;ldquo;Types&amp;rdquo; berücksichtigen wir beim Reconciliation Dialog in Abbildung 8 als Property &lt;code>P31&lt;/code> &amp;ldquo;ist ein(e)&amp;rdquo;.
Dadurch werden die Einträge mit einem &amp;ldquo;falschen&amp;rdquo; Typ zwar nicht weggefiltert, sie bekommen aber einen niedrigeren Score und rutschen weiter nach unten.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-einstellungen-für-den-reconciliation-vorgang-mit-wikidata---spalte-types">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Einstellungen für den Reconciliation Vorgang mit Wikidata - Spalte Types." srcset="
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_hu3935471ce17dd1ce3c507cf99f31c84f_40104_27938291cbe50b3c5846e5367c16860c.webp 400w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_hu3935471ce17dd1ce3c507cf99f31c84f_40104_5c7f7ab68d3c135daafb520a84ad0089.webp 760w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_hu3935471ce17dd1ce3c507cf99f31c84f_40104_66eac04df174323f8c0380ee09556249.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_hu3935471ce17dd1ce3c507cf99f31c84f_40104_27938291cbe50b3c5846e5367c16860c.webp"
width="760"
height="494"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Einstellungen für den Reconciliation Vorgang mit Wikidata - Spalte Types.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="abgleich-mit-country-code">Abgleich mit Country Code&lt;/h3>
&lt;p>In der Spalte &amp;ldquo;Country Code&amp;rdquo; haben wir passende Ländercodes für die einzelnen Entitäten.
Die Ländercodes sind jedoch nicht direkt mit den einzelnen Entitäten verknüpft.
Hier helfen uns so genannte &lt;em>Property Paths&lt;/em>.
Mit dem &lt;em>Property Path&lt;/em> &lt;code>P17/P297&lt;/code> in Abbildung 9 können wir ausdrücken, dass Baden-Württemberg in einem Land mit dem Ländercode &lt;code>DE&lt;/code> liegen soll.&lt;/p>
&lt;div class="mermaid">---
title: Abfrage in Wikidata - Abgleich mit Country Code
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph entities["Entitäten"]
direction LR
arkansas["Arkansas"]
click bw href "https://www.wikidata.org/wiki/Q1612" "Q1612" _blank
bw["Baden-Württemberg"]
click bw href "https://www.wikidata.org/wiki/Q985" "Q985" _blank
stuttgart_bw["Stuttgart, BW"]
click bw href "https://www.wikidata.org/wiki/Q1022" "Q1022" _blank
stuttgart_ar["Stuttgart, AR"]
click bw href "https://www.wikidata.org/wiki/Q79844" "Q79844" _blank
end
adminBody[["Verwaltungseinheit"]]
click adminBody href "https://www.wikidata.org/wiki/Q56061" "Q56061" _blank
countryCode["DE"]
click countryCode href "https://www.iso.org/obp/ui/#iso:code:3166:DE" "DE" _blank
federatedState["Bundesstaat"]
click federatedState href "https://www.wikidata.org/wiki/Q107390" "Q107390" _blank
city["Stadt"]
click city href "https://www.wikidata.org/wiki/Q515" "Q515" _blank
town["Kleinstadt"]
click town href "https://www.wikidata.org/wiki/Q3957" "Q3957" _blank
p_instanceOf{{"ist ein(e)"}}
click p_instanceOf href "https://www.wikidata.org/wiki/Property:P31" "P31" _blank
p_instanceOf2{{"ist ein(e)"}}
click p_instanceOf2 href "https://www.wikidata.org/wiki/Property:P31" "P31" _blank
p_country{{"Land"}}
click p_country href "https://www.wikidata.org/wiki/Property:P17" "P17" _blank
p_iso_country{{"ISO 3166-1 alpha-2"}}
click p_iso_country href "https://www.wikidata.org/wiki/Property:P297" "P297" _blank
sequence1{"/"}
click sequence1 href "https://www.w3.org/TR/sparql11-query/#propertypaths" "Sequence" _blank
bw --> p_instanceOf --> adminBody
bw --> p_country --> sequence1 --> p_iso_country --> countryCode
bw --> p_instanceOf2 --> or --> federatedState &amp; city &amp; town
&lt;/div>
&lt;figure id="figure-bildschirmfoto-der-einstellungen-für-den-reconciliation-vorgang-mit-wikidata---spalte-country-code">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Einstellungen für den Reconciliation Vorgang mit Wikidata - Spalte Country Code." srcset="
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_huf1e791da0098100c858970edab7e0266_43135_f26e98461fcde988fd0ed0e45dd4d23d.webp 400w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_huf1e791da0098100c858970edab7e0266_43135_ea4e20db4d0a88eac987a752cb084905.webp 760w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_huf1e791da0098100c858970edab7e0266_43135_e223d72da9f16104a0304154930f1363.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_huf1e791da0098100c858970edab7e0266_43135_f26e98461fcde988fd0ed0e45dd4d23d.webp"
width="760"
height="496"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Einstellungen für den Reconciliation Vorgang mit Wikidata - Spalte Country Code.
&lt;/figcaption>&lt;/figure>
&lt;p>Der Abgleich dauert nun schon deutlich länger, jedoch passt die Sortierung der Ergebnisse deutlich besser.
Nur bei den verschiedenen gleichnamigen Städten in den USA haben wir noch Probleme bei der (korrekten) Sortierung der Suchvorschläge.&lt;/p>
&lt;h3 id="abgleich-mit-state-code">Abgleich mit State Code&lt;/h3>
&lt;p>In der Spalte &amp;ldquo;State Code&amp;rdquo; haben wir zusätzlich das Kürzel des jeweiligen Bundeslandes/staates, in dem die jeweilige Stadt liegt.
Diese Werte finden wir zum Beispiel bei den alternativen Bezeichnungen für die einzelnen Bundesländer/staaten.
Die so genannten Aliase lassen sich über spezielle Eigenschaften abfragen, bei denen man ein Kürzel mit einem Sprachcode kombiniert.
Die englischsprachigen Aliase erhält man also über &lt;code>Aen&lt;/code>. In der folgenden Tabelle sind weitere Kürzel mit Beispielen gelistet.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Kürzel&lt;/th>
&lt;th>Steht für&lt;/th>
&lt;th>Bedeutung&lt;/th>
&lt;th>Beispiel&lt;/th>
&lt;th>Inhalt&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>L&lt;/code>&lt;/td>
&lt;td>Label&lt;/td>
&lt;td>Bezeichnung&lt;/td>
&lt;td>&lt;code>Lde&lt;/code>&lt;/td>
&lt;td>Baden-Württemberg&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>D&lt;/code>&lt;/td>
&lt;td>Description&lt;/td>
&lt;td>Beschreibung&lt;/td>
&lt;td>&lt;code>Den&lt;/code>&lt;/td>
&lt;td>Land (federal state) in southwestern Germany&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>A&lt;/code>&lt;/td>
&lt;td>Alias&lt;/td>
&lt;td>Alternative Bezeichnungen&lt;/td>
&lt;td>&lt;code>Afr&lt;/code>&lt;/td>
&lt;td>BW, Baden-Württemberg, Land Baden-Württemberg, État du Bade-Wurtemberg, DE-BW, BaWü&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>S&lt;/code>&lt;/td>
&lt;td>Sidelink&lt;/td>
&lt;td>Seitenlink&lt;/td>
&lt;td>&lt;code>Sdewiki&lt;/code>&lt;/td>
&lt;td>&lt;a href="https://de.wikipedia.org/wiki/Baden-W%C3%BCrttemberg" target="_blank" rel="noopener">https://de.wikipedia.org/wiki/Baden-W%C3%BCrttemberg&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Hier haben wir das Problem, dass wir wieder eine Art &amp;ldquo;Oder Verknüpfung&amp;rdquo; benötigen.
Diesmal haben wir nicht verschiedene Werte, sondern verschiedene Arten von Verknüpfungen.
Bei den Bundesländern/staaten selbst befindet sich das Kürzel in der Liste der Aliase.
Bei den Städten befindet sich das Kürzel des Bundeslandes/staates in &lt;strong>einem&lt;/strong> der übergeordneten Objekte.&lt;/p>
&lt;p>Auch hier helfen uns die &lt;em>Property Paths&lt;/em>.
Mit &lt;code>Aen|(P131/Aen)|(P131/P131/Aen)&lt;/code> in Abbildung 10 können wir ausdrücken, dass der gesuchte Wert entweder im englischsprachigen Alias (&lt;code>Aen&lt;/code>), oder (&lt;code>|&lt;/code>) im Alias einer der beiden übergeordneten Verwaltungseinheiten (&lt;code>P131/Aen&lt;/code> bzw. &lt;code>P131/P131/Aen&lt;/code>) zu finden sein soll.&lt;/p>
&lt;div class="mermaid">---
title: Abfrage in Wikidata - Abgleich mit State Code
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph entities["Entitäten"]
direction LR
arkansas["Arkansas"]
click bw href "https://www.wikidata.org/wiki/Q1612" "Q1612" _blank
bw["Baden-Württemberg"]
click bw href "https://www.wikidata.org/wiki/Q985" "Q985" _blank
stuttgart_bw["Stuttgart, BW"]
click bw href "https://www.wikidata.org/wiki/Q1022" "Q1022" _blank
stuttgart_ar["Stuttgart, AR"]
click bw href "https://www.wikidata.org/wiki/Q79844" "Q79844" _blank
end
adminBody[["Verwaltungseinheit"]]
click adminBody href "https://www.wikidata.org/wiki/Q56061" "Q56061" _blank
countryCode["DE"]
click countryCode href "https://www.iso.org/obp/ui/#iso:code:3166:DE" "DE" _blank
stateCode["BW"]
click stateCode href "https://www.wikidata.org/wiki/Help:Aliases" "Alias" _blank
federatedState["Bundesstaat"]
click federatedState href "https://www.wikidata.org/wiki/Q107390" "Q107390" _blank
city["Stadt"]
click city href "https://www.wikidata.org/wiki/Q515" "Q515" _blank
town["Kleinstadt"]
click town href "https://www.wikidata.org/wiki/Q3957" "Q3957" _blank
p_instanceOf{{"ist ein(e)"}}
click p_instanceOf href "https://www.wikidata.org/wiki/Property:P31" "P31" _blank
p_instanceOf2{{"ist ein(e)"}}
click p_instanceOf2 href "https://www.wikidata.org/wiki/Property:P31" "P31" _blank
p_country{{"Land"}}
click p_country href "https://www.wikidata.org/wiki/Property:P17" "P17" _blank
p_iso_country{{"ISO 3166-1 alpha-2"}}
click p_iso_country href "https://www.wikidata.org/wiki/Property:P297" "P297" _blank
p_alias{{"Aen"}}
click p_alias "https://www.wikidata.org/wiki/Help:Aliases" "Alias" _blank
p_located1{{"befindet sich in"}}
click p_located1 href "https://www.wikidata.org/wiki/Property:P131" "P131" _blank
p_located2{{"befindet sich in"}}
click p_located2 href "https://www.wikidata.org/wiki/Property:P131" "P131" _blank
p_located3{{"befindet sich in"}}
click p_located3 href "https://www.wikidata.org/wiki/Property:P131" "P131" _blank
or{"oder"}
union{"|"}
click union href "https://www.w3.org/TR/sparql11-query/#propertypaths" "Union" _blank
sequence0{"/"}
click sequence0 href "https://www.w3.org/TR/sparql11-query/#propertypaths" "Sequence" _blank
sequence1{"/"}
click sequence1 href "https://www.w3.org/TR/sparql11-query/#propertypaths" "Sequence" _blank
sequence2{"/"}
click sequence2 href "https://www.w3.org/TR/sparql11-query/#propertypaths" "Sequence" _blank
sequence3{"/"}
click sequence3 href "https://www.w3.org/TR/sparql11-query/#propertypaths" "Sequence" _blank
bw --> p_instanceOf --> adminBody
bw --> p_country --> sequence0 --> p_iso_country --> countryCode
bw --> union --> p_alias &amp; p_located1 &amp; p_located2
p_alias --> stateCode
p_located1 --> sequence1 --> p_alias
p_located2 --> sequence2 --> p_located3 --> sequence3 --> p_alias
bw --> p_instanceOf2 --> or --> federatedState &amp; city &amp; town
&lt;/div>
&lt;figure id="figure-bildschirmfoto-der-einstellungen-für-den-reconciliation-vorgang-mit-wikidata---spalte-state-code">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Einstellungen für den Reconciliation Vorgang mit Wikidata - Spalte State Code." srcset="
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_hu0f682581000c6cc89e53ca2d9331eecf_41997_5f24a6f63dd459f8d70df9781915db52.webp 400w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_hu0f682581000c6cc89e53ca2d9331eecf_41997_73af2435f784a4733bff4d14e8037301.webp 760w,
/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_hu0f682581000c6cc89e53ca2d9331eecf_41997_8b4ffef2f0628638f6e752676c7fc096.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/_hu0f682581000c6cc89e53ca2d9331eecf_41997_5f24a6f63dd459f8d70df9781915db52.webp"
width="760"
height="496"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Einstellungen für den Reconciliation Vorgang mit Wikidata - Spalte State Code.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="ergebnis">Ergebnis&lt;/h3>
&lt;p>Bei unserem Experiment konnten wir mit dieser komplexen Reconciliation Abfrage die Bundesländer/staaten und gleichnamigen Städte fast immer voneinander &amp;ldquo;trennen&amp;rdquo;.&lt;/p>
&lt;p>Ausnahmen gibt es zum Beispiel in einzelnen amerikanischen Bundesstaaten, wo es teilweise ebenfalls mehrere Städte mit dem gleichen Namen gibt, so dass das Staatskürzel zur Identifikation nicht ausreichend ist.&lt;/p>
&lt;p>Der Reconciliation Vorgang benötigte für die knapp 100 Objekte mehrere Anläufe von jeweils mehreren Minuten.
Je nachdem, wie gut sich die Daten im Vorfeld separieren lassen, lohnt sich im Vergleich die in der Einleitung erwähnte Strategie des mehrmaligen Abgleichs auf einer gefilterten Untermenge der Daten bzw. die separate Behandlung von Einzelfällen.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Die &lt;em>OpenRefine-Wikibase Reconciliation API&lt;/em> bietet nicht so viele Suchfeatures wie die &lt;em>lobid gnd OpenRefine Reconciliation API&lt;/em>.
Es ist interessant, dass bei der Spalte auf der abgeglichen wird, das Fuzzy-matching manuell aktiviert werden muss, es auf den zusätzlich Spalten aber automatisch durchgeführt wird.&lt;/p>
&lt;p>Etwas versteckt ist die Möglichkeit auf sprachspezifische Bezeichnungen &lt;code>L&lt;/code>, Beschreibungen &lt;code>D&lt;/code>, Aliase &lt;code>A&lt;/code> und Seitenlinks &lt;code>S&lt;/code> durch Hinzufügen des jeweiligen Sprachcodes zuzugreifen.&lt;/p>
&lt;p>Das Matching von Teilausdrücken über &lt;em>subfields&lt;/em> wie &lt;code>@year&lt;/code> ist recht komfortabel, da dadurch die Information der Datentransformation, also nur Jahr zu berücksichtigen, in der Reconciliation Abfrage und nicht in den Daten selbst steckt.&lt;/p>
&lt;p>Mit den &lt;em>Property Paths&lt;/em> können wir komplexe Anfragen durchführen und die Suchmenge sehr spezifisch einschränken.
Jedoch benötigt die Berechnung der Antwort recht lange und wir erlebten bei unseren Tests häufigere Abbrüche des Vorgangs.&lt;/p>
&lt;p>Da als Suchtechnologie bei Wikibase üblicherweise wie bei lobid gnd &lt;a href="https://www.elastic.co/de/elasticsearch/" target="_blank" rel="noopener">ElasticSearch&lt;/a> als Suchtechnologie eingesetzt wird, könnte es sein, dass weitere Features der &lt;a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#query-string-syntax" target="_blank" rel="noopener">Query string syntax&lt;/a> zukünftig ebenfalls nutzbar sein werden.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns mit dem erweiterten Datenabgleich zwischen OpenRefine und Getty.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty" class="btn btn-primary px-3 py-3">16 Erweiterter Abgleich mit Getty&lt;/a>
&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>GitLab Issue zum Thema &lt;a href="https://gitlab.com/nfdi4culture/ta1-data-enrichment/openrefine-wikibase/-/issues/11" target="_blank" rel="noopener">Fuzzy-matching mit OpenRefine-Wikibase&lt;/a>.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>Details zu Records beim Reconciliation Vorgang unter &lt;a href="https://github.com/OpenRefine/OpenRefine/issues/3139" target="_blank" rel="noopener">Store and expose reconciliation candidate features&lt;/a> und darin verknüpften Issues.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Entfernungen zu GPX Tracks mit OpenRefine ermitteln</title><link>https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/</link><pubDate>Thu, 27 Oct 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/</guid><description>&lt;p>In diesem Beitrag verarbeiten wir XML in Form von GPX-Dateien mit OpenRefine und berechnen via WebAPIs die Entfernung von unserem Standort zu dem Startpunkt der GPX-Tracks.&lt;/p>
&lt;p>Aktuelle Wanderführer bieten die darin beschriebenen Wanderungen häufig zusätzlich als &lt;a href="https://de.wikipedia.org/wiki/GPS_Exchange_Format" target="_blank" rel="noopener">GPX-Datei&lt;/a> zum Nachwandern als Download an.
Auch Tourismusbüros/verbände/gemeinschaften/&amp;hellip; bieten in Kooperation mit Diensten wie &lt;a href="https://www.outdooractive.com/" target="_blank" rel="noopener">OutdoorActive&lt;/a> lokale Wanderungen digital an. Planen wir einen Betriebsausflug, oder eine Wanderung, dann ist die Länge der Anfahrt zum jeweiligen Startpunkt durchaus ein wesentliches Entscheidungskriterium für oder gegen eine Wanderung. Anstatt manueller Einzelrecherchen testen wir in diesem Beitrag, wie sich mit OpenRefine die Entfernung und Fahrtdauer mit dem Auto bzw. dem öffentlichen Nahverkehr von unserem Standort zu den Startpunkten der einzelnen Wanderungen berechnen lässt.&lt;/p>
&lt;p>Dabei kombinieren wir OpenRefine mit Geodaten im XML basierten GPX-Format und fragen mit den extrahierten Daten verschiedene WebAPIs an.&lt;/p>
&lt;h2 id="unsere-testdaten">Unsere Testdaten&lt;/h2>
&lt;p>Als Testdaten verwenden wir die aktuell 21 Wanderungen aus dem Programm der &lt;a href="https://hochgehberge.de/" target="_blank" rel="noopener">hochgehberge&lt;/a>.
Diese lassen sich direkt von der Webseite als GPX-Datei einzeln herunterladen. Dafür muss nach Auswahl einer Tour etwas nach oben gescrollt werden.
Wie in Abbildung 1 gezeigt, aktivieren wir zusätzlich die Checkbox bei &amp;ldquo;Verknüpfte Wegpunkte exportieren&amp;rdquo;.
Das ermöglicht uns bei den Daten der &amp;ldquo;hochgehberge&amp;rdquo; nicht nur einen Abgleich mit dem Startpunkt der Wanderungen durchzuführen, sondern auch mit alternativen Parkplätzen, die sich als Einstieg zur Tour eignen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-webseite-hochgehbergede-mit-gpx-download">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Webseite hochgehberge.de mit GPX-Download." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-hochgehberge_hucb7e0a0d8f6d012e7accccd73c00b66e_632729_2e5885b9fff31e6470a950711ac66244.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-hochgehberge_hucb7e0a0d8f6d012e7accccd73c00b66e_632729_af2694a6fa3f096d4d911d702a8ac096.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-hochgehberge_hucb7e0a0d8f6d012e7accccd73c00b66e_632729_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-hochgehberge_hucb7e0a0d8f6d012e7accccd73c00b66e_632729_2e5885b9fff31e6470a950711ac66244.webp"
width="760"
height="714"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Webseite hochgehberge.de mit GPX-Download.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="routing-apis">Routing APIs&lt;/h2>
&lt;p>Wir verwenden für unseren Test die WebAPIs von &lt;a href="https://developers.google.com/maps/" target="_blank" rel="noopener">Google Maps&lt;/a>, &lt;a href="https://developer.HERE.com/" target="_blank" rel="noopener">HERE&lt;/a> und &lt;a href="https://openrouteservice.org/" target="_blank" rel="noopener">OpenRouteService&lt;/a>.
Für all diese Dienste benötigen wir einen Account und müssen einen API Schlüssel erstellen, um mit OpenRefine eine Anfrage stellen zu können.
Alle Dienste haben ein &amp;ldquo;freies&amp;rdquo; Kontingent, welches für unsere Anwendung vollkommen ausreichend ist.
Im Falle von Google Maps ist jedoch eine Kreditkarte notwendig, um den Dienst aktivieren zu können.&lt;/p>
&lt;p>Da das Warten auf die Bestätigungs-E-Mail manchmal mehrere Minuten dauert, lohnt es sich die Registrierung schon jetzt durchzuführen.
Wie das funktioniert und wie bei den einzelnen Diensten API Schlüssel erstellt wird, ist in der jeweiligen Dokumentation deutlich besser und umfangreicher beschrieben, als wir es hier können.&lt;/p>
&lt;h2 id="daten-importieren-und-aufarbeiten">Daten importieren und aufarbeiten&lt;/h2>
&lt;h3 id="daten-in-openrefine-importieren">Daten in OpenRefine importieren&lt;/h3>
&lt;p>Bei vielen Dateien oder verschachtelten Strukturen mit Unterordnern empfiehlt es sich, diese in eine ZIP-Datei zu packen, was das Laden in OpenRefine vereinfacht. Wie in Abbildung 2 gezeigt, kann eine ZIP-Datei direkt als Datenquelle für ein neues Projekt ausgewählt werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-dateiauswahl-für-neue-projekte-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Dateiauswahl für neue Projekte in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-create-project_huba1bae9e3157b8d9bf7139983b1c44fe_24234_1f5a0121390af91f1603a04f88c60434.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-create-project_huba1bae9e3157b8d9bf7139983b1c44fe_24234_20b9188da810ed391b6618aee6415c25.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-create-project_huba1bae9e3157b8d9bf7139983b1c44fe_24234_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-create-project_huba1bae9e3157b8d9bf7139983b1c44fe_24234_1f5a0121390af91f1603a04f88c60434.webp"
width="760"
height="179"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Dateiauswahl für neue Projekte in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Wie in Abbildung 3 gezeigt, werden die einzelnen Dateien vor dem Import aus den Unterordnern geladen, und können in einem separaten Dialog nach Dateityp gefiltert werden. Auch eine Filterung basierend auf Mustern im Dateinamen ist möglich.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialogs-zum-filtern-von-dateien-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialogs zum Filtern von Dateien in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-import-project_hu53ffd0236d51ecf11288f4ded52e813f_82274_79d8d12354b9799bda7305505f118bde.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-import-project_hu53ffd0236d51ecf11288f4ded52e813f_82274_14f6d44f557b18386ec56c0c7d9221b2.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-import-project_hu53ffd0236d51ecf11288f4ded52e813f_82274_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-import-project_hu53ffd0236d51ecf11288f4ded52e813f_82274_79d8d12354b9799bda7305505f118bde.webp"
width="760"
height="308"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialogs zum Filtern von Dateien in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Im XML-Import-Dialog wählen wir anschließend das GPX-Wurzelelement aus und erhalten die in Abbildung 4 gezeigten Daten in OpenRefine angezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-importierten-gpx-dateien-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der importierten GPX Dateien in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-initial-view_huedb73ad5de4d14327f69b2e127f20ab8_203130_ae0781341cdd126a4d50114a6a784f7f.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-initial-view_huedb73ad5de4d14327f69b2e127f20ab8_203130_47a1deae8009204d1bf9ae284b3cf3a7.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-initial-view_huedb73ad5de4d14327f69b2e127f20ab8_203130_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-initial-view_huedb73ad5de4d14327f69b2e127f20ab8_203130_ae0781341cdd126a4d50114a6a784f7f.webp"
width="760"
height="260"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der importierten GPX Dateien in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="überflüssige-spalten-entfernen">Überflüssige Spalten entfernen&lt;/h3>
&lt;p>In Standard GPX-Tracks würden wir hier einfach den ersten Punkt des GPX-Tracks verwenden und den Rest verwerfen.
Da wir in den GPS-Daten der &amp;ldquo;hochgehberge&amp;rdquo; aber pro Tour teilweise mehrere mögliche Parkplätze zum Starten als Wegpunkte hinterlegt haben, machen wir den Abgleich hier über die Wegpunkte und verwerfen die Track-Daten.&lt;/p>
&lt;p>Wie in Abbildung 5 gezeigt, entfernen wir dafür überflüssige Spalten via
&amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Re-order / remove columns&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialogs-zum-löschen-und-sortieren-von-spalten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialogs zum Löschen und Sortieren von Spalten in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-remove-columns_hubfd1eb135cf2d2540b6bc7f2fc671328_24361_6237523570bb2a21ffd6e322f9be9d16.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-remove-columns_hubfd1eb135cf2d2540b6bc7f2fc671328_24361_2e08e0421cf35f4682a886ae3db35630.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-remove-columns_hubfd1eb135cf2d2540b6bc7f2fc671328_24361_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-remove-columns_hubfd1eb135cf2d2540b6bc7f2fc671328_24361_6237523570bb2a21ffd6e322f9be9d16.webp"
width="597"
height="564"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialogs zum Löschen und Sortieren von Spalten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Die folgenden Spalten behalten wir vorläufig:&lt;/p>
&lt;ul>
&lt;li>File =&amp;gt; als Record Identifier, also Zuordnung von Startpunkten zu einzelnen Touren.&lt;/li>
&lt;li>WPT lon, lat =&amp;gt; Zur Routenplanung via API.&lt;/li>
&lt;li>WPT Name + Type =&amp;gt; zum Filtern von Startpunkten (Parkplätzen).&lt;/li>
&lt;li>WPT DESC + Link =&amp;gt; ggf. zur weiteren Recherche hilfreich.&lt;/li>
&lt;li>Metadata Name + Link =&amp;gt; Information über Wanderung.&lt;/li>
&lt;/ul>
&lt;h3 id="spalten-umbenennen">Spalten umbenennen&lt;/h3>
&lt;p>Um auf die Werte einfacher zugreifen zu können, benennen wir die restlichen Spalten passend nach folgendem Schema um:&lt;/p>
&lt;ul>
&lt;li>gpx - wpt - lon
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Lon&lt;/li>
&lt;li>gpx - wpt - lat
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Lat&lt;/li>
&lt;li>gpx - wpt - name
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Wegpunkt Name&lt;/li>
&lt;li>gpx - wpt - type
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Wegpunkt Typ&lt;/li>
&lt;li>gpx - wpt - desc
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Wegpunkt Beschreibung&lt;/li>
&lt;li>gpx - wpt - link-href
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Wegpunkt Link&lt;/li>
&lt;li>gpx -metadata - name
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Name&lt;/li>
&lt;li>gpx - metadata - link - href
&lt;i class="fas fa-arrow-right pr-1 fa-fw">&lt;/i> Link&lt;/li>
&lt;/ul>
&lt;h3 id="spalten-sortieren">Spalten sortieren&lt;/h3>
&lt;p>Nachdem wir geprüft haben, dass die Spalte &amp;ldquo;Name&amp;rdquo; für jeden GPS-Track eindeutig ist (Text Facet oder Duplicates Facet), löschen wir die Spalte &amp;ldquo;File&amp;rdquo; und verschieben die Spalte &amp;ldquo;Name&amp;rdquo; ganz nach links.
Dadurch wird der &amp;ldquo;Name&amp;rdquo; zum neuen Record Identifier der einzelnen Wanderungen.
Ordnungsliebend verschieben wir die Spalte &amp;ldquo;Link&amp;rdquo; direkt daneben auf die zweite Position.
Das geht in einem Bearbeitungsschritt über den Dialog zum Löschen und Umsortieren mehrerer Spalten via &amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Re-order / remove columns&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;h3 id="überflüssige-zeilen-entfernen">Überflüssige Zeilen entfernen&lt;/h3>
&lt;p>Wir haben in den Daten einige Leerzeilen, da wir die Spalten zu den einzelnen Trackpunkten gelöscht haben.
Außerdem haben wir einige Wegpunkte, die wir ebenfalls noch löschen wollen, da wir uns auf die Parkplätze konzentrieren wollen.&lt;/p>
&lt;p>Dies machen wir in vier Schritten:&lt;/p>
&lt;ol>
&lt;li>Werte in Spalte &amp;ldquo;Name&amp;rdquo; nach unten auffüllen via &amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Fill down&amp;rdquo;.&lt;/li>
&lt;li>Werte in Spalte &amp;ldquo;Link&amp;rdquo; nach unten auffüllen via &amp;ldquo;Link&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Fill down&amp;rdquo;.&lt;/li>
&lt;li>Wie in Abbildung 6, ein Text Facet auf der Spalte &amp;ldquo;Wegpunkt Typ&amp;rdquo; erstellen, dort die Wegpunkte vom Typ &amp;ldquo;Parkplatz&amp;rdquo; auswählen, und die Auswahl invertieren.&lt;/li>
&lt;li>Die überflüssigen Zeilen entfernen via &amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit rows&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Remove matching rows&amp;rdquo;.&lt;/li>
&lt;/ol>
&lt;figure id="figure-bildschirmfoto-des-text-facets-zum-filtern-von-wegpunkten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Text Facets zum Filtern von Wegpunkten in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-facet-parkplatz_hu14ad700099fb1ac0e6bb0c8ae48ac492_9905_b3ef9364dc15e2fb90b1bd1200802cb5.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-facet-parkplatz_hu14ad700099fb1ac0e6bb0c8ae48ac492_9905_7607ddaebca37c8c3999482757fb90e5.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-facet-parkplatz_hu14ad700099fb1ac0e6bb0c8ae48ac492_9905_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-facet-parkplatz_hu14ad700099fb1ac0e6bb0c8ae48ac492_9905_b3ef9364dc15e2fb90b1bd1200802cb5.webp"
width="294"
height="250"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Text Facets zum Filtern von Wegpunkten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="nochmal-überflüssige-spalten-entfernen">Nochmal überflüssige Spalten entfernen&lt;/h3>
&lt;p>Bei den Parkplätzen sind die Spalten &amp;ldquo;Wegpunkt Link&amp;rdquo; und &amp;ldquo;Wegpunkt Beschreibung&amp;rdquo; nicht mit hilfreichen Informationen versehen, so dass wir sie löschen können.&lt;/p>
&lt;h3 id="auf-duplikate-prüfen">Auf Duplikate prüfen&lt;/h3>
&lt;p>Der Vollständigkeit halber prüfen wir mit dem &amp;ldquo;Duplicates Facet&amp;rdquo; oder dem &amp;ldquo;Text Facet&amp;rdquo; die Spalte &amp;ldquo;Wegpunkt&amp;rdquo; auf mögliche Duplikate und löschen diese.
Dafür die entsprechenden Zeilen zum Beispiel mit Flaggen markieren, via &amp;ldquo;Flag Facet&amp;rdquo; filtern und anschließend löschen.&lt;/p>
&lt;h3 id="records-erstellen">Records erstellen&lt;/h3>
&lt;p>Um wieder eine Record Struktur zu erstellen, bei der es zu jeder Tour mehrere mögliche Parkplätze als Startpunkte gibt, machen wir das &amp;ldquo;Fill down&amp;rdquo; auf den Spalten &amp;ldquo;Name&amp;rdquo; und &amp;ldquo;Link&amp;rdquo; aus dem vorherigen Schritt wieder rückgängig, indem wir analog dazu auf beiden Spalten &amp;ldquo;Name|Link&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Blank down&amp;rdquo; verwenden.&lt;/p>
&lt;p>Die fertig gefilterten Daten sind in Abbildung 7 zu sehen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-gefilterten-daten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der gefilterten Daten in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-daten-nach-filtern_hude196f0a586d2946f25b8d1c71fe535e_90536_486a4f628d7372ab59d7b01257314c15.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-daten-nach-filtern_hude196f0a586d2946f25b8d1c71fe535e_90536_b588ee820209078fcb543f0b7a69b599.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-daten-nach-filtern_hude196f0a586d2946f25b8d1c71fe535e_90536_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-daten-nach-filtern_hude196f0a586d2946f25b8d1c71fe535e_90536_486a4f628d7372ab59d7b01257314c15.webp"
width="760"
height="383"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der gefilterten Daten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="startkoordinaten-suchen">Startkoordinaten suchen&lt;/h3>
&lt;p>Für einen Abgleich via WebAPI benötigen wir noch die Startkoordinaten.
Der Einfachheit halber kopieren wir diese von Google Maps und fügen sie als neue Spalten &amp;ldquo;Start Lon&amp;rdquo; und &amp;ldquo;Start Lat&amp;rdquo; dem Projekt hinzu (wir starten von unserer Zentrale in der Eugenstraße 7 in Stuttgart).
Um Geokoordinaten von Google Maps zu kopieren klicken wir mit dem rechten Maustaste auf den gesuchten Punkt oder den Marker auf der Karte.
Wie in Abbildung 8 gezeigt, erscheint anschließend ein Kontextmenü, wo die Geokoordinaten mit einem Linksklick direkt in die Zwischenablage übernommen werden können. Der erste Wert stellt den Breitengrad (Latidude) dar, der zweite den Längengrad (Longitude).&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-kontextmenüs-in-google-maps-zum-kopieren-von-geokoordinaten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Kontextmenüs in Google Maps zum Kopieren von Geokoordinaten." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-google-maps-geokoodinaten_huea6733d204a7fe7d6c10a1e5eb2d314c_27565_5b45b8a3f9b268cc680fd57b800bb7ed.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-google-maps-geokoodinaten_huea6733d204a7fe7d6c10a1e5eb2d314c_27565_96bba34bc9f074c4c444a755879ba1b2.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-google-maps-geokoodinaten_huea6733d204a7fe7d6c10a1e5eb2d314c_27565_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-google-maps-geokoodinaten_huea6733d204a7fe7d6c10a1e5eb2d314c_27565_5b45b8a3f9b268cc680fd57b800bb7ed.webp"
width="229"
height="351"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Kontextmenüs in Google Maps zum Kopieren von Geokoordinaten.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="wegstrecke-mit-webapis-ermitteln">Wegstrecke mit WebAPIs ermitteln&lt;/h2>
&lt;p>Nun haben wir alle Daten für unseren Datenabgleich zusammen. In Abbildung 9 sind diese noch einmal abgebildet, wobei wir zur Übersichtlichkeit die ersten beiden Spalten ausgeblendet haben. Im nächsten Schritt berechnen wir die Entfernung zwischen unserem Standort und den möglichen Startpunkten der einzelnen Wanderungen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-aufbereiteten-projektes-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des aufbereiteten Projektes in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-data-ready_hu2d0b0e39e18a66ac4d4adf4a82f074a4_78021_91b4c8ee8084404f795d6b11935788e4.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-data-ready_hu2d0b0e39e18a66ac4d4adf4a82f074a4_78021_66a68edb5bba4a331f2abb3c01a773f3.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-data-ready_hu2d0b0e39e18a66ac4d4adf4a82f074a4_78021_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-data-ready_hu2d0b0e39e18a66ac4d4adf4a82f074a4_78021_91b4c8ee8084404f795d6b11935788e4.webp"
width="747"
height="629"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des aufbereiteten Projektes in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Um die Daten von einer WebAPI abzurufen, verwenden wir so genannte GET-Requests (siehe &lt;a href="https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP-Anfragemethoden" target="_blank" rel="noopener">HTTP-Anfragemethoden auf Wikipedia&lt;/a>). Das hat den Vorteil, dass wir die Daten direkt mit der &lt;a href="https://docs.openrefine.org/manual/columnediting#add-column-by-fetching-urls" target="_blank" rel="noopener">OpenRefine Funktion des Hinzufügens neuer Spalten via URL&lt;/a> abfragen können.&lt;/p>
&lt;p>Bei der (prinzipiell) für diese Art von Anfragen empfohlene POST-Request Methode, müssten wir zusätzlich in OpenRefine mit Clojure oder Python programmieren, was wir aus Gründen der Komplexität für dieses Experiment vermeiden möchten.&lt;/p>
&lt;h3 id="verwendung-von-here">Verwendung von HERE&lt;/h3>
&lt;p>Bei HERE handelt es sich um ein ehemaliges Berliner Startup, welches mehrfach verkauft wurde und inzwischen hauptsächlich aus dem Automotive Bereich bekannt ist.&lt;/p>
&lt;p>Für die Verwendung der HERE Routing API benötigen wir einen Account und einen API Schlüssel.
Die Benutzung der API ist in der &lt;a href="https://developer.here.com/documentation/routing-api/dev_guide/topics/use-cases/calculate-route.html" target="_blank" rel="noopener">Entwickler Dokumentation&lt;/a> beschrieben.&lt;/p>
&lt;h4 id="daten-abrufen">Daten abrufen&lt;/h4>
&lt;p>In Abbildung 10 ist der Dialog zum Hinzufügen neuer Spalten via URLs gezeigt. Diesen können wir aufrufen via &amp;ldquo;Beliebige Spalte&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column by fetching URLs&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialogs-zum-abfragen-der-here-routing-api-mit-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialogs zum Abfragen der HERE Routing API mit OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-get-here_hu8c3fd2352e029eede290c6903029d90a_60147_ed2279c2b2a71f40e1c0603c2185ca34.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-get-here_hu8c3fd2352e029eede290c6903029d90a_60147_a1d49f246cd370332963483091d5549a.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-get-here_hu8c3fd2352e029eede290c6903029d90a_60147_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-get-here_hu8c3fd2352e029eede290c6903029d90a_60147_ed2279c2b2a71f40e1c0603c2185ca34.webp"
width="760"
height="250"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialogs zum Abfragen der HERE Routing API mit OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Die neue Spalte nennen wir &amp;ldquo;HERE&amp;rdquo; und die URL bauen wir für jede Zeile dynamisch zusammen:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;https://router.hereapi.com/v8/routes?transportMode=car&amp;amp;origin=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Start Lat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Start Lon&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;destination=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Lat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Lon&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;return=summary&amp;amp;apikey={YOUR_API_KEY}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wir geben in dieser Anfrage an, dass wir die Route für ein Auto planen möchten und laden die Start- und Zielkoordinaten aus den entsprechenden OpenRefine Spalten. Hier ist der Platzhalter &lt;code>{YOUR_API_KEY}&lt;/code> durch einen eigenen API Key zu ersetzen.&lt;/p>
&lt;p>Bei HERE haben wir zusätzlich die Möglichkeit, lediglich die Zusammenfassung zurückgeben zu lassen und damit auf die expliziten Einzelschrittanweisungen für die Route zu verzichten.&lt;/p>
&lt;div class="alert alert-warning">
&lt;div>
Das Vorhandensein des API Schlüssels direkt in der URL ist aus Sicherheitsaspekten eher unschön, weshalb hierfür generell andere Methoden empfohlen werden (POST, Header, OAuth).
Für unser kleines bzw. einmaliges Experiment ist dieses Vorgehen aus Gründen der Einfachheit vorzuziehen.
Wir können die API Schlüssel nach dem Experiment direkt wieder deaktivieren bzw. löschen.
&lt;/div>
&lt;/div>
&lt;h4 id="daten-aufbereiten">Daten aufbereiten&lt;/h4>
&lt;p>Die Antwort der HERE Routing API erfolgt im &lt;a href="https://www.json.org/json-de.html" target="_blank" rel="noopener">JSON Format&lt;/a>.
In OpenRefine ist das JSON nicht menschenlesbar formatiert, so dass wir es mit dem Online Service &lt;a href="https://jsonformatter.org/" target="_blank" rel="noopener">JSON formatter&lt;/a> menschenlesbar formatieren.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;routes&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;5dae984c-da74-4bf3-b126-a4b8f44f35f7&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;sections&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;ff1eaf83-4cae-498e-b0f0-b2fe68227106&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;vehicle&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;departure&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;time&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2022-10-24T11:10:38+02:00&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;place&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;place&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;location&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">48.7789779&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lng&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">9.1864948&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;originalLocation&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">48.7792369&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lng&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">9.186687&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;arrival&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;time&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2022-10-24T12:17:31+02:00&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;place&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;place&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;location&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">48.389022&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lng&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">9.3690754&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;originalLocation&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">48.388977&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lng&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">9.369079&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;summary&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;duration&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4013&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;length&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">62748&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;baseDuration&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">3617&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;transport&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;mode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;car&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die für uns interessanten Daten sind im Bereich &lt;code>summary&lt;/code> zu finden. Unter &lt;code>length&lt;/code> finden wir die Entfernung in Metern und unter &lt;code>baseDuration&lt;/code> die von der aktuellen Verkehrssituation unabhängige und daher optimistisch berechnete Fahrtdauer in Sekunden. Weitere Informationen zu unterschiedlichen Angaben zur Fahrdauer und wie sie angefragt werden können, sind in der &lt;a href="https://developer.HERE.com/documentation/routing-api/dev_guide/topics/use-cases/duration.html" target="_blank" rel="noopener">Entwickler Dokumentation&lt;/a> zu finden.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
Das Routing via öffentlichem Nahverkehr befand sich zum Zeitpunkt der Durchführung dieses Experimentes im Beta Stadium und wurde daher nicht getestet.
&lt;/div>
&lt;/div>
&lt;p>Um aus dem JSON die für uns relevanten Daten in OpenRefine Spalten zu überführen, nutzen wir die Funktion &amp;ldquo;HERE&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;p>Die erste neue Spalte nennen wir &amp;ldquo;HERE Entfernung&amp;rdquo; und verwenden den folgenden GREL Ausdruck zur Extraktion und Umwandlung der Entfernung in Kilometern:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">routes&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">sections&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">summary&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">length&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">round&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die zweite neue Spalte nennen wir &amp;ldquo;HERE Dauer&amp;rdquo; und verwenden den folgenden GREL Ausdruck zur Extraktion und Umwandlung der Dauer in Minuten:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">routes&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">sections&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">summary&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">baseDuration&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="verwendung-von-openrouteservice">Verwendung von OpenRouteService&lt;/h3>
&lt;p>Bei &lt;a href="https://openrouteservice.org/" target="_blank" rel="noopener">OpenRouteService&lt;/a> handelt es sich um einen OpenSource Geodatendienst, welcher auf Daten von OpenStreepMaps basiert.
Die Anmeldung und die Verwendung ist sehr einfach gehalten. Entsprechend ist auch die API im Vergleich zu den hier verwendeten kommerziellen Diensten nicht ganz so umfangreich. Die Verwendung der API zur Berechnung von Routen ist in der &lt;a href="https://openrouteservice.org/dev/#/api-docs/v2/directions/%7bprofile%7d/get" target="_blank" rel="noopener">Entwickler Dokumentation&lt;/a> beschrieben.&lt;/p>
&lt;h4 id="daten-abrufen-1">Daten abrufen&lt;/h4>
&lt;p>Das Vorgehen zur Abfrage einer WebAPI via GET-Requests haben wir schon bei der Verwendung der HERE Routing API beschrieben.&lt;/p>
&lt;p>Wir laden die Daten in eine neue Spalte namens &amp;ldquo;OpenRouteService&amp;rdquo;.
Der GREL Code zum dynamischen Erstellen der URLs für die einzelnen Zeilen sieht wie folgt aus:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;https://api.openrouteservice.org/v2/directions/driving-car?start=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Start Lon&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Start Lat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;end=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Lon&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Lat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;api_key={YOUR_API_KEY}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="daten-aufbereiten-1">Daten aufbereiten&lt;/h4>
&lt;p>Die JSON Antwort von OpenRouteService besteht aus mehreren tausend Elementen im JSON Format, da wir hier zusätzlich die komplette Route mitgeschickt bekommen. Die für uns interessanten Daten finden wir wieder im Element &lt;code>summary&lt;/code>. Die Entfernung ist wieder in Metern und die Dauer in Sekunden angeben.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;summary&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;distance&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">62204.3&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;duration&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">3993.7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Um aus dem JSON die für uns relevanten Daten in OpenRefine Spalten zu überführen, nutzen wir die Funktion &amp;ldquo;OpenRouteService&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;p>Die erste neue Spalte nennen wir &amp;ldquo;ORS Entfernung&amp;rdquo; und verwenden den folgenden GREL Ausdruck zur Extraktion und Umwandlung der Entfernung in Kilometern:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">features&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">properties&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">summary&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">distance&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">round&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die zweite neue Spalte nennen wir &amp;ldquo;ORS Dauer&amp;rdquo; und verwenden den folgenden GREL Ausdruck zur Extraktion und Umwandlung der Dauer in Minuten:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">features&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">properties&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">summary&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">duration&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">round&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="verwendung-von-google-maps">Verwendung von Google Maps&lt;/h3>
&lt;p>Google hat bei den hier verwendeten Webdiensten das weitaus umfangreichste API Angebot.
Der Account Setup ist hier jedoch im Vergleich auch etwas aufwendiger.&lt;/p>
&lt;p>Wir verwenden die &lt;a href="https://developers.google.com/maps/documentation/directions?hl=de" target="_blank" rel="noopener">Directions API&lt;/a> von Google Maps.
Es gibt zwar auch eine neuere &lt;a href="https://developers.google.com/maps/documentation/routes?hl=de" target="_blank" rel="noopener">Routes API&lt;/a>, die derzeit in einer Vorschau-Version zur Verfügung steht. Diese bietet jedoch zum Zeitpunkt dieses Experiments (noch?) keine GET-Requests oder Routing via ÖPNV an.&lt;/p>
&lt;h4 id="daten-abrufen-2">Daten abrufen&lt;/h4>
&lt;p>Über die Directions API von Google Maps lassen sich auch Routen mit dem öffentlichen Nahverkehr planen.
Daher fokussieren wir uns bei diesem Dienst auf diese Funktionalität.&lt;/p>
&lt;p>Da Ausflüge wie Wanderungen häufig an Sonntagen stattfinden, dort jedoch der öffentliche Nahverkehr anders getaktet ist als unter der Woche, geben wir bei dieser Abfrage zusätzlich unsere gewünschte Ankunftszeit an (Sonntag, 31. Oktober 2022 um 10:00 Uhr).
Die Zeitangaben werden in &amp;ldquo;Sekunden seit dem 1. Januar 1970&amp;rdquo; angegeben. In OpenRefine berechnen wir das mit dem folgenden GREL Ausdruck:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;2022-10-31 10:00&amp;#34;&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toDate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;yyyy-MM-dd HH:mm&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">datePart&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;time&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">1000&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Hier eingefügt in den GREL-Code zur dynamischen Erstellung von URLs für das Hinzufügen neuer Spalten via URLs für OpenRefine:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;https://maps.googleapis.com/maps/api/directions/json?origin=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Start Lat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Start Lon&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;destination=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Lat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Lon&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;mode=transit&amp;amp;arrival_time=&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;2022-10-31 10:00&amp;#34;&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toDate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;yyyy-MM-dd HH:mm&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">datePart&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;time&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">1000&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;language=de&amp;amp;key={YOUR_API_KEY}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="daten-aufbereiten-2">Daten aufbereiten&lt;/h4>
&lt;p>Die JSON Antwort der Google Maps Direction API ist recht ausführlich, wenn denn eine funktionierende Strecke gefunden werden konnte.
Hier ein kleiner Ausschnitt:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;copyrights&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Map data ©2022 GeoBasis-DE/BKG (©2009)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;legs&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;arrival_time&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;10:22&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;time_zone&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Europe/Berlin&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1667208156&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;departure_time&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;09:06&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;time_zone&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Europe/Berlin&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1667203588&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;distance&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;48,2 km&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">48218&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;duration&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;1 Stunde, 16 Minuten&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4568&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;end_address&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Panorama Therme, 72660 Beuren, Deutschland&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;end_location&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">48.5655941&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lng&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">9.3967464&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;start_address&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Eugenstraße 7, 70182 Stuttgart, Deutschland&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;start_location&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">48.77899370000001&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lng&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">9.1865211&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;steps&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Interessant ist hier, dass wir die Werte für die Entfernung und Dauer sowohl als Text, als auch in Metern bzw. Sekunden erhalten.
Wir extrahieren auch hier die Zahlenwerte, da diese einfacher in ein einheitliches Format umgewandelt werden können.&lt;/p>
&lt;p>Die erste neue Spalte nennen wir &amp;ldquo;Google Entfernung (ÖPNV)&amp;rdquo; und verwenden den folgenden GREL Ausdruck zur Extraktion und Umwandlung der Entfernung in Kilometern:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">routes&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">legs&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">distance&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">round&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die zweite neue Spalte nennen wir &amp;ldquo;Google Dauer (ÖPNV)&amp;rdquo; und verwenden den folgenden GREL Ausdruck zur Extraktion und Umwandlung der Dauer in Minuten:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">routes&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">legs&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">duration&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">round&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="formate-anpassen">Formate anpassen&lt;/h3>
&lt;p>Zur Verbesserung der Lesbarkeit, ergänzen wir die Entfernungsspalten um die Angabe &amp;ldquo;km&amp;rdquo;.
Dafür nutzen wir &amp;ldquo;Spalte&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;rdquo; und den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;km&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In den Spalten zur Dauer wandeln wir die Angaben von Minuten in Stunden und Minuten um.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toDate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;mm&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">d&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">d&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">datePart&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;h&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">h&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">d&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">datePart&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;min&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">min&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">h&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">h&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;h &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">min&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;min&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">min&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;min&amp;#34;&lt;/span>&lt;span class="p">))))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das Endergebnis ist in Abbildung 11 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-fertigen-projektes-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des fertigen Projektes in OpenRefine." srcset="
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-fertig_hu2f011a17eda5fcbd7de9798882891477_136944_dcd955d3713007aefb71500a78aeabb0.webp 400w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-fertig_hu2f011a17eda5fcbd7de9798882891477_136944_952b2cfd4198f3d4268bf6530920849a.webp 760w,
/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-fertig_hu2f011a17eda5fcbd7de9798882891477_136944_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-10-entfernungen-zu-gpx-tracks-mit-openrefine-ermitteln/screenshot-openrefine-fertig_hu2f011a17eda5fcbd7de9798882891477_136944_dcd955d3713007aefb71500a78aeabb0.webp"
width="760"
height="558"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des fertigen Projektes in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Dieser Artikel ist überraschend lang geworden. Das liegt hauptsächlich daran, dass wir versuchen Hintergründe zu erklären, mit der Auswertung der Wegpunkte einen etwas komplizierteren Fall durchspielen und uns gleich drei unterschiedliche WebAPIs ansehen.&lt;/p>
&lt;p>In einem vereinfachten Test mit einem anderen Datensatz unter der Verwendung des ersten Punktes der Wanderung als Zielpunkt und nur einer API, haben wir die Bearbeitung in etwa 10 Minuten abgeschlossen. Und zwar inklusive Export in eine Software für Tabellenkalkulation und anschließender visueller Formatierung für den Druck.&lt;/p>
&lt;p>Generell waren wir überrascht, wie wenig aufwendig es ist, eine Menge von GPX-Dateien im XML-Format in OpenRefine einzulesen, die relevanten Geokoordinaten herauszufiltern und damit Anfragen an eine WebAPI zu stellen.&lt;/p>
&lt;p>Bei den WebAPIs hat uns OpenRouteService in seiner Einfachheit gefallen.
Der Funktionsumfang der API ist nicht so umfangreich, wie bei den kommerziellen Anbietern.
Jedoch ist der initiale Aufwand für die Account Registrierung geringer, sowie die Erstellung eines API Schlüssels sehr übersichtlich gehalten.&lt;/p>
&lt;p>Das Erstellen eines Accounts und API Schlüssels für die HERE Routing API war ebenfalls sehr direkt und die Arbeit mit der API machte uns sofort Spaß.
Die HERE Routing API lädt dazu ein, noch viel mehr und umfangreicher mit ihr zu arbeiten.&lt;/p>
&lt;p>Bei Google fühlten wir uns zuerst von der Menge der Dienste und möglichen Alternativen erschlagen.
Die Google Maps Direction API ist dann auch sehr umfangreich, so dass wir im Vergleich mit den anderen APIs etwas länger brauchten, um genau unseren Use-Case damit abzubilden.
Dafür konnten wir damit problemlos die Anfahrt mit dem Öffentlichen Personennahverkehr berechnen.&lt;/p>
&lt;p>Auch wenn es sich bei den Daten für dieses Experiment nicht um &amp;ldquo;klassische&amp;rdquo; Archivdaten handelt, so hilft uns das Experiment besser zu verstehen, wie OpenRefine uns dabei unterstützt Daten aus unterschiedlichen Quellen zusammenzuführen.
Im Kontext der einfachen Installation von OpenRefine steigert die Anbindung von generischen WebAPIs ohne Programmierkenntnisse die Attraktivität von OpenRefine weiter.&lt;/p></description></item><item><title>Workshop - Arbeiten mit GREL</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/</guid><description>&lt;p>In diesem Tutorial beschäftigen wir uns mit der &amp;ldquo;General Refine Expression Language&amp;rdquo; (GREL).&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>GREL in der &lt;a href="https://docs.openrefine.org/manual/expressions" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;br>
GREL Rezepte im &lt;a href="https://github.com/OpenRefine/OpenRefine/wiki/Recipes" target="_blank" rel="noopener">OpenRefine Wiki&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;p>Mit der &lt;em>General Refine Expression Language&lt;/em> (GREL) werden in OpenRefine die einzelnen Operationen auf den Daten ausgeführt.
Die meisten Funktionen und Dialoge in OpenRefine sind quasi nur ein Eingabeformular für GREL Ausdrücke,
die in den Facets angezeigten Daten basieren auf GREL Ausdrücken und in verschiedenen Dialogen können wir auch direkt GREL Ausdrücke verwenden, um zum Beispiel Daten zu transformieren.&lt;/p>
&lt;p>Die Syntax von GREL ist dabei an die Programmiersprache &lt;a href="https://de.wikipedia.org/wiki/JavaScript" target="_blank" rel="noopener">JavaScript&lt;/a> angelehnt, die unterliegende Technologie basiert jedoch auf der Programmiersprache &lt;a href="https://de.wikipedia.org/wiki/Java-Technologie" target="_blank" rel="noopener">Java&lt;/a>.
Dadurch entstehen Verständnisprobleme, wenn zum Beispiel reguläre Ausdrücke im Stil von JavaScript geschrieben werden,
dann jedoch in OpenRefine intern von Java ausgewertet werden und entsprechend die Funktionalität von regulären Ausdrücken in Java unterstützen.&lt;/p>
&lt;p>Die Eingabe von GREL Ausdrücken erfolgt (meistens) über Dialogfenster wie in Abbildung 1.
Hier sehen wir nicht nur eine Vorschau der Umwandlung, die wir gerade anstreben, sondern können auch vorherige oder gespeicherte (&lt;em>Starred&lt;/em>) GREL Ausdrücke laden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-eines-dialog-fensters-zur-transformation-von-daten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto eines Dialog Fensters zur Transformation von Daten in OpenRefine." srcset="
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-dialog_hua71ff9a0142e0958db5b592ee2c14782_23356_aaddd7ddcf7efbe93ed3bb28ae4854b6.webp 400w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-dialog_hua71ff9a0142e0958db5b592ee2c14782_23356_fdcf9e0e2fff7ecc7edec1973a2a3769.webp 760w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-dialog_hua71ff9a0142e0958db5b592ee2c14782_23356_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-dialog_hua71ff9a0142e0958db5b592ee2c14782_23356_aaddd7ddcf7efbe93ed3bb28ae4854b6.webp"
width="628"
height="647"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto eines Dialog Fensters zur Transformation von Daten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="werte-variablen-objekte">Werte, Variablen, Objekte&lt;/h3>
&lt;p>In Programmiersprachen gibt es verschiedene Konzepte um mit Daten zu arbeiten.&lt;/p>
&lt;p>Ein Konzept ist die Typisierung von Daten. So wird bei Werten zum Beispiel zwischen Text und Zahlen unterschieden.
Mit diesen Werten können dann verschiedene Operationen und Berechnungen durchgeführt werden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="m">5&lt;/span> &amp;gt; &lt;span class="m">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt; &lt;span class="nb">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Diesen Werten können via Variablen auch Namen zugewiesen werden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">laenge&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">breite&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">laenge &amp;gt; breite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt; &lt;span class="nb">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Oder es gibt spezielle Funktionen für Werte eines bestimmten Typs:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;Lorem ipsum&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">length&lt;span class="o">(&lt;/span>text&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt; &lt;span class="m">11&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Werte und Funktionen lassen sich zu Objekten zusammenfassen.
Via Variable kann ein bestimmtes Objekt gespeichert und darauf zugegriffen werden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">Rechteck&lt;span class="o">(&lt;/span>laenge, breite&lt;span class="o">)&lt;/span>:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">laenge&lt;/span> &lt;span class="o">=&lt;/span> leange
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">breite&lt;/span> &lt;span class="o">=&lt;/span> breite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> flaeche&lt;span class="o">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> laenge * breite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">rechteck1&lt;/span> &lt;span class="o">=&lt;/span> Rechteck&lt;span class="o">(&lt;/span>5, 2&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">rechteck2&lt;/span> &lt;span class="o">=&lt;/span> Rechteck&lt;span class="o">(&lt;/span>4, 2&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rechteck1.flaeche &amp;gt; rechteck2.flaeche
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt; &lt;span class="nb">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In GREL verwenden wir hauptsächlich schon existierende Variablen, Funktionen und Objekte.&lt;/p>
&lt;h3 id="datentypen">Datentypen&lt;/h3>
&lt;p>In der OpenRefine Oberfläche arbeiten wir mit vier Datentypen: &lt;em>boolean&lt;/em>, &lt;em>date&lt;/em>, &lt;em>number&lt;/em> und &lt;em>string&lt;/em>.
In GREL gibt es noch die Datentypen &lt;em>array&lt;/em>, &lt;em>object&lt;/em> und &lt;em>regex&lt;/em>.
Texte (&lt;em>string&lt;/em>) können zusätzlich in eine Repräsentation für &lt;em>HTML&lt;/em>, &lt;em>JSON&lt;/em> oder &lt;em>XML&lt;/em> geparsed werden.
Das bedeutet vereinfacht, dass die (Text-)Daten intern von OpenRefine in eine Repräsentation überführt werden, die zum Beispiel XML versteht und dafür passende Funktionen anbietet. Also zum Beispiel die Funktion über alle XML-Knoten mit einem bestimmten Namen zu iterieren.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Typ&lt;/th>
&lt;th>Kürzel&lt;/th>
&lt;th>GUI&lt;/th>
&lt;th>Beispiel(e)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>array&lt;/td>
&lt;td>a&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;code>[&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;]&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>boolean&lt;/td>
&lt;td>b&lt;/td>
&lt;td>Ja&lt;/td>
&lt;td>&lt;code>true&lt;/code>, &lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>date&lt;/td>
&lt;td>d&lt;/td>
&lt;td>Ja&lt;/td>
&lt;td>&lt;code>[date 2022-05-03T15:00:00Z]&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>number&lt;/td>
&lt;td>n&lt;/td>
&lt;td>Ja&lt;/td>
&lt;td>&lt;code>1&lt;/code>, &lt;code>3.1415&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>object&lt;/td>
&lt;td>o&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;code>[object Cell]&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>regex&lt;/td>
&lt;td>p&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;code>/\d{4}/&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>string&lt;/td>
&lt;td>s&lt;/td>
&lt;td>Ja&lt;/td>
&lt;td>&lt;code>Lorem ipsum...&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="variablen">Variablen&lt;/h3>
&lt;p>Beim Arbeiten mit GREL stehen uns zusätzlich einige &lt;a href="https://docs.openrefine.org/manual/expressions#variables" target="_blank" rel="noopener">Umgebungsvariablen&lt;/a> zur Verfügung.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Variable&lt;/th>
&lt;th>Alternative&lt;/th>
&lt;th>Beschreibung&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>cell&lt;/td>
&lt;td>row.cells[columnName]&lt;/td>
&lt;td>Aktuelle Zelle der ausgewählten Spalte.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cell.recon&lt;/td>
&lt;td>&lt;/td>
&lt;td>Reconciliation Daten für die Zelle.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cell.recon. &amp;hellip;&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;a href="https://docs.openrefine.org/manual/expressions#reconciliation" target="_blank" rel="noopener">Dokumentation zu Recon&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cell.value&lt;/td>
&lt;td>value&lt;/td>
&lt;td>Wert der Zelle.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cell. &amp;hellip;.&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;a href="https://docs.openrefine.org/manual/expressions#cell" target="_blank" rel="noopener">Dokumentation zu Cell&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>columnName&lt;/td>
&lt;td>&lt;/td>
&lt;td>Name der ausgewählten Spalte.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>row&lt;/strong>&lt;/td>
&lt;td>&lt;/td>
&lt;td>Aktuelle Zeile.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>row.cells&lt;/td>
&lt;td>cells&lt;/td>
&lt;td>Zellen in der aktuellen Zeile.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>row.cells. &amp;hellip;&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;a href="https://docs.openrefine.org/manual/expressions#cells" target="_blank" rel="noopener">Dokumentation zu Cells&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>row.index&lt;/td>
&lt;td>rowIndex&lt;/td>
&lt;td>Index der aktuellen Zeile.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>row.record&lt;/td>
&lt;td>&lt;/td>
&lt;td>Record der aktuellen Zeile.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>row.record. &amp;hellip;&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;a href="https://docs.openrefine.org/manual/expressions#record" target="_blank" rel="noopener">Dokumentation zu Record&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>row. &amp;hellip;.&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;a href="https://docs.openrefine.org/manual/expressions#row" target="_blank" rel="noopener">Dokumentation zu Row&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>value1&lt;/td>
&lt;td>&lt;/td>
&lt;td>Neu seit OpenRefine 3.9 für &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/#distance-functions">Distanz basiertes Clustering&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>value2&lt;/td>
&lt;td>&lt;/td>
&lt;td>Neu seit OpenRefine 3.9 für &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/#distance-functions">Distanz basiertes Clustering&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Die Variablen beinhalten teilweise einfache Werte (&lt;code>value&lt;/code>, &lt;code>rowIndex&lt;/code>) wie einen Text oder eine Zahl.
Teilweise verweisen sie auf komplexe Objekte, worin die Werte gesammelt oder verschachtelt gespeichert sind (&lt;code>row&lt;/code>).
Manche Variablen stellen auch Abkürzungen dar. So kann auf den Wert der aktuellen Zeile in der ausgewählten Spalte direkt mit &lt;code>value&lt;/code> zugegriffen werden, anstatt dies via &lt;code>row.cells[columnName].value&lt;/code> machen zu müssen.&lt;/p>
&lt;p>Hier eine Übersicht der Objekte und Variablen.&lt;/p>
&lt;div class="mermaid">---
title: Datenstruktur
config:
look: handDrawn
theme: neutral
---
flowchart LR
columnName
row.index[index]
row.cells[cells]
row.columnNames[columnNames]
row.starred[starred]
row.flagged[flagged]
row.record[record]
row.cells.cell[cell...]
row.cells.cell.value[value]
row.cells.cell.recon[recon]
row.cells.cell.recon.properties[...]
row.cells.cell.errorMessage[errorMessage]
row.cells.cell.errorMessage.value[value]
row.record.index[index]
row.record.cells[cells]
row.record.fromRowIndex[fromRowIndex]
row.record.toRowIndex[toRowIndex]
row.record.rowCount[rowCount]
row --> row.index &amp; row.cells &amp; row.columnNames &amp; row.starred &amp; row.flagged &amp; row.record
row.cells --> row.cells.cell
row.cells.cell --> row.cells.cell.value &amp; row.cells.cell.recon &amp; row.cells.cell.errorMessage
row.cells.cell.errorMessage --> row.cells.cell.errorMessage.value
row.cells.cell.recon --> row.cells.cell.recon.properties
row.record --> row.record.index &amp; row.record.cells &amp; row.record.fromRowIndex &amp; row.record.toRowIndex &amp; row.record.rowCount
cell -.-> row.cells.cell
cells -.-> row.cells
rowIndex -.-> row.index
value -.-> row.cells.cell.value
&lt;/div>
&lt;p>Fortsetzung für Reconciliation Daten einer Zelle:&lt;/p>
&lt;div class="mermaid">---
title: Datenstruktur - recon
config:
look: handDrawn
theme: neutral
---
flowchart LR
row.cells.cell.recon[row.cells.cell....recon]
row.cells.cell.recon.judgment[judgment]
row.cells.cell.recon.judgmentAction[judgmentAction]
row.cells.cell.recon.judgmentHistory[judgmentHistory]
row.cells.cell.recon.matched[matched]
row.cells.cell.recon.match[match]
row.cells.cell.recon.best[best]
row.cells.cell.recon.features[features]
row.cells.cell.recon.candidates[candidates]
row.cells.cell.recon.features.typeMatch[typeMatch]
row.cells.cell.recon.features.nameMatch[nameMatch]
row.cells.cell.recon.features.nameLevenshtein[nameLevenshtein]
row.cells.cell.recon.features.nameWordDistance[nameWordDistance]
match.id[id]
match.name[name]
match.type[type]
match.score[score]
row.cells.cell.recon --> row.cells.cell.recon.judgment &amp; row.cells.cell.recon.judgmentAction &amp; row.cells.cell.recon.judgmentHistory &amp; row.cells.cell.recon.matched &amp; row.cells.cell.recon.match &amp; row.cells.cell.recon.best &amp; row.cells.cell.recon.features &amp; row.cells.cell.recon.candidates
row.cells.cell.recon.match --> match.id &amp; match.name &amp; match.type
row.cells.cell.recon.best --> match.id &amp; match.name &amp; match.type &amp; match.score
row.cells.cell.recon.candidates --> match.id &amp; match.name &amp; match.type &amp; match.score
row.cells.cell.recon.features --> row.cells.cell.recon.features.typeMatch &amp; row.cells.cell.recon.features.nameMatch &amp; row.cells.cell.recon.features.nameLevenshtein &amp; row.cells.cell.recon.features.nameWordDistance
&lt;/div>
&lt;p>Auf Attribute eines Objekts kann punktnotiert &lt;code>row.cells&lt;/code> oder via Klammern &lt;code>row[&amp;quot;cells&amp;quot;]&lt;/code> zugegriffen werden.
Prinzipiell empfiehlt es sich aus Gründen der Lesbarkeit die Punktnotation zu verwenden und die Variante mit Klammern nur, wenn der Name in einer Variablen steht &lt;code>cells[columnName]&lt;/code> oder wir mit Spaltennamen arbeiten, die potentiell &amp;ldquo;Sonderzeichen&amp;rdquo; beinhalten können &lt;code>cells[&amp;quot;GND-ID&amp;quot;]&lt;/code>.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
Aktuell kann nicht auf &lt;strong>alle&lt;/strong> Werte einer Spalte zugegriffen werden.
Man kann aber auf alle Werte einer Spalte eines Records zugreifen: &lt;code>row.record.cells[columnName]&lt;/code>.
&lt;/div>
&lt;/div>
&lt;h3 id="kontrollstrukturen">Kontrollstrukturen&lt;/h3>
&lt;p>Etwas verwirrend ist das Definieren von eigenen Variablen in GREL.
Das geschieht mit einer &lt;a href="https://docs.openrefine.org/manual/grel#withe1-variable-v-e2" target="_blank" rel="noopener">with&lt;/a> Anweisung.
Im folgenden Beispiel setzen wir die Variable &lt;code>jahr&lt;/code> auf den Wert &lt;code>1988&lt;/code> und berechnen dann den Ausdruck &lt;code>jahr &amp;lt; 2000&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1988&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">jahr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">jahr&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">2000&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-note">
&lt;div>
Wir geben das erwartete Ergebnis der GREL Ausdrücke in den Beispielen zusätzlich via &lt;code>== ...&lt;/code> an, so dass das Ergebnis auch abgelesen werden kann, ohne den Ausdruck in OpenRefine oder im Kopf auswerten zu müssen.
&lt;/div>
&lt;/div>
&lt;p>Eine der essentiellen Kontrollstrukturen in der Informatik ist die Verzweigung.
In GREL wird dies mit &lt;a href="https://docs.openrefine.org/manual/grel#ife-etrue-efalse" target="_blank" rel="noopener">if&lt;/a> realisiert.
Im folgenden Beispiel setzen wir wie zuvor die Variable &lt;code>jahr&lt;/code> auf den Wert &lt;code>1988&lt;/code>, geben aber abhängig von dem Ergebnis einer Prüfung unterschiedliche Werte zurück. Die if-Anweisungen können auch ineinander verschachtelt werden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1988&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">jahr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">if&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="nx">jahr&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">1980&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">and&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">jahr&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">1990&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="s2">&amp;#34;80er&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Sonstiges&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;80er&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anstatt einer Verzweigung ist es manchmal auch nötig eine komplette Liste (technisch Array) von Werten zu filtern.
Dafür gibt es in GREL eine &lt;a href="https://docs.openrefine.org/manual/grel#filtere1-v-e-test" target="_blank" rel="noopener">filter()&lt;/a> Funktion.
Im folgenden Beispiel erstellen wir einen Array aus einem Text indem wir ihn mit &lt;a href="https://docs.openrefine.org/manual/grelfunctions#splits-s-or-p-sep-b-preservetokens-optional" target="_blank" rel="noopener">split()&lt;/a> am Trennzeichen &lt;code>,&lt;/code> trennen.
Anschließend wandeln die einzelnen Elemente mit &lt;a href="https://docs.openrefine.org/manual/grelfunctions#tonumbers" target="_blank" rel="noopener">toNumber()&lt;/a> in Zahlen um und filtern anschließend nur die geraden Zahlen via &lt;code>mod(number, 2) == 2&lt;/code>.
Um das Ergebnis in OpenRefine ausgeben zu können, wandeln wir die Daten im Array anschließend mit &lt;a href="https://docs.openrefine.org/manual/grelfunctions#joina-sep" target="_blank" rel="noopener">join()&lt;/a> wieder in einen Text um, da OpenRefine in der GUI keine Arrays anzeigen kann.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;1,2,3,4,5,6,7,8,9,10&amp;#34;&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toNumber&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;2,4,6,8,10&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Um alle Werte einer Liste (technisch Array) durchzugehen, gibt es in GREL die
&lt;a href="https://docs.openrefine.org/manual/grel#foreache1-v-e2" target="_blank" rel="noopener">forEach&lt;/a> Anweisung.
Im folgenden Beispiel erstellen wir mit &lt;code>split()&lt;/code> einen Array aus einem Text und fügen mit &lt;code>+&lt;/code> zu jedem Element die Endung &amp;ldquo;er&amp;rdquo; hinzu.
Anschließend fügen wir die Daten im Array mit &lt;code>join()&lt;/code> wieder zu einen Text zusammen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;70,80,90&amp;#34;&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;er&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;70er,80er,90er&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Zusätzlich gibt es noch weitere Helfer. Um den Typ eines Wertes zu prüfen gibt es verschiedene Varianten von &lt;a href="https://docs.openrefine.org/manual/grel#isblanke-isnonblanke-isnulle-isnotnulle-isnumerice-iserrore" target="_blank" rel="noopener">is&amp;hellip;&lt;/a>, um einen bestimmten Bereich aufzuzählen &lt;a href="https://docs.openrefine.org/manual/grel#forrangen-from-n-to-n-step-v-e" target="_blank" rel="noopener">forRange&lt;/a> oder um eine Liste (technisch Array) aufzuzählen &lt;a href="https://docs.openrefine.org/manual/grel#foreachindexe1-i-v-e2" target="_blank" rel="noopener">forEachIndex&lt;/a>.&lt;/p>
&lt;details class="spoiler " id="spoiler-6">
&lt;summary>Extra: forNonBlank&lt;/summary>
&lt;p>&lt;p>Da sie etwas verwirrend ist, geben wir der Funktion &lt;a href="https://docs.openrefine.org/manual/grel#fornonblanke-v-enonblank-eblank" target="_blank" rel="noopener">forNonBlank&lt;/a> hier noch einen separaten Absatz.
Angenommen wir wollen eine Liste (technisch Array) von Werten durchgehen und dabei nur Werte bearbeiten, die einen Inhalt haben.
Also zum Beispiel die &lt;code>[&amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;4&amp;quot;, &amp;quot;5&amp;quot;]&lt;/code> umwandeln in &lt;code>1,2,0,4,5&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forNonBlank&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="s2">&amp;#34;1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;4&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;5&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;1,2,,4,5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das klappt so nicht, da &lt;code>forNonBlank(v, ...)&lt;/code> eine andere Schreibweise für &lt;code>if(isNonBlank(v), ...)&lt;/code> ist.
Der korrekte Weg ist also einer der beiden folgenden Ausdrücke.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="s2">&amp;#34;1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;4&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;5&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isNonBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">v&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;1,2,0,4,5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="s2">&amp;#34;1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;4&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;5&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">forNonBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;1,2,0,4,5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h3 id="standardbibliothek">Standardbibliothek&lt;/h3>
&lt;p>Üblicherweise haben Programmiersprachen eine Standardbibliothek von Funktionen zum Arbeiten mit den zur Verfügung gestellten Datentypen.&lt;/p>
&lt;p>Diese ist bei GREL im Vergleich zu anderen Programmiersprachen zwar recht übersichtlich, kann hier aber trotzdem nicht vollständig besprochen werden.
Wir empfehlen daher, die &lt;a href="https://docs.openrefine.org/manual/grelfunctions" target="_blank" rel="noopener">Liste der in OpenRefine verfügbaren Funktionen&lt;/a> als Referenz verfügbar zu halten.&lt;/p>
&lt;p>Wir gehen hier auf ein paar Besonderheiten von GREL ein.&lt;/p>
&lt;h4 id="syntax-für-funktionsaufrufe">Syntax für Funktionsaufrufe&lt;/h4>
&lt;p>Eine Besonderheit in GREL ist, dass Funktionen zur besseren Lesbarkeit auch in Punktnotation aufgerufen werden können.
Also &lt;code>length(value)&lt;/code> auch geschrieben werden kann als &lt;code>value.length()&lt;/code>.&lt;/p>
&lt;h4 id="aliase">Aliase&lt;/h4>
&lt;p>Es gibt Funktionen, die unter mehreren Namen verfügbar sind.&lt;/p>
&lt;p>Beispielsweise sind &lt;a href="https://docs.openrefine.org/manual/grelfunctions#trims" target="_blank" rel="noopener">trim()&lt;/a> und &lt;a href="https://docs.openrefine.org/manual/grelfunctions#strips" target="_blank" rel="noopener">strip()&lt;/a> bis auf ihre Namen identisch und wurden auch &lt;a href="https://github.com/OpenRefine/OpenRefine/commit/f1923758e771f1c3ce385859599cf2c06d6d9d71" target="_blank" rel="noopener">gleichzeitig&lt;/a> in OpenRefine eingeführt.
Vermutlich sollte das Quereinsteigern von anderen Programmiersprachen den Einstieg vereinfachen.&lt;/p>
&lt;h2 id="vorbereitung-projekt-erstellen">Vorbereitung: Projekt erstellen&lt;/h2>
&lt;p>Wir laden die folgende Datei in ein OpenRefine Projekt.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/09_kretschmann-kabinett-iii-grel.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kretschmann Kabinett III&lt;/a>
&lt;p>Wie in Abbildung 2 beinhaltet die Datei das Kabinett Kretschmann III mit den Berufen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-direkt-nach-dem-laden">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes direkt nach dem Laden." srcset="
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-start_hucaa2914f8e6f784b182b02a52782faf6_32946_35fd9e933e599a3cfaf21fbfaa66933a.webp 400w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-start_hucaa2914f8e6f784b182b02a52782faf6_32946_97d584b4dd42d2964deb633925819e2a.webp 760w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-start_hucaa2914f8e6f784b182b02a52782faf6_32946_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-start_hucaa2914f8e6f784b182b02a52782faf6_32946_35fd9e933e599a3cfaf21fbfaa66933a.webp"
width="760"
height="210"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes direkt nach dem Laden.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-1-grel-variablen-nutzen">Aufgabe 1: GREL Variablen nutzen&lt;/h2>
&lt;p>Das Geburtsdatum ist in drei Spalten aufgeteilt, wir wollen das Geburtsdatum jedoch in einer Spalte haben und dabei den Monat auch noch ausgeschrieben haben.
Das haben wir in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/#aufgabe-5-spalten-zusammenf%C3%BChren">03 Transformieren: Aufgabe 5&lt;/a> so ähnlich schon einmal mit Funktionen in der Benutzeroberfläche gelöst.
Hier wollen wir GREL Funktionen verwenden, um die Bearbeitung in einem Schritt durchzuführen.&lt;/p>
&lt;p>Dafür verwenden wir
&amp;ldquo;Geburtsjahr&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;rdquo;
und entwickeln schrittweise den in Abbildung 3 gezeigten GREL Ausdruck.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialogs-zur-transformation">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialogs zur Transformation." srcset="
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-geburtsdatum_hu167ffd8fd3774eb2db5afd8a5930610c_27972_9d760af1f939e4e979b9eb59914f2681.webp 400w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-geburtsdatum_hu167ffd8fd3774eb2db5afd8a5930610c_27972_22b9fe69ce55c9872391a1afb88bdc25.webp 760w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-geburtsdatum_hu167ffd8fd3774eb2db5afd8a5930610c_27972_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-geburtsdatum_hu167ffd8fd3774eb2db5afd8a5930610c_27972_9d760af1f939e4e979b9eb59914f2681.webp"
width="759"
height="596"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialogs zur Transformation.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="schritt-1-geburtsmonat-umwandeln">Schritt 1: Geburtsmonat umwandeln&lt;/h3>
&lt;p>Um die Spalte &amp;ldquo;Geburtsmonat&amp;rdquo; in einen Namen umzuwandeln verwenden wir den Zugriff über &lt;code>row.cells[&amp;quot;Geburtsjahr&amp;quot;]&lt;/code> und die Funktionen &lt;a href="https://docs.openrefine.org/manual/grelfunctions#todateo-b-monthfirst-s-format1-s-format2-" target="_blank" rel="noopener">toDate()&lt;/a> und &lt;a href="https://docs.openrefine.org/manual/grelfunctions#tostringo-string-format-optional" target="_blank" rel="noopener">toString()&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsmonat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toDate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;M&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;MMMM&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="schritt-2-spalten-zusammenfügen">Schritt 2: Spalten zusammenfügen&lt;/h3>
&lt;p>Um die Spalten zusammenzufügen verwenden wir den Operator &lt;code>+&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtstag&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;. &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsmonat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsjahr&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="schritt-3-verzweigung-einbauen">Schritt 3: Verzweigung einbauen&lt;/h3>
&lt;p>Für manche Zeilen wird entweder eine Fehlermeldung oder &lt;code>null&lt;/code> angezeigt.
Das sind die Zeilen, wo kein Geburtstag und kein Geburtsmonat vorhanden sind.&lt;/p>
&lt;p>Diese behandeln wir separat mit einer Verzweigung und passen dabei den Typ der Inhalte der Spalte &amp;ldquo;Geburtsjahr&amp;rdquo; an.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">isBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtstag&amp;#34;&lt;/span>&lt;span class="p">]),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsjahr&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="aufgabe-1">Aufgabe 1&lt;/h3>
&lt;p>Fügen Sie die drei obigen GREL Ausdrücke zu einem GREL Ausdruck zusammen.&lt;/p>
&lt;details class="spoiler " id="spoiler-13">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">isBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtstag&amp;#34;&lt;/span>&lt;span class="p">]),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsjahr&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtstag&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;. &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsmonat&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toDate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;M&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;MMMM&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsjahr&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-2-werte-aufräumen-und-sortieren">Aufgabe 2: Werte aufräumen und sortieren&lt;/h2>
&lt;p>Die Werte in der Spalte &amp;ldquo;Beruf oder Beschäftigung&amp;rdquo; sind nicht sortiert, haben teilweise Duplikate und teilweise numerische Referenzen hinter den Berufsbezeichnungen.
Diese Spalte wollen wir daher in einem Schritt mit einem GREL Ausdruck aufräumen und dabei die numerischen Referenzen entfernen, Duplikate entfernen und die Werte alphabetisch sortieren.&lt;/p>
&lt;p>Dafür verwenden wir den Dialog
&amp;ldquo;Beruf oder Beschäftigung&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;rdquo;
und erarbeiten uns einen GREL Ausdruck.&lt;/p>
&lt;h3 id="schritt-1-text-in-liste-umwandeln">Schritt 1: Text in Liste umwandeln&lt;/h3>
&lt;p>Um die einzelnen Werte im Text in eine Liste (technisch Array) umzuwandeln, verwenden wir &lt;a href="https://openrefine.org/docs/manual/grelfunctions#splits-s-or-p-sep-b-preservetokens-optional" target="_blank" rel="noopener">split()&lt;/a> mit &lt;code>,&lt;/code> als Trennzeichen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;Politiker, Abgeordneter, Lehrer, Regierungschef, Politiker (5), Lehrer (3)&amp;#34;&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;, &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="schritt-2-numerische-referenzen-entfernen">Schritt 2: Numerische Referenzen entfernen&lt;/h3>
&lt;p>Um die numerischen Referenzen zu entfernen verwenden wir &lt;a href="https://docs.openrefine.org/manual/grelfunctions#replaces-s-or-p-find-s-replace" target="_blank" rel="noopener">replace()&lt;/a> mit einem regulären Ausdruck und entfernen zusätzliche Leerzeichen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;Politiker (5)&amp;#34;&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\(\d+\)/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="schritt-3-funktion-auf-alle-elemente-anwenden">Schritt 3: Funktion auf alle Elemente anwenden&lt;/h3>
&lt;p>Um die Ersetzung der numerischen Referenzen auf alle Elemente in der Liste (technisch Array) anzuwenden nutzen wir &lt;a href="https://docs.openrefine.org/manual/grel#foreache1-v-e2" target="_blank" rel="noopener">forEach&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Politiker, Abgeordneter, Lehrer, Regierungschef, Politiker (5), Lehrer (3)&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="schritt-4-werte-vereinheitlichen-und-sortieren">Schritt 4: Werte vereinheitlichen und sortieren&lt;/h3>
&lt;p>Um die Werte zu vereinheitlichen und zu sortieren nutzen wir &lt;a href="https://docs.openrefine.org/manual/grelfunctions#uniquesa" target="_blank" rel="noopener">uniques()&lt;/a> und &lt;a href="https://docs.openrefine.org/manual/grelfunctions#sorta" target="_blank" rel="noopener">sort()&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Politiker, Abgeordneter, Lehrer, Regierungschef, Politiker, Lehrer&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">uniques&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">sort&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="schritt-5-text-aus-liste-erstellen">Schritt 5: Text aus Liste erstellen&lt;/h3>
&lt;p>Um aus der Liste (technisch Array) wieder einen Text zu erzeugen, verwenden wir &lt;a href="https://docs.openrefine.org/manual/grelfunctions#joina-sep" target="_blank" rel="noopener">join()&lt;/a> mit &lt;code>,&lt;/code> als Trennzeichen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Abgeordneter&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Lehrer&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Politiker&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Regierungschef&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;, &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="aufgabe-3">Aufgabe 3&lt;/h3>
&lt;p>Fügen Sie die fünf obigen GREL Ausdrücke zu einem GREL Ausdruck zusammen.
Das Ergebnis sollte in etwa wie in Abbildung 4 aussehen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-nach-der-bearbeitung">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes nach der Bearbeitung." srcset="
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-ziel_hu31884fd8468e9c60e0fcc9ebd508d4bd_29493_429f4d7120b8c3c72d377983cae502af.webp 400w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-ziel_hu31884fd8468e9c60e0fcc9ebd508d4bd_29493_79ac9b03c7a5805ff8e688c808b06fef.webp 760w,
/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-ziel_hu31884fd8468e9c60e0fcc9ebd508d4bd_29493_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/screenshot-openrefine-grel-projekt-ziel_hu31884fd8468e9c60e0fcc9ebd508d4bd_29493_429f4d7120b8c3c72d377983cae502af.webp"
width="732"
height="322"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes nach der Bearbeitung.
&lt;/figcaption>&lt;/figure>
&lt;details class="spoiler " id="spoiler-17">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;, &amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\(\d+\)/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">uniques&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">sort&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;, &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Viele Umwandlungen lassen sich in Einzelschritten über die graphische Oberfläche von OpenRefine ansteuern und umsetzen.
So kommt man auch ohne in GREL zu programmieren in OpenRefine recht weit.
Das Wissen um den Zugriff auf die Umgebungsvariablen und nützliche Funktionen wie &lt;code>find()&lt;/code>, &lt;code>replace()&lt;/code> oder Datumsumwandlungen ersetzt viele manuelle Schritte.&lt;/p>
&lt;p>Das explizite Programmieren mit Verzweigungen und Schleifen ergänzt Arbeitsschritte oder reduziert mehrere Einzelschritte in der graphischen Oberfläche zu einem Schritt. Beim &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/">Export von XML in OpenRefine (Templating)&lt;/a> sind die Kontrollstrukturen noch einmal relevant.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil behandeln wir das Konzept von &amp;ldquo;Records&amp;rdquo; in OpenRefine.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records" class="btn btn-primary px-3 py-3">10 Arbeiten mit Records&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Arbeiten mit Records in OpenRefine</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/</guid><description>&lt;p>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.&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>Records in der &lt;a href="https://docs.openrefine.org/manual/exploring#rows-vs-records" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;br>
Records mit GREL in der &lt;a href="https://docs.openrefine.org/manual/expressions#record" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;p>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.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-schaltflächen-zum-umschalten-zwischen-dem-zeilen--und-record-modus">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Schaltflächen zum Umschalten zwischen dem Zeilen- und Record-Modus." srcset="
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-rows-records_hu53885f69b77f290f824c50ed106862cb_3520_bdb16f220597885879ada1696520ee22.webp 400w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-rows-records_hu53885f69b77f290f824c50ed106862cb_3520_e4f83043801c174ed5ae35818b27d7bc.webp 760w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-rows-records_hu53885f69b77f290f824c50ed106862cb_3520_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-rows-records_hu53885f69b77f290f824c50ed106862cb_3520_bdb16f220597885879ada1696520ee22.webp"
width="464"
height="65"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Schaltflächen zum Umschalten zwischen dem Zeilen- und Record-Modus.
&lt;/figcaption>&lt;/figure>
&lt;p>Diese Schaltflächen ändern, wie OpenRefine aufeinanderfolgende Zeilen anzeigt, filtert, und bearbeitet.
Betrachten wir den folgenden Ausschnitt aus dem &lt;a href="https://de.wikipedia.org/wiki/Kabinett_Kretschmann_III" target="_blank" rel="noopener">Kabinett Kretschmann III&lt;/a>,
mit dem wir auch die folgenden Praxisaufgaben durchführen werden.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>All&lt;/th>
&lt;th style="text-align:left">Name&lt;/th>
&lt;th style="text-align:left">Beruf&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1.&lt;/td>
&lt;td style="text-align:left">Kretschmann, Winfried&lt;/td>
&lt;td style="text-align:left">Abgeordneter&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2.&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">Lehrer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3.&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">Politiker&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4.&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">Regierungschef&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5.&lt;/td>
&lt;td style="text-align:left">Walker, Thekla&lt;/td>
&lt;td style="text-align:left">Pädagogin&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6.&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">Politikerin&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7.&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">Weibliche Abgeordnete&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>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 &amp;ldquo;Beruf&amp;rdquo; nach dem Wert &amp;ldquo;Politik&amp;rdquo; gefiltert,
dann werden in diesem Modus nur die Zeilen 3. und 6. angezeigt.
Man weiß also nicht, zu welcher Person dieser Wert gehört.&lt;/p>
&lt;p>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.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>All&lt;/th>
&lt;th style="text-align:left">Name&lt;/th>
&lt;th style="text-align:left">Beruf&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1.&lt;/td>
&lt;td style="text-align:left">Kretschmann, Winfried&lt;/td>
&lt;td style="text-align:left">Abgeordneter&lt;br>Lehrer&lt;br>Politiker&lt;br>Regierungschef&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2.&lt;/td>
&lt;td style="text-align:left">Walker, Thekla&lt;/td>
&lt;td style="text-align:left">Pädagogin&lt;br>Politikerin&lt;br>Weibliche Abgeordnete&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>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.&lt;/p>
&lt;p>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.&lt;/p>
&lt;h2 id="vorbereitung-projekt-erstellen">Vorbereitung: Projekt erstellen&lt;/h2>
&lt;p>Die folgende Datei in ein OpenRefine-Projekt laden.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/10_kretschmann-kabinett-iii-records.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kretschmann III als CSV&lt;/a>
&lt;h2 id="aufgabe-1-records-aus-wiederholenden-zeilen-erstellen">Aufgabe 1: Records aus wiederholenden Zeilen erstellen&lt;/h2>
&lt;figure id="figure-bildschirmfoto-mit-den-berufen-der-mitglieder-im-kabinett-kretschmann-iii">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit den Berufen der Mitglieder im Kabinett Kretschmann III." srcset="
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-kabinett-kretschmann-iii_hu34cbf24686276aa89f09c1053791304c_45408_30795b118e438e024709635131a6a9b0.webp 400w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-kabinett-kretschmann-iii_hu34cbf24686276aa89f09c1053791304c_45408_08d9cce38d1b188511673a51f9b4ebe5.webp 760w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-kabinett-kretschmann-iii_hu34cbf24686276aa89f09c1053791304c_45408_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-kabinett-kretschmann-iii_hu34cbf24686276aa89f09c1053791304c_45408_30795b118e438e024709635131a6a9b0.webp"
width="235"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit den Berufen der Mitglieder im Kabinett Kretschmann III.
&lt;/figcaption>&lt;/figure>
&lt;p>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.&lt;/p>
&lt;p>Dafür verschieben wir die Spalte &amp;ldquo;Name&amp;rdquo; via
&amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Move column to beginning&amp;rdquo;
ganz nach links.
Anschließend sortieren wir die Spalte &amp;ldquo;Name&amp;rdquo; alphabetisch via
&amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Sort&amp;hellip;&amp;rdquo;
und fixieren diese Sortierung wie in Abbildung 3 zu sehen via
&amp;ldquo;Sort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reorder rows permanently&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-dem-menü-zum-sortieren">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit dem Menü zum Sortieren." srcset="
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-sort-permanently_hu29e0e3dace77fa662739d489c9b0c3c3_13172_cd3b3b3dacf5aecfe9b6f1a34cba3e5a.webp 400w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-sort-permanently_hu29e0e3dace77fa662739d489c9b0c3c3_13172_37cbf8aded2c99d190395a484ba3ca3c.webp 760w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-sort-permanently_hu29e0e3dace77fa662739d489c9b0c3c3_13172_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-sort-permanently_hu29e0e3dace77fa662739d489c9b0c3c3_13172_cd3b3b3dacf5aecfe9b6f1a34cba3e5a.webp"
width="737"
height="143"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit dem Menü zum Sortieren.
&lt;/figcaption>&lt;/figure>
&lt;p>Danach entfernen wir die Mehrfachnennung der Namen via
&amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Blank down&amp;rdquo;.
Das Ergebnis sieht dann wie in Abbildung 4 aus.&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-den-berufen-der-mitglieder-im-kabinett-kretschmann-iii">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit den Berufen der Mitglieder im Kabinett Kretschmann III." srcset="
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-records_hufec868eae5d546c3fc3a150ac6d4bfc7_26264_beb7d6e5794f0517f7182fbd0b118167.webp 400w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-records_hufec868eae5d546c3fc3a150ac6d4bfc7_26264_21faa311680892c0f24d53cc790dd55a.webp 760w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-records_hufec868eae5d546c3fc3a150ac6d4bfc7_26264_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-records_hufec868eae5d546c3fc3a150ac6d4bfc7_26264_beb7d6e5794f0517f7182fbd0b118167.webp"
width="233"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit den Berufen der Mitglieder im Kabinett Kretschmann III.
&lt;/figcaption>&lt;/figure>
&lt;div class="alert alert-warning">
&lt;div>
&lt;p>Typische Anwenderfehler bei &amp;ldquo;Blank down&amp;rdquo;:&lt;/p>
&lt;ol>
&lt;li>Vergessen auf den &amp;ldquo;Zeilenmodus&amp;rdquo; (rows) umzuschalten.&lt;/li>
&lt;li>Inhalte sind &lt;strong>nicht alle&lt;/strong> vom Typ Text.&lt;/li>
&lt;/ol>
&lt;/div>
&lt;/div>
&lt;h2 id="aufgabe-2-arbeiten-mit-records">Aufgabe 2: Arbeiten mit Records&lt;/h2>
&lt;p>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.&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-den-ergebnissen-verschiedener-aktionen-mit-records">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit den Ergebnissen verschiedener Aktionen mit Records." srcset="
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-records-aktionen_huedeba85b463fbea301635a835f017a7e_50846_732f49e3743ba72f9d15da12239c4489.webp 400w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-records-aktionen_huedeba85b463fbea301635a835f017a7e_50846_a5f50e619eab91d45272f7e070f5ef04.webp 760w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-records-aktionen_huedeba85b463fbea301635a835f017a7e_50846_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-records-aktionen_huedeba85b463fbea301635a835f017a7e_50846_732f49e3743ba72f9d15da12239c4489.webp"
width="760"
height="730"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit den Ergebnissen verschiedener Aktionen mit Records.
&lt;/figcaption>&lt;/figure>
&lt;p>Um Aktionen auf Records anzuwenden, wechseln wir in den Records-Modus.&lt;/p>
&lt;h3 id="records-filtern">Records filtern&lt;/h3>
&lt;p>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
&amp;ldquo;Beruf&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Text facet&amp;rdquo;
und
&amp;ldquo;Beruf&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Textfilter&amp;rdquo;.&lt;/p>
&lt;p>In dem Textfilter suchen wir dann nach dem Begriff &amp;ldquo;Recht&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-einer-kombination-aus-textfacet-und-textfilter-auf-records-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit einer Kombination aus Textfacet und Textfilter auf Records in OpenRefine." srcset="
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-records-facets_hu29d1bf234b7b0889d4b12418c01fab50_34437_518e50079376f2c2fe2103049d800ed2.webp 400w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-records-facets_hu29d1bf234b7b0889d4b12418c01fab50_34437_9383374f2dd06062983fe0ebadd41de8.webp 760w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-records-facets_hu29d1bf234b7b0889d4b12418c01fab50_34437_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-records-facets_hu29d1bf234b7b0889d4b12418c01fab50_34437_518e50079376f2c2fe2103049d800ed2.webp"
width="598"
height="454"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit einer Kombination aus Textfacet und Textfilter auf Records in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>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.&lt;/p>
&lt;p>Das ist auch nachvollziehbar und sinnvoll.
Gleichzeitig bedeutet es, dass das Textfacet nicht auf Werte reduziert wird, die den Begriff &amp;ldquo;Recht&amp;rdquo; 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.&lt;/p>
&lt;p>Daher ist gerade beim Filtern mit Records im Hinterkopf zu behalten,
dass manchmal zwischen dem Zeilen- und Record-Modus hin- und hergewechselt werden sollte.&lt;/p>
&lt;h3 id="records-durchnummerieren">Records durchnummerieren&lt;/h3>
&lt;p>Wir erstellen eine neue Spalte &amp;ldquo;Record ID&amp;rdquo; via
&amp;ldquo;Beruf&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">index&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anschließend verwenden wir
&amp;ldquo;Record ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Blank down&amp;rdquo;
um die überzähligen IDs zu entfernen.&lt;/p>
&lt;h3 id="elemente-in-records-durchnummerieren">Elemente in Records durchnummerieren&lt;/h3>
&lt;p>Wir erstellen eine neue Spalte &amp;ldquo;Record Element ID&amp;rdquo; via
&amp;ldquo;Record ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="mi">1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">index&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">fromRowIndex&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="elemente-in-records-zählen">Elemente in Records zählen&lt;/h3>
&lt;p>Wir erstellen eine neue Spalte &amp;ldquo;Record Count&amp;rdquo; via
&amp;ldquo;Record Element ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="o">==&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">rowCount&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">null&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Hier sparen wir uns das anschließende &amp;ldquo;Blank down&amp;rdquo;, da wir über eine &lt;code>if&lt;/code>-Anweisung die Anzahl nur in Zeilen mit der Record Element ID 1 geschrieben haben.&lt;/p>
&lt;h3 id="elemente-sortierendoppelungen-entfernen">Elemente Sortieren/Doppelungen entfernen&lt;/h3>
&lt;p>Wir transformieren die Spalte &amp;ldquo;Beruf&amp;rdquo; via
&amp;ldquo;Beruf&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
und verwenden einen der folgenden GREL Ausdrücke.&lt;/p>
&lt;p>Doppelungen entfernen:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Beruf&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">uniques&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;, &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Nur sortieren:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Beruf&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">sort&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;, &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Doppelungen entfernen &lt;strong>und&lt;/strong> sortieren:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Beruf&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">uniques&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">sort&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;, &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-note">
&lt;div>
Diese Operation schreibt die Werte alle in eine Zeile.&lt;br>
Wie wir daraus wieder Records bekommen, ist in &amp;ldquo;04 Records aus Feldern mit mehreren Werten erstellen&amp;rdquo; beschrieben.
&lt;/div>
&lt;/div>
&lt;h2 id="aufgabe-3-records-in-felder-mit-mehreren-werten-auflösen">Aufgabe 3: Records in Felder mit mehreren Werten auflösen&lt;/h2>
&lt;p>Da nicht alle Zielprogramme mit einer Record-Struktur klarkommen, müssen diese manchmal auch wieder umgewandelt werden.
Eine Möglichkeit sind so genannte &amp;ldquo;Multi-Value-Fields&amp;rdquo;, oder Felder mit mehreren Werten.
In unserem Beispiel könnte das eine mit Komma separierte Liste aller Berufe sein.&lt;/p>
&lt;p>Dafür verwenden wir
&amp;ldquo;Beruf&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Join multi-valued cells&amp;hellip;&amp;rdquo;
und wählen als Trennzeichen eine Zeichenfolge aus Komma und Leerzeichen &lt;code>,&lt;/code>.
Das Ergebnis der Operation ist in Abbildung 7 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-der-spalte-beruf-als-multi-value-fields">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit der Spalte Beruf als Multi-Value-Fields." srcset="
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-multi-value-fields_hub349a037994164c7a6759b08e55fec5e_21176_311ec0780ea01d61bec198075797ed39.webp 400w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-multi-value-fields_hub349a037994164c7a6759b08e55fec5e_21176_0621a5e72599825dc53136f9b4448c4e.webp 760w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-multi-value-fields_hub349a037994164c7a6759b08e55fec5e_21176_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-multi-value-fields_hub349a037994164c7a6759b08e55fec5e_21176_311ec0780ea01d61bec198075797ed39.webp"
width="505"
height="302"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit der Spalte Beruf als Multi-Value-Fields.
&lt;/figcaption>&lt;/figure>
&lt;p>Möchte man die Werte in mehrere Spalten aufteilen, so kann dafür
&amp;ldquo;Beruf&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split into several columns&amp;hellip;&amp;rdquo;
verwendet werden.
Das Ergebnis der Operation ist in Abbildung 8 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-der-spalte-beruf-auf-mehrere-spalten-aufgeteilt">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit der Spalte Beruf auf mehrere Spalten aufgeteilt." srcset="
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-multi-column_hu2cd50adb3b151bd3af03c697e87ed62b_23008_3b89c32a66d6baf1899e8cb27032ae1f.webp 400w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-multi-column_hu2cd50adb3b151bd3af03c697e87ed62b_23008_eeac2c7fc1a74188b8feb9156034a659.webp 760w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-multi-column_hu2cd50adb3b151bd3af03c697e87ed62b_23008_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-berufe-multi-column_hu2cd50adb3b151bd3af03c697e87ed62b_23008_3b89c32a66d6baf1899e8cb27032ae1f.webp"
width="755"
height="305"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit der Spalte Beruf auf mehrere Spalten aufgeteilt.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-4-records-aus-feldern-mit-mehreren-werten-erstellen">Aufgabe 4: Records aus Feldern mit mehreren Werten erstellen&lt;/h2>
&lt;p>Im FDMLab kommt es öfter vor, dass wir Datensätze mit &amp;ldquo;Multi-Value-Fields&amp;rdquo;, wie in Abbildung 7,
oder die Daten aufgeteilt auf mehrere Spalten, wie in Abbildung 8 bekommen.&lt;/p>
&lt;p>Diese wandeln wir dann in Records um, um zum Beispiel die Schreibweise via Clustering zu vereinheitlichen,
oder ein gemeinsames Reconciling der Daten durchzuführen.&lt;/p>
&lt;p>Dafür machen wir die in &amp;ldquo;03 Records in Felder mit mehreren Werten auflösen&amp;rdquo; durchgeführten Änderungen wieder rückgängig,
ohne die History-Funktion zu verwenden.&lt;/p>
&lt;p>Zuerst fügen wir die Spalten wieder via
&amp;ldquo;Beruf 1&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Join columns&amp;hellip;&amp;rdquo;
zusammen. Die Einstellungen sind in Abbildung 9 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-openrefine-dialogs-zum-zusammenführen-von-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des OpenRefine Dialogs zum Zusammenführen von Spalten." srcset="
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-dialog-join-columns_huefe8a1f65433b4900638336334d296d4_26182_abf817685605f2cf5fb440f987dfa64a.webp 400w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-dialog-join-columns_huefe8a1f65433b4900638336334d296d4_26182_fcb9e59bdb744a58119d449df697688f.webp 760w,
/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-dialog-join-columns_huefe8a1f65433b4900638336334d296d4_26182_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/screenshot-openrefine-dialog-join-columns_huefe8a1f65433b4900638336334d296d4_26182_abf817685605f2cf5fb440f987dfa64a.webp"
width="760"
height="438"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des OpenRefine Dialogs zum Zusammenführen von Spalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Anschließend erstellen wir die Record-Struktur via
&amp;ldquo;Beruf&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split multi-valued cells&amp;hellip;&amp;rdquo;
und wählen als Trennzeichen die gleiche Trennsequenz, wie beim Zusammenfügen der Spalten in Abbildung 9.
In unserem Fall also &lt;code>,&lt;/code>.&lt;/p>
&lt;p>Wir sind nun wieder bei der Record-Struktur wie in Abbildung 4 angekommen.&lt;/p>
&lt;h2 id="aufgabe-5-records-in-wiederholende-zeilen-auflösen">Aufgabe 5: Records in wiederholende Zeilen auflösen&lt;/h2>
&lt;p>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.&lt;/p>
&lt;p>Wir gehen davon aus, dass wir eine Record-Struktur wie in Abbildung 4 haben.
Dort nutzen wir dann das Gegenstück zu &amp;ldquo;Blank down&amp;rdquo; via
&amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Fill down&amp;rdquo;
.&lt;/p>
&lt;p>Um zum &amp;ldquo;Original&amp;rdquo; in Abbildung 2 zu kommen, müssten wir die Spalte &amp;ldquo;Beruf&amp;rdquo; noch alphabetisch sortieren und ganz nach links verschieben.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Mit Records lassen sich interessante Datentransformationen bewerkstelligen.
Bei der &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/">Aufbereitung von Findbüchern mit OpenRefine&lt;/a> haben wir damit zum Beispiel die Inhalte von zweispaltigen Seitenlayouts in einzelne Zeilen umgewandelt.&lt;/p>
&lt;p>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.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil behandeln wir das Konzept des Transponierens mit dem wir in OpenRefine ähnliche Probleme behandeln können.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren" class="btn btn-primary px-3 py-3">11 Transponieren&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Arbeiten mit regulären Ausdrücken</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/</guid><description>&lt;p>Ein wichtiges Werkzeug beim Arbeiten mit Daten sind reguläre Ausdrücke.
Diese werden in OpenRefine von verschiedenen Funktionen unterstützt.&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>Reguläre Ausdrücke in der &lt;a href="https://docs.openrefine.org/manual/expressions#regular-expressions" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;p>Mit regulären Ausdrücken können wir Muster definieren, mit denen wir bestimmte Zeichenfolgen in einem Text finden, extrahieren und/oder ersetzen können. Dies funktioniert nicht nur in Programmiersprachen wie Python oder Programmen wie OpenRefine, sondern auch in frei verfügbaren Text Editoren wie &lt;a href="https://notepad-plus-plus.org/" target="_blank" rel="noopener">Notepad++&lt;/a> oder &lt;a href="https://code.visualstudio.com/" target="_blank" rel="noopener">Visual Studio Code&lt;/a>.&lt;/p>
&lt;figure id="figure-perl-problemshttpsxkcdcom1171-von-randall-munroe-unter-cc-by-nc-lizenzhttpcreativecommonsorglicensesby-nc25">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="[Perl Problems](https://xkcd.com/1171/) von Randall Munroe unter [CC BY-NC Lizenz](http://creativecommons.org/licenses/by-nc/2.5/)." srcset="
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/perl_problems_hu0e0484462f33f916343aead87d9b7933_20532_8fdf08fae82e8346817146df2a00337b.webp 400w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/perl_problems_hu0e0484462f33f916343aead87d9b7933_20532_df861a877b6fd6a5993e9f6618d9596b.webp 760w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/perl_problems_hu0e0484462f33f916343aead87d9b7933_20532_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/perl_problems_hu0e0484462f33f916343aead87d9b7933_20532_8fdf08fae82e8346817146df2a00337b.webp"
width="548"
height="205"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
&lt;a href="https://xkcd.com/1171/" target="_blank" rel="noopener">Perl Problems&lt;/a> von Randall Munroe unter &lt;a href="http://creativecommons.org/licenses/by-nc/2.5/" target="_blank" rel="noopener">CC BY-NC Lizenz&lt;/a>.
&lt;/figcaption>&lt;/figure>
&lt;p>Bei Memes zu &lt;a href="https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck" target="_blank" rel="noopener">regulären Ausdrücken&lt;/a> wird wie in Abbildung 1 häufig der Eindruck erweckt, dass sie mehr Probleme erzeugen als sie tatsächlich lösen. Richtig dosiert sind sie jedoch ein hilfreiches Werkzeug bei der Datenextraktion.&lt;/p>
&lt;p>Das Vorgehen beim Entwickeln von regulären Ausdrücken unterscheidet sich von Person zu Person.
Wir zeigen hier unser bevorzugtes Vorgehen, von dem gerne abgewichen werden darf.&lt;/p>
&lt;p>Zum Entwickeln, Testen und Verstehen von regulären Ausdrücken, nutzen wir &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a> (Alternative: &lt;a href="https://regexr.com/" target="_blank" rel="noopener">RegExr&lt;/a>).
Hier bekommen wir wie in Abbildung 2 visuelles Feedback, auf welche Textzeilen unsere regulären Ausdrücke passen und was die einzelnen Bestandteile bedeuten.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-regex101httpsregex101com-mit-art-ecmascript-einem-regulären-ausdruck-zur-extraktion-von-datumsangaben-in-der-mitte-oben-mehreren-beispielen-direkt-darunter-und-hilfreichen-informationen-auf-der-rechten-seite">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von [RegEx101](https://regex101.com/) mit Art *ECMAScript*, einem regulären Ausdruck zur Extraktion von **Datumsangaben** in der Mitte oben, mehreren Beispielen direkt darunter und hilfreichen Informationen auf der rechten Seite." srcset="
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101_hu4d42a9ea634230dd2891861f8c3240d1_195054_d53b9bb6a485b284a574d997193da119.webp 400w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101_hu4d42a9ea634230dd2891861f8c3240d1_195054_4de000c996966a66f861355dd8859f87.webp 760w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101_hu4d42a9ea634230dd2891861f8c3240d1_195054_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101_hu4d42a9ea634230dd2891861f8c3240d1_195054_d53b9bb6a485b284a574d997193da119.webp"
width="760"
height="511"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a> mit Art &lt;em>ECMAScript&lt;/em>, einem regulären Ausdruck zur Extraktion von &lt;strong>Datumsangaben&lt;/strong> in der Mitte oben, mehreren Beispielen direkt darunter und hilfreichen Informationen auf der rechten Seite.
&lt;/figcaption>&lt;/figure>
&lt;p>Die Verwendung eines visuell unterstützenden Werkzeuges wie RegEx101 hat den Vorteil, dass wir einen übersichtlichen regulären Ausdruck entwickeln können, den wir dann in unsere Ursprungsanwendung, wie zum Beispiel OpenRefine, übertragen können. Ein Nachteil ist, dass zum Beispiel in OpenRefine nicht alle Features von regulären Ausdrücken unterstützt werden und der reguläre Ausdruck nachträglich ggf. angepasst werden muss.&lt;/p>
&lt;h2 id="vorbereitung">Vorbereitung&lt;/h2>
&lt;p>Wir erstellen uns eine kleine Sammlung von Beispielen für Daten, die wir mit einem regulären Ausdruck bearbeiten wollen.
Dazu ergänzen wir einige Negativbeispiele, also Beispiele, die von unserem regulären Ausdruck nicht extrahiert werden sollten.&lt;/p>
&lt;p>Die Beispiele für dieses Tutorial sind im Folgenden gelistet und wir kopieren sie in das Testfenster von &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">2021-11-25 Einsteigerworkshop 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2021-12-08 Einsteigerworkshop 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2022-04-07 Einsteigerworkshop 3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2022-04-13 Einsteigerworkshop 4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2022-05-03 Fortgeschrittenenworkshop
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1970-01-01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2005-1-1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- - - - - - - - - - - - - - - - - - -
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Do not match!
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1234-56-78
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2022-13-01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2022-01-32
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">12-34-56
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">abcd-ef-gh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-note">
&lt;div>
Wir werden bei den folgenden Aufgaben teilweise keine &amp;ldquo;perfekten&amp;rdquo; regulären Ausdrücke entwickeln,
also teilweise Treffer in der Liste der Negativbeispiele haben!
&lt;/div>
&lt;/div>
&lt;p>Reguläre Ausdrücke werden von verschiedenen Programmiersprachen und Werkzeugen unterstützt.
Dabei unterscheidet sich die Art, wie reguläre Ausdrücke als solche markiert werden.
Außerdem werden je nach Programmiersprache, Version der Programmiersprache oder Werkzeug nicht alle Features von regulären Ausdrücken unterstützt.&lt;/p>
&lt;p>In RegEx101 können wir daher ein so genanntes &lt;em>Flavor&lt;/em> für die Eingabe der regulären Ausdrücke auswählen.
Wir verwenden für unser Tutorial &amp;ldquo;ECMAScript (JavaScript)&amp;rdquo;.
Das hat den Hintergrund, dass sich GREL an der Syntax für JavaScript orientiert, auch wenn es im Hintergrund Java zur Auswertung verwendet. Reguläre Ausdrücke werden hier durch zwei Schrägstriche &lt;code>/.../&lt;/code> markiert.&lt;/p>
&lt;p>Hinter dem regulären Ausdruck gibt es optional noch Optionen.
Wir verwenden für RegEx101 die Optionen &lt;code>g&lt;/code> und &lt;code>m&lt;/code>.
Das sind die Standardoptionen, die bewirken, dass ein regulärer Ausdruck auf den kompletten Text (&lt;code>g&lt;/code> für &lt;em>global&lt;/em>) und auch Zeilen übergreifend (&lt;code>m&lt;/code> für &lt;em>multiline&lt;/em>) angewendet werden kann.&lt;/p>
&lt;p>Wir haben sie in den Beispielen explizit gesetzt, damit sie beim Kopieren und Einfügen von regulären Ausdrücken hier aus dem Tutorial nicht ungewollt deaktiviert werden. In OpenRefine benötigen wir diese Optionen für unser Tutorial nicht.&lt;/p>
&lt;h2 id="aufgabe-1-zeichenauswahl-character-classes">Aufgabe 1: Zeichenauswahl (Character Classes)&lt;/h2>
&lt;p>Wir wollen die Datumsangaben extrahieren. Diese haben das Muster &lt;code>Jahreszahl-Monat-Tag&lt;/code> bzw. &lt;code>ZahlZahlZahlZahl-ZahlZahl-ZahlZahl&lt;/code>.
Ein erster Ansatz ist es, dies direkt zu formulieren.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)-(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)-(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Mit dem Pipe-Symbol &lt;code>|&lt;/code> können wir in regulären Ausdrücken Alternativen formulieren. Also zum Beispiel &lt;code>0|1&lt;/code>.
Mit den runden Klammern &lt;code>(&lt;/code> und &lt;code>)&lt;/code> können wir die Alternativen gruppieren.&lt;/p>
&lt;p>Dies ist etwas umständlich und unleserlich. Daher gibt es in regulären Ausdrücken auch ein Muster zur Zeichenauswahl, welches die eckigen Klammern &lt;code>[&lt;/code> und &lt;code>]&lt;/code> verwendet. Mit den &lt;em>Character Classes&lt;/em> lässt sich der obige Ausdruck vereinfachen zu:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die Zeichenauswahl lässt sich kombinieren und limitieren.
So lassen sich Zahlen im &lt;a href="https://de.wikipedia.org/wiki/Hexadezimalsystem" target="_blank" rel="noopener">Hexadezimalsystem&lt;/a> identifizieren mit &lt;code>[0-9A-F]&lt;/code>.&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Passen Sie den obigen regulären Ausdruck so an, dass das erste Zeichen der Jahreszahl des Datums nur eine 1 oder 2 sein darf.&lt;/p>
&lt;details class="spoiler " id="spoiler-4">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/[1-2][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/gm&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(1|2)[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-2-zeichenklassen-shape-matching">Aufgabe 2: Zeichenklassen (Shape Matching)&lt;/h2>
&lt;p>Alternativ zu der recht flexiblen Zeichenauswahl gibt es vordefinierte Zeichenklassen, die es einfacher machen, die Form des Musters zu beschreiben.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Klasse&lt;/th>
&lt;th>Steht für&lt;/th>
&lt;th>Zeichenauswahl&lt;/th>
&lt;th>Beschreibung&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>\d&lt;/code>&lt;/td>
&lt;td>&lt;em>digit&lt;/em>&lt;/td>
&lt;td>&lt;code>[0-9]&lt;/code>&lt;/td>
&lt;td>Beliebige Zahl&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>\w&lt;/code>&lt;/td>
&lt;td>&lt;em>word&lt;/em>&lt;/td>
&lt;td>&lt;code>[a-zA-Z0-9_]&lt;/code>&lt;/td>
&lt;td>Buchstaben in Groß- oder Kleinschreibung, Zahlen und Unterstrich.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>\s&lt;/code>&lt;/td>
&lt;td>&lt;em>space&lt;/em>&lt;/td>
&lt;td>&lt;/td>
&lt;td>Leerraum: Leerzeichen, Tabulator, &amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>\b&lt;/code>&lt;/td>
&lt;td>&lt;em>boundary&lt;/em>&lt;/td>
&lt;td>&lt;/td>
&lt;td>Wortgrenze, erfasst kein separates Zeichen.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Mit der Klasse &lt;code>\d&lt;/code> für Zahlen sieht der reguläre Ausdruck aus Aufgabe 1 wie folgt aus:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\d\d\d\d-\d\d-\d\d/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Aufgabe:&lt;/strong> Passen Sie den obigen regulären Ausdruck so an, dass er (nur) auf das Datumsformat &lt;code>2005-1-1&lt;/code> passt.&lt;/p>
&lt;details class="spoiler " id="spoiler-5">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\d\d\d\d-\d-\d/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-3-verneinungen">Aufgabe 3: Verneinungen&lt;/h2>
&lt;p>Die Zeichenauswahl oder Zeichenklasse lässt sich auch negieren.
Bei der Zeichenauswahl funktioniert das mit dem Sonderzeichen &lt;code>^&lt;/code>, bei den Zeichenklassen durch Großschreibung.&lt;/p>
&lt;ul>
&lt;li>Negierte Zeichenauswahl für Zahlen: &lt;code>[^0-9]&lt;/code>&lt;/li>
&lt;li>Negierte Zeichenklasse für Zahlen: &lt;code>\D&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Negieren Sie die regulären Ausdrücke für das Datum aus Aufgabe 1 und Aufgabe 2.&lt;/p>
&lt;details class="spoiler " id="spoiler-6">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/[^0-9][^0-9][^0-9][^0-9]-[^0-9][^0-9]-[^0-9][^0-9]/gm&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\D\D\D\D-\D\D-\D\D/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-4-quantoren-quantifiers">Aufgabe 4: Quantoren (Quantifiers)&lt;/h2>
&lt;p>Anstatt Zeichen, Zeichenauswahl oder Zeichenklassen wiederholt zu schreiben, lassen sich Wiederholungen auch durch Quantoren definieren.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Quantor&lt;/th>
&lt;th style="text-align:center">Alternative&lt;/th>
&lt;th>Beschreibung&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>{2,}&lt;/code>&lt;/td>
&lt;td style="text-align:center">&lt;/td>
&lt;td>Mindestens zweimal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>{1,2}&lt;/code>&lt;/td>
&lt;td style="text-align:center">&lt;/td>
&lt;td>Mindest einmal, höchstens zweimal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>?&lt;/code>&lt;/td>
&lt;td style="text-align:center">&lt;code>{0,1}&lt;/code>&lt;/td>
&lt;td>Kann vorkommen&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>+&lt;/code>&lt;/td>
&lt;td style="text-align:center">&lt;code>{1,}&lt;/code>&lt;/td>
&lt;td>Kann sich wiederholen&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>*&lt;/code>&lt;/td>
&lt;td style="text-align:center">&lt;code>{0,}&lt;/code>&lt;/td>
&lt;td>Kann vorkommen und sich wiederholen&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Ein möglicher regulärer Ausdruck für unsere Daten wäre also:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\d{4}-\d\d?-\d\d?/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Aufgabe:&lt;/strong> Schreiben Sie den obigen regulären Ausdruck so um, dass er den &lt;code>?&lt;/code> Quantor nicht mehr verwendet.&lt;/p>
&lt;details class="spoiler " id="spoiler-7">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\d{4}-\d{1,2}-\d{1,2}/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-5-gruppierungen-group-constructs">Aufgabe 5: Gruppierungen (Group Constructs)&lt;/h2>
&lt;p>Mit den runden Klammern &lt;code>(&lt;/code> und &lt;code>)&lt;/code> lassen sich Gruppen in regulären Ausdrücken definieren.
Das ist nicht nur hilfreich, wenn man mit dem Pipe Symbol &lt;code>|&lt;/code> Alternativen definieren möchte, sondern auch um einzelne Bestandteile zu markieren.&lt;/p>
&lt;p>Setzen wir die einzelnen Bestandteile des regulären Ausdrucks in runde Klammern, dann zeigt uns RegEx101 wie in Abbildung 3 in Gruppe 1 die Jahreszahl, in Gruppe 2 den Monat und in Gruppe 3 den Tag. Auch bei der Verwendung von regulären Ausdrücken in OpenRefine können wir auf die einzelnen Gruppen zugreifen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(\d{4})-(\d{1,2})-(\d{1,2})/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-bildschirmfoto-von-regex101httpsregex101com-mit-den-extrahierten-gruppen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von [RegEx101](https://regex101.com/) mit den extrahierten Gruppen." srcset="
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-matches_hu6ff4b2b90356336f98034e3c0e3c37b7_8361_2c21c28cf9419ae2c6352f91bdc4e7e7.webp 400w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-matches_hu6ff4b2b90356336f98034e3c0e3c37b7_8361_3cf30331722d19be6be1321dd2d0f58a.webp 760w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-matches_hu6ff4b2b90356336f98034e3c0e3c37b7_8361_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-matches_hu6ff4b2b90356336f98034e3c0e3c37b7_8361_2c21c28cf9419ae2c6352f91bdc4e7e7.webp"
width="240"
height="189"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a> mit den extrahierten Gruppen.
&lt;/figcaption>&lt;/figure>
&lt;p>Die einzelnen Gruppen können auch benannt werden um dann wie in Abbildung 4 über den Gruppennamen aufgerufen werden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(?&amp;lt;Jahr&amp;gt;\d{4})-(?&amp;lt;Monat&amp;gt;\d{1,2})-(?&amp;lt;Tag&amp;gt;\d{1,2})/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-bildschirmfoto-von-regex101httpsregex101com-mit-den-benannten-gruppen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von [RegEx101](https://regex101.com/) mit den benannten Gruppen." srcset="
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-named-matches_hu9071d89d65be8ab24c22d906808b7586_9563_bf933ef1ff2b0482a722865acf01410b.webp 400w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-named-matches_hu9071d89d65be8ab24c22d906808b7586_9563_d34fac50809a666d3163e0cc294e2a2b.webp 760w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-named-matches_hu9071d89d65be8ab24c22d906808b7586_9563_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-named-matches_hu9071d89d65be8ab24c22d906808b7586_9563_bf933ef1ff2b0482a722865acf01410b.webp"
width="276"
height="197"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a> mit den benannten Gruppen.
&lt;/figcaption>&lt;/figure>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Erstellen Sie einen regulären Ausdruck mit den zwei benannten Gruppen &lt;code>Datum&lt;/code> und &lt;code>Event&lt;/code>. Das erwartete Ergebnis ist in Abbildung 5 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-regex101httpsregex101com-mit-den-erwarteten-ergebnissen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von [RegEx101](https://regex101.com/) mit den erwarteten Ergebnissen." srcset="
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-expected-matches_hu5ce7f208bf5f90ace184f0d78ee94637_77476_ba0297e2927abc5a486f48e6310a0796.webp 400w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-expected-matches_hu5ce7f208bf5f90ace184f0d78ee94637_77476_acc9bc2d3037731d62c49990d0a1e14d.webp 760w,
/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-expected-matches_hu5ce7f208bf5f90ace184f0d78ee94637_77476_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/regex101-expected-matches_hu5ce7f208bf5f90ace184f0d78ee94637_77476_ba0297e2927abc5a486f48e6310a0796.webp"
width="554"
height="667"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a> mit den erwarteten Ergebnissen.
&lt;/figcaption>&lt;/figure>
&lt;details class="spoiler " id="spoiler-11">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(?&amp;lt;Datum&amp;gt;\d{4}-\d{1,2}-\d{1,2}) (?&amp;lt;Event&amp;gt;[a-zA-Z0-9 ]+)/gm&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(?&amp;lt;Datum&amp;gt;\d{4}-\d{1,2}-\d{1,2}) (?&amp;lt;Event&amp;gt;.+)/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;div class="alert alert-note">
&lt;div>
&lt;p>In OpenRefine 3.5, 3.6 und 3.7 werden benannte Gruppierungen nicht überall unterstützt.
Beispielsweise wird bei &lt;a href="https://docs.openrefine.org/manual/grelfunctions#finds-sub-or-p" target="_blank" rel="noopener">find()&lt;/a> immer nur der vollständige Treffer zurückgegeben und bei &lt;a href="https://docs.openrefine.org/manual/grelfunctions#matchs-p" target="_blank" rel="noopener">match()&lt;/a> die Gruppen ausschließlich durchnummeriert. Lediglich bei &lt;a href="https://docs.openrefine.org/manual/grelfunctions#replaces-s-or-p-find-s-replace" target="_blank" rel="noopener">replace()&lt;/a> lässt sich auf die benannten Gruppen zugreifen.&lt;/p>
&lt;p>Der folgende GREL Ausdruck nutzt benannte Gruppen um mit &lt;code>replace()&lt;/code> die Reihenfolge des Datums umzudrehen:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/(?&amp;lt;Jahr&amp;gt;\d{4})-(?&amp;lt;Monat&amp;gt;\d{1,2})-(?&amp;lt;Tag&amp;gt;\d{1,2})/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;${Tag}-${Monat}-${Jahr}&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;/div>
&lt;h2 id="aufgabe-6-look-around-look-aheadlook-behind">Aufgabe 6: Look-around (Look-ahead/Look-behind)&lt;/h2>
&lt;p>Manchmal möchte man die Daten weiter einschränken.&lt;/p>
&lt;p>Hier ein einfaches Beispiel um nur Daten aus dem Jahr &lt;code>2022&lt;/code> zu extrahieren:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/2022-\d{1,2}-\d{1,2}/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Aufwendiger wird es, wenn ein Datum nur extrahiert werden soll, wenn ein bestimmter Begriff dahinter steht.
Dies funktioniert mit so genannten &lt;em>Look-around&lt;/em> Anweisungen.
Man kann via &lt;em>positive Look-ahead&lt;/em> &lt;code>(?=...)&lt;/code> definieren, dass ein Begriff &lt;strong>nach&lt;/strong> einem Muster vorkommen soll und
via &lt;em>positive Look-behind&lt;/em> &lt;code>(?&amp;lt;=...)&lt;/code> kann definiert werden, dass ein Begriff &lt;strong>vor&lt;/strong> einem Muster vorkommen soll.&lt;/p>
&lt;p>So findet der folgende reguläre Ausdruck alle Daten unserer Einsteigerworkshops, ohne den Begriff &amp;ldquo;Einsteigerworkshop&amp;rdquo; mit in das Ergebnis aufzunehmen:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\d{4}-\d{1,2}-\d{1,2}(?= Einsteigerworkshop)/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die &lt;em>Look-around&lt;/em> Anweisungen lassen sich auch verneinen, indem man das Gleichheitszeichen &lt;code>=&lt;/code> durch ein Ausrufezeichen &lt;code>!&lt;/code> austauscht.
So findet der folgende reguläre Ausdruck mit einem &lt;em>negative Look-ahead&lt;/em> &lt;code>(?!...)&lt;/code> alle Daten von &lt;strong>nicht&lt;/strong> Einsteigerworkshops:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\d{4}-\d{1,2}-\d{1,2} (?!Einsteigerworkshop)/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Aufgabe:&lt;/strong> Extrahieren Sie die Titel aller drei Workshops im Jahr 2022. Nutzen Sie dazu eine &lt;em>positive Look-behind&lt;/em> Anweisung &lt;code>(?&amp;lt;=...)&lt;/code>.&lt;/p>
&lt;details class="spoiler " id="spoiler-13">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Quantoren wie &lt;code>+&lt;/code>, &lt;code>*&lt;/code>, &lt;code>?&lt;/code>, &lt;code>{1,9}&lt;/code> werden in &lt;em>Look-around&lt;/em> Gruppen &lt;strong>nicht überall&lt;/strong> unterstützt! Das kommt auf die benutzte Programmiersprache, deren Version und/oder verwendeten Zusatzbibliotheken an. Daher im Zweifel erst einmal testen!&lt;/li>
&lt;li>&lt;em>Look-around&lt;/em> Anweisungen verlangsamen die Auswertung eines regulären Ausdrucks deutlich und sollten daher mit Bedacht eingesetzt werden.&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;details class="spoiler " id="spoiler-14">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(?&amp;lt;=2022-\d\d-\d\d )(?&amp;lt;Titel&amp;gt;[a-zA-Z0-9 ]+)/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-7-datums-einschränkungen">Aufgabe 7: Datums Einschränkungen&lt;/h2>
&lt;p>Mit einer Kombination von Alternativen, Gruppierungen, Zeichenauswahl und Quantoren lässt sich auch ein regulärer Ausdruck entwickeln, der ausschließlich valide Datumsangaben zwischen 1900 und 2029 extrahiert.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/(?&amp;lt;Jahr&amp;gt;19\d\d|20[0-2]\d)-(?&amp;lt;Monat&amp;gt;0?\d|1[0-2])-(?&amp;lt;Tag&amp;gt;[0-2]?\d|3[0-1])(?=\s)/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Auch wenn er fachlich und technisch richtig ist, welche Probleme treten bei diesem regulären Ausdruck eventuell auf?&lt;/p>
&lt;details class="spoiler " id="spoiler-15">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Der reguläre Ausdruck ist sehr komplex und schwer zu verstehen.&lt;/li>
&lt;li>Überflüssig da es ggf. gar keine invaliden Datumsangaben gibt?&lt;/li>
&lt;li>Ggf. möchte man falsch geschriebene Daten explizit mit in die Ergebnisse aufnehmen und nachkorrigieren?&lt;/li>
&lt;li>Ggf. Datumsangaben vor 1900 oder nach 2029 übersehen?&lt;/li>
&lt;li>Unterscheidet nicht zwischen Monaten mit 28/30 und 31 Tagen.&lt;/li>
&lt;li>&amp;hellip;&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-8-spezielle-zeichen">Aufgabe 8: Spezielle Zeichen&lt;/h2>
&lt;p>Es gibt eine Liste mit speziellen Zeichen, die bei Vorkommen in einem regulären Ausdruck mit einem Backslash &lt;code>\&lt;/code> &lt;em>escaped&lt;/em> werden müssen um sie zu deaktivieren.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Zeichen&lt;/th>
&lt;th>Bedeutung&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>.&lt;/code>&lt;/td>
&lt;td>Wildcard, beliebiges Zeichen&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>^&lt;/code>&lt;/td>
&lt;td>Zeilenbeginn oder Verneinung&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>$&lt;/code>&lt;/td>
&lt;td>Zeilenende&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>\&lt;/code>&lt;/td>
&lt;td>Escapezeichen&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>+&lt;/code>&lt;/td>
&lt;td>Quantor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>*&lt;/code>&lt;/td>
&lt;td>Quantor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>?&lt;/code>&lt;/td>
&lt;td>Quantor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>{&lt;/code>, &lt;code>}&lt;/code>&lt;/td>
&lt;td>Quantor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>(&lt;/code>, &lt;code>)&lt;/code>&lt;/td>
&lt;td>Gruppe&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>[&lt;/code>, &lt;code>]&lt;/code>&lt;/td>
&lt;td>Zeichenklasse&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Der folgende reguläre Ausdruck passt zum Beispiel auf Zeilen, in denen nur ein Datum steht.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/^\d{4}-\d{1,2}-\d{1,2}$/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Aufgabe:&lt;/strong> Schreiben Sie einen regulären Ausdruck, der in dem folgenden Text ausschließlich Dezimalzahlen in englischer Schreibweise mit Punkt &lt;code>.&lt;/code> als Trennzeichen extrahiert.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">Der Literpreis für Diesel ist erstmals über 2.00 Euro gestiegen.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Siehe auch Code AFE2A00F.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;details class="spoiler " id="spoiler-16">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="sr">/\d+\.\d+/gm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-9-reguläre-ausdrücke-in-openrefine">Aufgabe 9: Reguläre Ausdrücke in OpenRefine&lt;/h2>
&lt;p>In OpenRefine kann anstelle von Text auch häufig ein regulärer Ausdruck verwendet werden.
Zum Beispiel beim Suchen via Textfilter, dem Aufteilen von Spalten oder dem &lt;em>Replace&lt;/em>-Dialog.
Eine &lt;a href="https://docs.openrefine.org/manual/expressions#grel-supported-regex" target="_blank" rel="noopener">Liste der GREL Funktionen mit Unterstützung von regulären Ausdrücken&lt;/a> gibt es in der OpenRefine Dokumentation.&lt;/p>
&lt;p>Für diese Aufgabe wechseln wir zu OpenRefine und laden die Datei &lt;code>08_kurzbiographien.csv&lt;/code> in das Projekt &amp;ldquo;Kurzbiographien&amp;rdquo;.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/08_kurzbiographien.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kurzbiographien als CSV&lt;/a>
&lt;blockquote>
&lt;p>Die Datei &lt;code>08_kurzbiographien.csv&lt;/code> verwendet Texte von verschiedenen und in der Datei referenzierten Wikipedia Artikeln, die unter einer &lt;a href="http://creativecommons.org/licenses/by-sa/3.0/" target="_blank" rel="noopener">CC BY-SA 3.0 Lizenz&lt;/a> veröffentlicht wurden.
Die Datei &lt;code>08_kurzbiographien.csv&lt;/code> ist entsprechend ebenfalls lizenziert unter einer &lt;a href="http://creativecommons.org/licenses/by-sa/3.0/" target="_blank" rel="noopener">CC BY-SA 3.0 Lizenz&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;p>Die Datei enthält aus Wikipedia gesammelte Kurzbiographien einiger Autoren einer bestimmten Literaturströmung.&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Wir wollen aus den Kurzbiographien mit Hilfe von regulären Ausdrücken vier neue Spalten erstellen:
Geburtsdatum, Geburtsort, Sterbedatum und Sterbeort.&lt;/p>
&lt;blockquote>
&lt;p>Bonusfrage: zu welcher Literaturströmung gehören die Autoren?&lt;/p>
&lt;/blockquote>
&lt;details class="spoiler " id="spoiler-18">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Um mit einem regulären Ausdruck nur einen Teil der Daten aus einer Spalte in eine neue zu überführen bietet sich der &amp;ldquo;Add column based on this column&amp;hellip;&amp;rdquo; Dialog und die GREL Funktion &lt;a href="https://docs.openrefine.org/manual/grelfunctions#finds-sub-or-p" target="_blank" rel="noopener">find()&lt;/a> an.&lt;/li>
&lt;li>Der GREL Ausdruck &lt;code>value.find(/\d{4}/)[0]&lt;/code> findet beispielsweise alle Jahreszahlen in Form einer Liste (technisch Array) zurück und wir extrahieren mit &lt;code>[0]&lt;/code> das erste Element.&lt;/li>
&lt;li>Reguläre Ausdrücke werden in OpenRefine Funktionen mit &lt;code>/.../&lt;/code> eingefasst.&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;details class="spoiler " id="spoiler-19">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;p>F&lt;/p>
&lt;p>Es gibt unterschiedliche Lösungswege, hier ist eine recht einfache Variante aufgezeigt.
Hierbei verzichten wir auf komplexe reguläre Ausdrücke und formulieren verständliche Einzelschritte.&lt;/p>
&lt;ol>
&lt;li>Neue Spalte &amp;ldquo;Geburtsdatum&amp;rdquo; erstellen via &amp;ldquo;Kurzbiographie&amp;rdquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;ldquo;Edit column&amp;rdquo;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;ldquo;Add column based on this column&amp;hellip;&amp;rdquo; und dem GREL Ausdruck &lt;code>value.find(/\*[^;]+/)[0]&lt;/code>.&lt;/li>
&lt;li>Wiederhole Schritt 1 mit &amp;ldquo;Sterbedatum&amp;rdquo; und dem GREL Ausdruck &lt;code>value.find(/†[^\;)]+/)[0]&lt;/code>.&lt;/li>
&lt;li>Die Spalte &amp;ldquo;Geburtsdatum&amp;rdquo; in zwei Spalten aufteilen via
&amp;ldquo;Geburtsdatum&amp;rdquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;ldquo;Edit column&amp;rdquo;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;ldquo;Split into several columns&amp;hellip;&amp;rdquo;
und dem Seperator &lt;code>\s+in\s+&lt;/code> (Häkchen bei &lt;em>regular expression&lt;/em> nicht vergessen).&lt;/li>
&lt;li>Wiederhole Schritt 3 auf der Spalte &amp;ldquo;Sterbedatum&amp;rdquo;.&lt;/li>
&lt;li>Spalten umbenennen&lt;/li>
&lt;li>Unnötige Zeichen in Spalte &amp;ldquo;Geburtsdatum&amp;rdquo; ersetzen via
&amp;ldquo;Geburtsdatum&amp;rdquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;ldquo;Edit cells&amp;rdquo;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;ldquo;Transform&amp;hellip;&amp;rdquo;
und dem GREL Ausdruck &lt;code>value.replace(/(\*\s*|†\s*)/, &amp;quot;&amp;quot;)&lt;/code> (alternativ geht das auch über den &amp;ldquo;Replace&amp;rdquo; Dialog).&lt;/li>
&lt;li>Wiederhole Schritt 6 auf der Spalte &amp;ldquo;Sterbedatum&amp;rdquo;.&lt;/li>
&lt;/ol>
&lt;/p>
&lt;/details>
&lt;details class="spoiler " id="spoiler-20">
&lt;summary>&lt;strong>Alternative Lösung(en):&lt;/strong>&lt;/summary>
&lt;p>&lt;p>Wir verwenden &lt;code>match()&lt;/code> und einen komplexen regulären Ausdruck um alle Datenbestandteile gleichzeitig zu extrahieren:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">match&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/.+\* (?&amp;lt;Geburtsdatum&amp;gt;\d{1,2}\. [a-zA-Zä]+ \d{4}) in (?&amp;lt;Geburtsort&amp;gt;[^;]+); † (?&amp;lt;Sterbedatum&amp;gt;\d{1,2}\. [a-zA-Zä]+ \d{4}) in (?&amp;lt;Sterbeort&amp;gt;[^;|\)]+).+/&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Diesen GREL Ausdruck können wir dann viermal mit &amp;ldquo;Kurzbiographie&amp;rdquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;ldquo;Edit column&amp;rdquo;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;ldquo;Add column based on this column&amp;hellip;&amp;rdquo; anwenden und jeweils via &lt;code>value.match(...)[0]&lt;/code> (Geburtsdatum) bis &lt;code>value.match(...)[3]&lt;/code> (Sterbeort) die einzelnen Bestandteile für die jeweilige Spalte extrahieren.&lt;/p>
&lt;p>Oder wir verwenden anstatt &lt;code>value.match(...)[...]&lt;/code> die Funktion &lt;code>value.match(...).join(&amp;quot;;&amp;quot;)&lt;/code> und teilen die neue Spalte anschließend an dem Trennzeichen &lt;code>;&lt;/code> in vier Spalten auf.&lt;/p>
&lt;p>Oder wir extrahieren die Daten zuerst gemeinsam und transponieren sie anschließend, wie in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/">Daten mit OpenRefine Transponieren&lt;/a> beschrieben.
Vor dem Transponieren müssen wir die Daten anhand von einem Zeilenumbruch &lt;code>\n&lt;/code> in mehrere Zeilen aufteilen, die Spalte anhand von &lt;code>:&lt;/code> in zwei Spalten aufteilen und mit &amp;ldquo;Edit cells&amp;rdquo;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;ldquo;Fill down&amp;rdquo; die restlichen Spalten auffüllen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">match&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/.+\* (?&amp;lt;Geburtsdatum&amp;gt;\d{1,2}\. [a-zA-Zä]+ \d{4}) in (?&amp;lt;Geburtsort&amp;gt;[^;]+); † (?&amp;lt;Sterbedatum&amp;gt;\d{1,2}\. [a-zA-Zä]+ \d{4}) in (?&amp;lt;Sterbeort&amp;gt;[^;|\)]+).+/&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Geburtsdatum: &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;\nGeburtsort: &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;\nSterbedatum: &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;\nSterbeort: &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-10-vorsicht-bei-umlauten">Aufgabe 10: Vorsicht bei Umlauten&lt;/h2>
&lt;p>Wie schon erwähnt basiert OpenRefine auf Java und in der hier im Tutorial eingesetzten OpenRefine Version 3.9.3 wird Java in Version 11 mitgeliefert. Eine Übersicht über alle von Java in dieser Version unterstützen Features von regulären Ausdrücken findet sich in der &lt;a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html" target="_blank" rel="noopener">Java 11 Dokumentation zu RegEx Pattern&lt;/a>.
Die Unicode Unterstützung ist bei den Mustern in Java 11 &lt;strong>optional&lt;/strong> und muss daher separat aktiviert werden.
Das hat zur Folge, dass &amp;ldquo;Sonderzeichen&amp;rdquo; wie unsere Umlaute &lt;em>äöü&lt;/em>, oder die in der französischen Sprache gebräuchlichen Buchstaben mit Akzenten &lt;em>éêè&lt;/em>, nicht von den Mustern &lt;code>[a-z]&lt;/code> oder &lt;code>\w&lt;/code> berücksichtigt werden.&lt;/p>
&lt;p>Um zum Beispiel auch Umlaute zu berücksichtigen gibt es mehrere Möglichkeiten:&lt;/p>
&lt;ol>
&lt;li>Umlaute explizit auflisten: &lt;code>[a-zäöüß]&lt;/code>&lt;/li>
&lt;li>Spezielle Klasse für Buchstaben (&lt;em>letter&lt;/em>) verwenden: &lt;code>\p{L}&lt;/code>&lt;/li>
&lt;li>Spezielle Klasse für alphabetische Zeichen verwenden: &lt;code>\p{IsAlphabetic}&lt;/code>&lt;/li>
&lt;li>Unicode Modus mit &lt;em>inline Flag&lt;/em> aktivieren: &lt;code>(?U)\w&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Kopieren Sie den folgenden GREL Ausdruck in einen GREL Dialog und ersetzen Sie &lt;code>...&lt;/code> mit den oben genannten Möglichkeiten auch Unicode-Zeichen zu berücksichtigen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;abcöüßéêè€$123!-&amp;#34;&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/.../&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;details class="spoiler " id="spoiler-21">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>In RegEx101 wird bei der Auswahl des &lt;em>Flavors&lt;/em> Java 8 die Unicode Unterstützung über das &lt;code>U&lt;/code> Flag nach dem regulären Ausdruck aktiviert. &lt;em>Inline Flags&lt;/em> werden dort nicht unterstützt.&lt;/li>
&lt;li>In OpenRefine wird &lt;code>U&lt;/code> nur als &lt;em>inline Flag&lt;/em> und nicht als Regex Flag unterstützt.&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Bei der Verwendung von regulären Ausdrücken sollte stets die Balance zwischen &lt;a href="https://en.wikipedia.org/wiki/Precision_and_recall" target="_blank" rel="noopener">Genauigkeit und Trefferquote&lt;/a> im Hinterkopf behalten werden.
Liegt die Priorität darauf nur genau die Daten zu finden, die einem sehr präzisen Muster folgen?
Oder formulieren wir das Muster eher unpräzise und filtern die überflüssigen Treffer in einem separaten Schritt?&lt;/p>
&lt;p>Wie bei der Lösung zur Aufgabe 9 angesprochen, ist es manchmal einfacher und verständlicher die Arbeiten in mehrere einfache Schritte zu teilen, anstatt sie in einem komplexen Schritt zu formulieren.
Also zum Beispiel Geburtsdatum und Geburtsort zusammenhängend zu extrahieren und dann aufzusplitten, anstatt komplexe reguläre Ausdrücke für ein Geburtsdatum &lt;strong>und&lt;/strong> den Geburtsort separat zu formulieren.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns mit der Programmiersprache GREL.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel" class="btn btn-primary px-3 py-3">09 Arbeiten mit GREL&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Daten mit OpenRefine Transponieren</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/</guid><description>&lt;p>OpenRefine kann Zeilen und Spalten tauschen. Diese Transposition kann sowohl auf dem kompletten Datensatz, als auch nur auf einer Auswahl an Spalten durchgeführt werden. In diesem Tutorial besprechen wir zwei Varianten des Transponierens.&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>Transponieren in der &lt;a href="https://docs.openrefine.org/manual/transposing" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;p>In der Praxis kommt es vor, dass wir Daten in Spalten organisiert bekommen, die wir eigentlich zeilenweise benötigen, oder umgekehrt.
In der nächsten Tabelle ist ein Ausschnitt von Daten zu Politikern im &lt;a href="https://de.wikipedia.org/wiki/Kabinett_Kretschmann_III" target="_blank" rel="noopener">Kabinett Kretschmann III&lt;/a> gezeigt, mit dem wir im Laufe dieser Aufgabe arbeiten werden. Die Daten sind in Spalten gespeichert.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>GND-ID&lt;/th>
&lt;th>Name&lt;/th>
&lt;th>Geschlecht&lt;/th>
&lt;th>Geburtsdatum&lt;/th>
&lt;th>Geburtsort&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>143926683&lt;/td>
&lt;td>Kretschmann, Winfried&lt;/td>
&lt;td>Männlich&lt;/td>
&lt;td>1948-05-17&lt;/td>
&lt;td>Spaichingen&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>122189930&lt;/td>
&lt;td>Hermann, Winfried&lt;/td>
&lt;td>Männlich&lt;/td>
&lt;td>1952&lt;/td>
&lt;td>Rottenburg am Neckar&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;hellip;&lt;/td>
&lt;td>&amp;hellip;&lt;/td>
&lt;td>&amp;hellip;&lt;/td>
&lt;td>&amp;hellip;&lt;/td>
&lt;td>&amp;hellip;&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>In der nächsten Tabelle sind die gleichen Daten zeilenweise gespeichert.
Mit der zusätzlichen &amp;ldquo;GND-ID&amp;rdquo; Spalte, die wir nicht mittransponiert haben, ergibt sich dadurch eine Record-Struktur, wie wir sie im letzten Teil des Workshops kennen gelernt und besprochen haben.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>GND-ID&lt;/th>
&lt;th>Schlüssel&lt;/th>
&lt;th>Wert&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>143926683&lt;/td>
&lt;td>Name&lt;br>Geschlecht&lt;br>Geburtsdatum&lt;br>Geburtsort&lt;/td>
&lt;td>Kretschmann, Winfried&lt;br>Männlich&lt;br>1948-05-17&lt;br>Spaichingen&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>122189930&lt;/td>
&lt;td>Name&lt;br>Geschlecht&lt;br>Geburtsdatum&lt;br>Geburtsort&lt;/td>
&lt;td>Hermann, Winfried&lt;br>Männlich&lt;br>1952&lt;br>Rottenburg am Neckar&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;hellip;&lt;/td>
&lt;td>Name&lt;br>Geschlecht&lt;br>Geburtsdatum&lt;br>Geburtsort&lt;/td>
&lt;td>&amp;hellip;&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Mit der Option Daten in OpenRefine zu transponieren, können wir Daten in den oben gezeigten Formaten ineinander umwandeln.&lt;/p>
&lt;h2 id="vorbereitung-projekt-erstellen">Vorbereitung: Projekt erstellen&lt;/h2>
&lt;p>Die folgende Datei in ein OpenRefine-Projekt laden.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/11_kretschmann-kabinett-iii-transposing.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kretschmann III als CSV&lt;/a>
&lt;p>Die importierten Daten sind in Abbildung 1 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-daten-nach-dem-import">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Daten nach dem Import." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-start_huc187b1dbb604743a4be7c7b012955770_32568_3b8e284e79b785a59538b06e127d066c.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-start_huc187b1dbb604743a4be7c7b012955770_32568_1836e7cebb377b9ad07be7f7abf9ad62.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-start_huc187b1dbb604743a4be7c7b012955770_32568_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-start_huc187b1dbb604743a4be7c7b012955770_32568_3b8e284e79b785a59538b06e127d066c.webp"
width="606"
height="304"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Daten nach dem Import.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-1-transponieren-ohne-schlüsselspalte">Aufgabe 1: Transponieren ohne Schlüsselspalte&lt;/h2>
&lt;p>Wir transponieren in dieser Aufgabe die in Abbildung 1 abgebildeten Daten in ein zeilenweises Datenformat.
Dabei lassen wir die Spalte &amp;ldquo;GND-ID&amp;rdquo; stehen um anschließend eine Record-Struktur zu erzeugen.&lt;/p>
&lt;p>Zum Transponieren gehen wir in den zugehörigen Dialog via
&amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Transpose&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transpose cells across columns into rows&amp;hellip;&amp;rdquo;
und wählen dort die zu transponierenden Spalten aus.
Wie in Abbildung 2 geben wir als Zielformat an, dass wir die Daten in einer Spalte (&lt;em>One column&lt;/em>) zusammengefasst bekommen möchten.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialoges-zum-transponieren-in-eine-spalte">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialoges zum Transponieren in eine Spalte." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-dialog_hu416a1c59c59d09ca201d612300d1c188_21638_30df7c8bb64b5e54731974621deaaee1.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-dialog_hu416a1c59c59d09ca201d612300d1c188_21638_ab4e3edb27494a271ca57456fb14cdef.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-dialog_hu416a1c59c59d09ca201d612300d1c188_21638_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-dialog_hu416a1c59c59d09ca201d612300d1c188_21638_30df7c8bb64b5e54731974621deaaee1.webp"
width="724"
height="555"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialoges zum Transponieren in eine Spalte.
&lt;/figcaption>&lt;/figure>
&lt;p>Das Ergebnis ist in Abbildung 3 gezeigt. Wir haben nun eine Record-Struktur mit der GND-ID als Identifikator und allen zugehörigen Daten in einem Record-Feld.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-daten-nach-dem-transponieren-in-eine-spalte">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Daten nach dem Transponieren in eine Spalte." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-result_hu55345c40a036518fbbadc3a4d9ff17df_48013_d842f6a3627d8018e3d2d5ec78af1826.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-result_hu55345c40a036518fbbadc3a4d9ff17df_48013_541433ba443a2d482e66b9ccd0686b95.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-result_hu55345c40a036518fbbadc3a4d9ff17df_48013_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-result_hu55345c40a036518fbbadc3a4d9ff17df_48013_d842f6a3627d8018e3d2d5ec78af1826.webp"
width="219"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Daten nach dem Transponieren in eine Spalte.
&lt;/figcaption>&lt;/figure>
&lt;p>Der Schritt von einer zeilenweiser Speicherung zurück zu Spalten geht über
&amp;ldquo;Daten&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Transpose&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transpose cells in rows into columns&amp;hellip;&amp;rdquo;.
In dem Dialog geben wir &lt;code>4&lt;/code> Zeilen zum Transponieren an.
Das Ergebnis ist in Abbildung 4 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-daten-nach-dem-transponieren-von-einer-spalte">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Daten nach dem Transponieren von einer Spalte." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-back_hu3613ac0bb226976d546cf9f423f45913_39963_a7f93ab24f67683df17ee594de95f904.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-back_hu3613ac0bb226976d546cf9f423f45913_39963_76c9b95c64bc546eab65d3249d8c24de.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-back_hu3613ac0bb226976d546cf9f423f45913_39963_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-one-col-back_hu3613ac0bb226976d546cf9f423f45913_39963_a7f93ab24f67683df17ee594de95f904.webp"
width="747"
height="307"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Daten nach dem Transponieren von einer Spalte.
&lt;/figcaption>&lt;/figure>
&lt;p>Hier sind auch schon zwei Nachteile beim Transponieren ohne Schlüssel zu sehen:&lt;/p>
&lt;ol>
&lt;li>Die Spalten müssen nachgearbeitet werden (Name ändern, Präfix entfernen).&lt;/li>
&lt;li>Die Daten müssen einheitlich sein, also gleiche Anzahl an Elementen und gleiche Sortierung, da die Umwandlung sonst &amp;ldquo;verrutscht&amp;rdquo;.&lt;/li>
&lt;/ol>
&lt;h2 id="aufgabe-2-transponieren-mit-schlüsselspalte">Aufgabe 2: Transponieren mit Schlüsselspalte&lt;/h2>
&lt;p>Wir machen die Änderungen rückgängig und stellen den in Abbildung 1 gezeigten Ursprungszustand des Projektes wieder her.&lt;/p>
&lt;p>Diesmal transponieren wir die Daten in zwei Spalten, indem wir eine separate Schlüsselspalte erzeugen lassen.
Dies funktioniert über den gleichen Dialog wie in Aufgabe 1 über
&amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Transpose&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transpose cells across columns into rows&amp;hellip;&amp;rdquo;.
Die Einstellungen sind in Abbildung 5 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialoges-zum-transponieren-in-zwei-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialoges zum Transponieren in zwei Spalten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-dialog_hu510b757ac86dc37e40038a586ebb0b10_21994_62901b34eae7bc096bee3361304162f8.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-dialog_hu510b757ac86dc37e40038a586ebb0b10_21994_098998390f06cff0dc1ea4aa206b05f9.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-dialog_hu510b757ac86dc37e40038a586ebb0b10_21994_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-dialog_hu510b757ac86dc37e40038a586ebb0b10_21994_62901b34eae7bc096bee3361304162f8.webp"
width="726"
height="562"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialoges zum Transponieren in zwei Spalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Das Ergebnis der Umwandlung ist in Abbildung 6 gezeigt. Wir haben eine Record-Struktur mit der GND-ID als Identifikator und allen zugehörigen Daten in einem Record-Feld.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-daten-nach-dem-transponieren-in-zwei-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Daten nach dem Transponieren in zwei Spalten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-result_hu3f4a78b2e58f0b45df36cc08cdbc5129_52717_f7a768fdeecd58c17d41741370a64df1.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-result_hu3f4a78b2e58f0b45df36cc08cdbc5129_52717_5f702248d71dfa8440f45ade40cf613e.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-result_hu3f4a78b2e58f0b45df36cc08cdbc5129_52717_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-result_hu3f4a78b2e58f0b45df36cc08cdbc5129_52717_f7a768fdeecd58c17d41741370a64df1.webp"
width="252"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Daten nach dem Transponieren in zwei Spalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Bevor wir von diesem Format zu einem Spaltenformat kommen, müssen wir zuerst die Records auflösen.
Wir haben in diesem Datensatz nur eine Spalte (&amp;ldquo;GND-ID&amp;rdquo;) mit leeren Feldern, also genügt es diese über
&amp;ldquo;GND-ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Fill down&amp;rdquo;
aufzufüllen.&lt;/p>
&lt;p>Anschließend können wir diesmal über
&amp;ldquo;Schluessel&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Transpose&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Columnize by key/value columns&amp;hellip;&amp;rdquo;
mit den in Abbildung 7 gezeigten Einstellungen wieder zum Ursprungsformat zurückgelangen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialoges-zum-transponieren-von-schlüsselwerte-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialoges zum Transponieren von Schlüssel/Werte Spalten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-back-dialog_hu683815b3ed402187374b439010f8894f_9767_9e85b7f2f26571de69776d857269c8ee.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-back-dialog_hu683815b3ed402187374b439010f8894f_9767_3e7abba6fcdb4ca4b8b076b056ad9d8a.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-back-dialog_hu683815b3ed402187374b439010f8894f_9767_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-two-col-back-dialog_hu683815b3ed402187374b439010f8894f_9767_9e85b7f2f26571de69776d857269c8ee.webp"
width="603"
height="456"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialoges zum Transponieren von Schlüssel/Werte Spalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Diesmal benötigen wir anschließend keine Anpassungen oder im Vorfeld schon sortierte Daten.
Lediglich die Schlüssel in der Spalte &amp;ldquo;Schluessel&amp;rdquo; sollten einheitlich geschrieben sein.&lt;/p>
&lt;h2 id="aufgabe-3-transponieren-ausgewählter-spalten">Aufgabe 3: Transponieren ausgewählter Spalten&lt;/h2>
&lt;p>Eine weitere praktische Anwendung des Transponierens liegt vor, wenn man &lt;strong>mehrere Spalten&lt;/strong> von einem Typ hat, die man in &lt;strong>einem Arbeitsgang&lt;/strong> zum Beispiel via Clustering vereinheitlichen oder mit einer Normdatenquelle abgleichen möchte.
Für diese Aufgabe wurden exemplarisch die Daten des bisher verwendeten Datensatzes mit den jeweiligen Wirkorten der Politikerinnen und Politikern ergänzt. Das Ergebnis nach dem Import wird in Abbildung 8 gezeigt.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/11_kretschmann-kabinett-iii-transposing-orte.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kretschmann III als CSV&lt;/a>
&lt;figure id="figure-bildschirmfoto-der-daten-mit-mehreren-ortsspalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Daten mit mehreren Ortsspalten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-start_huee16abf08d774fd1ec2b2be1018a74e1_51122_dc6322ac43ef3266bb9cb99f3bb97495.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-start_huee16abf08d774fd1ec2b2be1018a74e1_51122_74eba6c26fca47143cb140784e784060.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-start_huee16abf08d774fd1ec2b2be1018a74e1_51122_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-start_huee16abf08d774fd1ec2b2be1018a74e1_51122_dc6322ac43ef3266bb9cb99f3bb97495.webp"
width="760"
height="227"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Daten mit mehreren Ortsspalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Um alle Orte in der Tabelle in einem Arbeitsgang mit z.B. der GND abzugleichen, müssen wir die Daten der einzelnen Spalten in eine gemeinsame Spalte überführen.
Dabei müssen wir uns merken, aus welcher Spalte die einzelnen Orte kommen, um sie nach dem Abgleich wieder zurück schreiben zu können.&lt;/p>
&lt;p>Hierfür eignet sich ebenfalls das Transponieren.
Die Voraussetzung dafür ist, dass die zu transponierenden Spalten alle direkt nacheinander gelistet sind.
Dies lässt sich relativ komfortabel mit
&amp;ldquo;ALL&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Re-order / remove columns&amp;hellip;&amp;rdquo;
erledigen.&lt;/p>
&lt;p>Anschließend werden nur die Ortsspalten über
&amp;ldquo;Geburtsort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Transpose&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transpose cells across columns into rows&amp;hellip;&amp;rdquo;
zusammengeführt.
Die Einstellungen sind in Abbildung 9 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialoges-zum-transponieren-von-spalten-in-zeilen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialoges zum Transponieren von Spalten in Zeilen." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/_hu9531286a05212efd4754e15ec69c182d_34441_df2a010f7821691e1a863a4d8781459b.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/_hu9531286a05212efd4754e15ec69c182d_34441_bd2dfc90f7314b82a0b92122e3cf3edd.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/_hu9531286a05212efd4754e15ec69c182d_34441_2b32fe1f2b1a277a36d629044e5723d3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/_hu9531286a05212efd4754e15ec69c182d_34441_df2a010f7821691e1a863a4d8781459b.webp"
width="728"
height="548"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialoges zum Transponieren von Spalten in Zeilen.
&lt;/figcaption>&lt;/figure>
&lt;p>Hierbei nicht vergessen, den Haken bei &amp;ldquo;Fill down in other columns&amp;rdquo; zu setzen.
Das spart das spaltenweise Auffüllen der einzelnen Spalten vor der Rückumwandlung.
Das Ergebnis nach der Umwandlung ist in Abbildung 10 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-daten-mit-den-zusammengefassten-ortsspalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Daten mit den zusammengefassten Ortsspalten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-transposed_hu67d8978cb8a99b3cf1a7ef328c08a147_97535_561e77efd9069c7996bee9ed16244c72.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-transposed_hu67d8978cb8a99b3cf1a7ef328c08a147_97535_dd2f0dd42ce17ac1b9eed7730a1e9587.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-transposed_hu67d8978cb8a99b3cf1a7ef328c08a147_97535_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-transposed_hu67d8978cb8a99b3cf1a7ef328c08a147_97535_561e77efd9069c7996bee9ed16244c72.webp"
width="742"
height="616"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Daten mit den zusammengefassten Ortsspalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Nach dem Abgleich werden die Daten mit
wie in Abbildung 11 gezeigt wieder in das Spaltenformat umgewandelt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialoges-zum-zurückführen-der-zeilen-in-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialoges zum zurückführen der Zeilen in Spalten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/_hu3fcf722cf19cb83c224fe48cf0ebdc99_19235_f136eeeab379e9dcf3a58d22c8e65b4e.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/_hu3fcf722cf19cb83c224fe48cf0ebdc99_19235_276ecfbb87bc3b7401db31a6b1c2d915.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/_hu3fcf722cf19cb83c224fe48cf0ebdc99_19235_03b47d2927c736ea462a949e31e5d8eb.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/_hu3fcf722cf19cb83c224fe48cf0ebdc99_19235_f136eeeab379e9dcf3a58d22c8e65b4e.webp"
width="602"
height="448"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialoges zum zurückführen der Zeilen in Spalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Das Ergebnis der Rückumwandlung ist in Abbildung 12 gezeigt.
Bei Bedarf kann man die Ortsspalten jetzt wieder einsortieren und/oder für jede Ortsspalte eine GND-ID Spalte hinzufügen mit
&amp;ldquo;Ortsspalte&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add entity identifiers column&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-den-mit-der-gnd-abgeglichenen-daten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit den mit der GND abgeglichenen Daten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-end_huf535e77c4bbc8f5c19476c8ee70eae18_79814_7ac1b7d559d07442fcd48e8d53072c0e.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-end_huf535e77c4bbc8f5c19476c8ee70eae18_79814_6c5ce184903cab5308dc84ba1062ac47.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-end_huf535e77c4bbc8f5c19476c8ee70eae18_79814_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-end_huf535e77c4bbc8f5c19476c8ee70eae18_79814_7ac1b7d559d07442fcd48e8d53072c0e.webp"
width="760"
height="321"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit den mit der GND abgeglichenen Daten.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="automatischer-fill-down">Automatischer Fill-down&lt;/h3>
&lt;p>Sollte man beim Umwandeln in das Zeilenformat vergessen haben, den Haken bei &amp;ldquo;Fill down in other columns&amp;rdquo; zu setzen, dann kann man das noch spaltenweise mit
&amp;ldquo;Spaltenname&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Fill down&amp;rdquo;
nachholen.&lt;/p>
&lt;p>Hat man sehr viele Spalten, so kann man stattdessen via
&amp;ldquo;ALL&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
den folgenden GREL Ausdruck verwenden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">columnName&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dabei ist darauf zu achten, dass man die ID-Spalte entweder auslässt und separat auffüllt, oder die ID-Spalte bei der Massenbearbeitung via &amp;ldquo;Drag&amp;amp;Drop&amp;rdquo; ans Ende verschiebt.
Ansonsten ändert sich die &amp;ldquo;Record&amp;rdquo;-Struktur, bevor alle Spalten befüllt wurden und der GREL-Ausdruck funktioniert nicht mehr.&lt;/p>
&lt;h3 id="alternative-für-gnd-id-spalten">Alternative für GND-ID Spalten&lt;/h3>
&lt;p>Hat man sehr viele Ortsspalten, dann lässt sich die Erzeugung der GND-ID-Spalten auch etwas automatisieren.&lt;/p>
&lt;p>Nachdem man die Daten mit der GND abgeglichen hat (also bevor man die Zeilen wieder in Spalten überführt), ergänzt man die GND-Nummer im Namen des Ortes über
&amp;ldquo;Ort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
und dem folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;||&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">cell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">recon&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">match&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anschließend werden die Werte via
&amp;ldquo;Ort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split multi-valued cells&amp;hellip;&amp;rdquo;
und den Trennzeichen &lt;code>||&lt;/code> in mehrere Zeilen aufgeteilt.&lt;/p>
&lt;p>Der zukünftige Spaltenname wird ergänzt via
&amp;ldquo;Ortstyp&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
und dem folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">columnName&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34; (GND-ID)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das Ergebnis sieht dann wie in Abbildung 13 aus.
Dort müssen jetzt noch die restlichen Spalten vor der Umwandlung in das auf Spalten basierte Format zum Beispiel mit &amp;ldquo;Fill down&amp;rdquo; aufgefüllt werden&lt;/p>
&lt;figure id="figure-bildschirmfoto-ergänzten-zeilen-für-die-zukünftigen-gnd-id-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto ergänzten Zeilen für die zukünftigen GND-ID Spalten." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-mit-gnd-id_hu4c26e534cac07c8f5c1e10852e2e07f6_161693_342a707ad00c5b5c1010a4b92202f03d.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-mit-gnd-id_hu4c26e534cac07c8f5c1e10852e2e07f6_161693_8f7ca77516a134d4733b1755cd8ae038.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-mit-gnd-id_hu4c26e534cac07c8f5c1e10852e2e07f6_161693_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-orte-mit-gnd-id_hu4c26e534cac07c8f5c1e10852e2e07f6_161693_342a707ad00c5b5c1010a4b92202f03d.webp"
width="498"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto ergänzten Zeilen für die zukünftigen GND-ID Spalten.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Transponieren in OpenRefine hat noch weitere Features, wie zum Beispiel die Berücksichtigung von extra Spalten, mehreren Werten und separaten Spalten für Notizen. Dabei ist OpenRefine gerade beim Unwandeln von zeilenweisen Daten in spaltenweise sehr sensibel gegenüber der Sortierung der Werte in der Schlüsselspalte und ggf. weiteren Spalten, die nicht mit umgewandelt werden sollen.&lt;/p>
&lt;p>Ein typischer Fehler ist zum Beispiel die Umwandlung von &amp;ldquo;Records&amp;rdquo; mit &amp;ldquo;Columnize by key/value columns&amp;rdquo; &lt;strong>ohne&lt;/strong> die &amp;ldquo;Records&amp;rdquo; vorher mit &amp;ldquo;Fill down&amp;rdquo; aufzulösen. Das führt dazu, dass &amp;ldquo;Leer&amp;rdquo; als eigener Wert berücksichtigt wird und OpenRefine die Daten dadurch wie in Abbildung 8 sehr unerwartet sortiert.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-ergebnisses-von-aufgabe-2-ohne-fill-down">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Ergebnisses von Aufgabe 2 ohne &amp;#39;Fill down&amp;#39;." srcset="
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-no-fill-down_hu1ecbac96f023095782251cdc331a2bbd_26674_ba5828d9adf4f3b89ce161fd9d32d814.webp 400w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-no-fill-down_hu1ecbac96f023095782251cdc331a2bbd_26674_a9feb44018dbb0d9708cacb8c9a83fca.webp 760w,
/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-no-fill-down_hu1ecbac96f023095782251cdc331a2bbd_26674_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/screenshot-openrefine-transposing-no-fill-down_hu1ecbac96f023095782251cdc331a2bbd_26674_ba5828d9adf4f3b89ce161fd9d32d814.webp"
width="582"
height="327"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Ergebnisses von Aufgabe 2 ohne &amp;lsquo;Fill down&amp;rsquo;.
&lt;/figcaption>&lt;/figure>
&lt;hr>
&lt;p>Im nächsten Teil ergänzen wir mit OpenRefine ein Projekt mit Daten aus anderen Projekten.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen" class="btn btn-primary px-3 py-3">12 Daten zwischen Projekten in OpenRefine abgleichen&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Daten zwischen Projekten in OpenRefine abgleichen</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/</guid><description>&lt;p>Daten können zwischen OpenRefine Projekten abgeglichen werden.
In diesem Tutorial zeigen wir wie das funktioniert.&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>&lt;code>cross()&lt;/code> in der &lt;a href="https://docs.openrefine.org/manual/grelfunctions#crosscell-s-projectname-optional-s-columnname-optional" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;br>
&lt;code>cross()&lt;/code> im &lt;a href="https://github.com/OpenRefine/OpenRefine/wiki/Recipes#combining-datasets" target="_blank" rel="noopener">OpenRefine Wiki&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;p>Im Artikel &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/">Gemeinsam an OpenRefine-Projekten arbeiten&lt;/a>
haben wir verschiedene Varianten, Daten zwischen OpenRefine Projekten abzugleichen, besprochen und verglichen.
In diesem Tutorial fokussieren wir uns auf die Funktion &lt;a href="https://docs.openrefine.org/manual/grelfunctions#crosscell-s-projectname-optional-s-columnname-optional" target="_blank" rel="noopener">cross()&lt;/a> in OpenRefine, ohne über Alternativen und zukünftige Entwicklungen zu spekulieren.&lt;/p>
&lt;h2 id="vorbereitung-projekt-erstellen">Vorbereitung: Projekt erstellen&lt;/h2>
&lt;p>Die folgenden Dateien jeweils in ein OpenRefine-Projekt laden.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgenden Dateien (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/12_staedte-in-bw.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Staedte in BW&lt;/a>
&lt;blockquote>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/12_staedte-in-bw-geokoordinaten.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Staedte in BW - Geokoordinaten&lt;/a>
&lt;p>In der Datei für das Projekt &amp;ldquo;Staedte in BW&amp;rdquo; sind Informationen aus Wikidata und der GND zu den 25 &lt;a href="https://de.wikipedia.org/wiki/Liste_der_gr%C3%B6%C3%9Ften_St%C3%A4dte_in_Baden-W%C3%BCrttemberg" target="_blank" rel="noopener">bevölkerungsreichsten Städten in Baden-Württemberg&lt;/a> gesammelt.&lt;/p>
&lt;p>In der Datei für das Projekte &amp;ldquo;Staedte in BW - Geokoordinaten&amp;rdquo; sind Geokoordinaten für Städte in Baden Württemberg gesammelt.
Mit diesen beiden Projekten testen wir in den folgenden Aufgaben den Datenabgleich.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
Das Projekt &amp;ldquo;Staedte in BW&amp;rdquo; verwenden wir in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/">13 Die Welt der Facets&lt;/a> noch einmal.
&lt;/div>
&lt;/div>
&lt;h2 id="aufgabe-1-daten-via-name-abgleichen">Aufgabe 1: Daten via Name abgleichen&lt;/h2>
&lt;p>Im Projekt &amp;ldquo;Staedte in BW&amp;rdquo; wollen wir die passenden Geokoordinaten für die einzelnen Städte aus dem Projekt &amp;ldquo;Staedte in BW - Geokoordinaten&amp;rdquo; nachladen.
Dafür gehen wir im Projekt &amp;ldquo;Staedte in BW&amp;rdquo; über
&amp;ldquo;Stadt&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">cell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cross&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Staedte in BW - Geokoordinaten&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Name&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geokoordinaten (WGS 84)&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dabei benötigen wir den exakten Projektnamen des Projektes aus dem wir die Daten nachladen wollen (&amp;ldquo;Staedte in BW - Geokoordinaten&amp;rdquo;), die Spalte in dem anderen Projekt mit der unsere Spalte &amp;ldquo;Stadt&amp;rdquo; abgeglichen werden soll (&amp;ldquo;Name&amp;rdquo;) und den Namen der Spalte in dem anderen Projekt, die wir &amp;ldquo;nachladen&amp;rdquo; wollen (&amp;ldquo;Geokoordinaten (WGS 84)&amp;rdquo;). Der Dialog ist in Abbildung 1 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialogs-zum-abgleich-mit-einem-anderen-projekt-über-die-spalte-stadt">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialogs zum Abgleich mit einem anderen Projekt über die Spalte Stadt." srcset="
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-name_hu58e5c08200079c3a855b16fcab0e9b0f_26560_240d10ee1618ce2f230c511da5eabf55.webp 400w,
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-name_hu58e5c08200079c3a855b16fcab0e9b0f_26560_30350298d2a9e24ea0edf371288112ca.webp 760w,
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-name_hu58e5c08200079c3a855b16fcab0e9b0f_26560_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-name_hu58e5c08200079c3a855b16fcab0e9b0f_26560_240d10ee1618ce2f230c511da5eabf55.webp"
width="716"
height="541"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialogs zum Abgleich mit einem anderen Projekt über die Spalte Stadt.
&lt;/figcaption>&lt;/figure>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> in der Vorschau in Abbildung 1 ist zu sehen, dass für &amp;ldquo;Freiburg im Breisgau&amp;rdquo; keine Daten nachgeladen werden konnten. Warum ist das so? Gibt es noch weitere &amp;ldquo;problematischen&amp;rdquo; Einträge? Was bedeutet das für einen Abgleich über &amp;ldquo;Namen&amp;rdquo;?&lt;/p>
&lt;details class="spoiler " id="spoiler-8">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Im Projekt &amp;ldquo;Staedte in BW - Geokoordinaten&amp;rdquo; sind die Namen der Städte &amp;ldquo;Freiburg im Breisgau&amp;rdquo; und &amp;ldquo;Esslingen am Neckar&amp;rdquo; abgekürzt.&lt;/li>
&lt;li>Ein Abgleich über Namen scheitert manchmal an unterschiedlichen Schreibweisen.&lt;/li>
&lt;li>Wenn möglich also besser eindeutige IDs verwenden.&lt;/li>
&lt;li>Siehe auch &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/">Gemeinsam an OpenRefine-Projekten arbeiten&lt;/a> für weitere Details und mögliche Lösungsstrategien.&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-2-daten-via-id-abgleichen">Aufgabe 2: Daten via ID abgleichen&lt;/h2>
&lt;p>Wir wiederholen die Aufgabe mit einem Abgleich über die Spalte &amp;ldquo;GND-ID&amp;rdquo;.&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Laden Sie im Projekt &amp;ldquo;Staedte in BW&amp;rdquo; die Spalte &amp;ldquo;Geokoordinaten (WGS 84)&amp;rdquo; aus dem Projekt &amp;ldquo;Staedte in BW - Geokoordinaten&amp;rdquo; über einen Abgleich mit der Spalte &amp;ldquo;GND-ID&amp;rdquo; nach.&lt;/p>
&lt;details class="spoiler " id="spoiler-9">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;p>Dafür gehen wir im Projekt &amp;ldquo;Staedte in BW&amp;rdquo; über
&amp;ldquo;GND-ID&amp;rdquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;ldquo;Edit column&amp;rdquo;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;ldquo;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">cell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cross&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Staedte in BW - Geokoordinaten&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;GND ID&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geokoordinaten (WGS 84)&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;figure id="figure-bildschirmfoto-des-dialogs-zum-abgleich-mit-einem-anderen-projekt-über-die-spalte-gnd-id">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialogs zum Abgleich mit einem anderen Projekt über die Spalte GND-ID." srcset="
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-gnd-id_hu5413e1818bfd0a36bdd17a9807783344_26448_1f5cb317184c5c354bb158e4dd7635b3.webp 400w,
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-gnd-id_hu5413e1818bfd0a36bdd17a9807783344_26448_ebd5c975693430d4380d70b5432e1410.webp 760w,
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-gnd-id_hu5413e1818bfd0a36bdd17a9807783344_26448_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-gnd-id_hu5413e1818bfd0a36bdd17a9807783344_26448_1f5cb317184c5c354bb158e4dd7635b3.webp"
width="714"
height="523"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialogs zum Abgleich mit einem anderen Projekt über die Spalte GND-ID.
&lt;/figcaption>&lt;/figure>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-3-zeilen-nachladen">Aufgabe 3: Zeilen nachladen&lt;/h2>
&lt;p>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.&lt;/p>
&lt;p>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 &lt;code>cross()&lt;/code> um Zeilen aus einem anderen Projekt nachzuladen.&lt;/p>
&lt;h3 id="projekte-erstellen">Projekte erstellen&lt;/h3>
&lt;p>Wir verwenden noch einmal die CSV-Dateien &lt;code>01_kretschmann-kabinett-frauen.csv&lt;/code> und &lt;code>01_kretschmann-kabinett-maenner.csv&lt;/code> aus &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/#aufgabe-2-mehrere-dateien-gleichzeitig-laden">Aufgabe 2 in 01 Projekte in OpenRefine laden und verwalten&lt;/a>.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgenden zwei Dateien (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/01_kretschmann-kabinett-frauen.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kretschmann Kabinett Frauen als CSV&lt;/a>
&lt;blockquote>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/01_kretschmann-kabinett-maenner.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kretschmann Kabinett Maenner als CSV&lt;/a>
&lt;p>Diesmal laden wir die Daten jeweils in ein eigenes Projekt mit dem Namen &amp;ldquo;Kretschmann Kabinett III - Frauen&amp;rdquo; bzw. &amp;ldquo;Kretschmann Kabinett III - Männer&amp;rdquo;.&lt;/p>
&lt;h3 id="projekt-2-spalte-abgleich-erstellen">Projekt 2: Spalte Abgleich erstellen&lt;/h3>
&lt;p>In dem Projekt &amp;ldquo;Kretschmann Kabinett III - Männer&amp;rdquo; erstellen wir via
&amp;ldquo;Geschlecht&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und dem folgenden GREL Ausdruck eine neue Spalte mit dem Titel &amp;ldquo;Abgleich&amp;rdquo;.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">index&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Über diese Spalte steuern wir, wie die beiden Projekte zusammengeführt werden sollen. So kann der Wert der Spalte &amp;ldquo;Abgleich&amp;rdquo; für Zeilen, die nicht übertragen werden sollen, wieder entfernt, bzw. gar nicht erst gesetzt werden.&lt;/p>
&lt;h3 id="projekt-1-spalte-abgleich-erstellen">Projekt 1: Spalte Abgleich erstellen&lt;/h3>
&lt;p>In dem Projekt &amp;ldquo;Kretschmann Kabinett III - Frauen&amp;rdquo; erstellen wir ebenfalls via
&amp;ldquo;Geschlecht&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und dem folgenden GREL Ausdruck eine neue Spalte mit dem Titel &amp;ldquo;Abgleich&amp;rdquo;.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">rowsInProject&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">rowsToLoad&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">index&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="nx">rowsInProject&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">forRange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">rowsToLoad&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dieser GREL Ausdruck schreibt nur in die letzte Zeile eine Aufzählung der Zeilennummern aus dem Projekt &amp;ldquo;Kretschmann Kabinett III - Männer&amp;rdquo;.
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 &lt;code>rowsInProject&lt;/code> und &lt;code>rowsToLoad&lt;/code> selbst setzen.
Das Ergebnis der Operation ist in Abbildung 2 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-nach-dem-hinzufügen-der-spalte-abgleich">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes nach dem Hinzufügen der Spalte Abgleich." srcset="
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-rows-01_hu54c64b7bb938be2df15ecb9cf9ec534b_15436_27d56cde26382d3bfabf0595bc173f41.webp 400w,
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-rows-01_hu54c64b7bb938be2df15ecb9cf9ec534b_15436_1bb3ad3bfdc7598ca7fb15d8605ce3d9.webp 760w,
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-rows-01_hu54c64b7bb938be2df15ecb9cf9ec534b_15436_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-rows-01_hu54c64b7bb938be2df15ecb9cf9ec534b_15436_27d56cde26382d3bfabf0595bc173f41.webp"
width="455"
height="178"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes nach dem Hinzufügen der Spalte Abgleich.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="projekt-1-neue-zeilen-erstellen">Projekt 1: Neue Zeilen erstellen&lt;/h3>
&lt;p>Anschließend erzeugen wir die neuen Zeilen via
&amp;ldquo;Abgleich&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit Cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split multi-valued cells&amp;hellip;&amp;rdquo; auf dem Komma &lt;code>,&lt;/code> als Trennzeichen.
Das Ergebnis ist in Abbildung 3 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-nach-dem-hinzufügen-der-leeren-zeilen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes nach dem Hinzufügen der leeren Zeilen." srcset="
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-rows-02_hudcdee7a185fee422f0b25a27c7cd6b6e_21234_fd96b9bf5d623094ffe30e240b060d9a.webp 400w,
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-rows-02_hudcdee7a185fee422f0b25a27c7cd6b6e_21234_b996125a8cc22621a062cf3252340d08.webp 760w,
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-rows-02_hudcdee7a185fee422f0b25a27c7cd6b6e_21234_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-rows-02_hudcdee7a185fee422f0b25a27c7cd6b6e_21234_fd96b9bf5d623094ffe30e240b060d9a.webp"
width="460"
height="308"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes nach dem Hinzufügen der leeren Zeilen.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="projekt-1-daten-nachladen">Projekt 1: Daten nachladen&lt;/h3>
&lt;p>Dann können wir mit dem folgenden GREL Ausdruck über &amp;ldquo;ALL&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo; 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.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isNonBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Abgleich&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Abgleich&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">cross&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Kretschmann Kabinett III - Männer&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Abgleich&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">columnName&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">value&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-bildschirmfoto-des-projektes-nach-dem-nachladen-der-zeilen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes nach dem Nachladen der Zeilen." srcset="
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-rows-03_hu67842ba1b9db83e88fba72280f746656_26570_7e73c3863cbb9bc781f0dd8ce032d6e3.webp 400w,
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-rows-03_hu67842ba1b9db83e88fba72280f746656_26570_b72bff67732b7590d7221e12358970ec.webp 760w,
/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-rows-03_hu67842ba1b9db83e88fba72280f746656_26570_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/screenshot-openrefine-cross-rows-03_hu67842ba1b9db83e88fba72280f746656_26570_7e73c3863cbb9bc781f0dd8ce032d6e3.webp"
width="463"
height="308"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes nach dem Nachladen der Zeilen.
&lt;/figcaption>&lt;/figure>
&lt;div class="alert alert-note">
&lt;div>
Die GREL Ausdrücke wurden hier absichtlich etwas komplexer gewählt, um zusätzliche Schritte wie Filtern zu vermeiden.
&lt;/div>
&lt;/div>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Mit der Funktion &lt;code>cross()&lt;/code> können ziemlich komfortabel Daten zwischen unterschiedlichen OpenRefine Projekten abgeglichen werden.
Natürlich kann sie auch dazu verwendet werden Datenspalten innerhalb &lt;strong>eines&lt;/strong> 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.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns weiter mit Facets in OpenRefine.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets" class="btn btn-primary px-3 py-3">13 Die Welt der Facets&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Die Welt der Facets in OpenRefine</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/</guid><description>&lt;p>Nachdem wir uns im Workshops für Einsteiger hauptsächlich mit den Text Facets in OpenRefine beschäftigt haben, betrachten wir in diesem Tutorial weitere nützliche Facets.&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>Facets in der &lt;a href="https://docs.openrefine.org/manual/facets" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;br>
Reconciliation Facets in der &lt;a href="https://docs.openrefine.org/manual/reconciling#reconciliation-facets" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;h2 id="vorbereitung-projekt-erstellen">Vorbereitung: Projekt erstellen&lt;/h2>
&lt;p>Wir verwenden das im Tutorial &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/">12 Daten zwischen Projekten abgleichen&lt;/a> erstellte Projekt &amp;ldquo;Staedte in BW&amp;rdquo;.&lt;/p>
&lt;h2 id="aufgabe-1-datentypen-anpassen">Aufgabe 1: Datentypen anpassen&lt;/h2>
&lt;p>Der Grundzustand des Projektes ist in Abbildung 1 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-staedte-in-bw-ohne-anpassungen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes &amp;#39;Staedte in BW&amp;#39; ohne Anpassungen." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte_hu23b4a18812c4c690b101ceea0ef50968_126831_3e27bc5b8bdb9eb5de1b81ec31bebaf8.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte_hu23b4a18812c4c690b101ceea0ef50968_126831_0947e76a68bc3805dd0caa3e116c0ba3.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte_hu23b4a18812c4c690b101ceea0ef50968_126831_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte_hu23b4a18812c4c690b101ceea0ef50968_126831_3e27bc5b8bdb9eb5de1b81ec31bebaf8.webp"
width="760"
height="495"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes &amp;lsquo;Staedte in BW&amp;rsquo; ohne Anpassungen.
&lt;/figcaption>&lt;/figure>
&lt;p>An der schwarzen Farbe der Spalteninhalte erkennen wir, dass wir es hier ausschließlich mit Textspalten zu tun haben.
Da wir in diesem Tutorial Facets für verschiedene Datentypen kennen lernen wollen, passen wir die Datentypen der einzelnen Spalten an.&lt;/p>
&lt;p>Hierfür gibt es in OpenRefine schon Befehle, die wir im Spaltenmenü finden
&amp;ldquo;&amp;hellip;&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Common Transforms&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;rdquo;&amp;hellip;&amp;rdquo;&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Wir passen die Datentypen in den folgenden Spalten an:&lt;/p>
&lt;ul>
&lt;li>Urkundlich erwaehnt: &lt;em>Datum&lt;/em> (&lt;code>toDate&lt;/code>)&lt;/li>
&lt;li>Flaeche (km2): &lt;em>Zahl&lt;/em> (&lt;code>toNumber&lt;/code>)&lt;/li>
&lt;li>Bevoelkerung (2021): &lt;em>Zahl&lt;/em> (&lt;code>toNumber&lt;/code>)&lt;/li>
&lt;li>Weibliche Bevoelkerung (2021): &lt;em>Zahl&lt;/em> (&lt;code>toNumber&lt;/code>)&lt;/li>
&lt;li>Maennliche Bevoelkerung (2021): &lt;em>Zahl&lt;/em> (&lt;code>toNumber&lt;/code>)&lt;/li>
&lt;/ul>
&lt;p>Das Ergebnis sollte dann aussehen wie in Abbildung 2.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-staedte-in-bw-nach-typanpassungen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes &amp;#39;Staedte in BW&amp;#39; nach Typanpassungen." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-typed_hu6cdee9e0c93fbb379cb717a453836e7b_132898_de527d6027e7578ac1ea42f841a81ce3.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-typed_hu6cdee9e0c93fbb379cb717a453836e7b_132898_8e781d30749539ccdaa2d51ce12db629.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-typed_hu6cdee9e0c93fbb379cb717a453836e7b_132898_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-typed_hu6cdee9e0c93fbb379cb717a453836e7b_132898_de527d6027e7578ac1ea42f841a81ce3.webp"
width="760"
height="497"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes &amp;lsquo;Staedte in BW&amp;rsquo; nach Typanpassungen.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-2-all-facets">Aufgabe 2: All Facets&lt;/h2>
&lt;p>In der &amp;ldquo;All&amp;rdquo; Spalte gibt es Facets, die auf den ganzen Datensatz angewendet werden können.
Neben den schon bekannten Facets zum Filtern von mit Sternen oder Flaggen markierten Zeilen sowie komplett leeren Zeilen gibt es auch Facets zum Filtern von leeren Einträgen in Spalten oder Records. In Abbildung 3 sind die beiden Facets für &amp;ldquo;Blank value per column&amp;rdquo; und &amp;ldquo;Non-blank value per column&amp;rdquo; gezeigt. Mit diesen Facets lassen sich schnell und übersichtlich Zeilen filtern, ohne das &amp;ldquo;Facet by blank&amp;rdquo; für jede Spalte separat aufzurufen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-facets-zur-identifikation-von-leeren-feldern">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Facets zur Identifikation von leeren Feldern." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-all_hud9b07ea4e8c881de79178040bef9c8b4_17740_9af10a0215a2885708a93e74684a0b3e.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-all_hud9b07ea4e8c881de79178040bef9c8b4_17740_d584b652e99332dcccbd68bb56d7a2f5.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-all_hud9b07ea4e8c881de79178040bef9c8b4_17740_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-all_hud9b07ea4e8c881de79178040bef9c8b4_17740_9af10a0215a2885708a93e74684a0b3e.webp"
width="292"
height="411"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Facets zur Identifikation von leeren Feldern.
&lt;/figcaption>&lt;/figure>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Überprüfen Sie die folgende Aussage.&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Alle Orte in diesem Datensatz ohne Angabe zum männlichen Bevölkerungsanteil haben auch keine Angabe zum weiblichen Bevölkerungsanteil.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;h2 id="aufgabe-3-null-oder-leer">Aufgabe 3: Null oder Leer&lt;/h2>
&lt;p>Bei den einzelnen Spalten gibt es drei Facets zur Identifikation von leeren Zeilen.
Das Äquivalent zu den in Aufgabe 2 vorgestellten Facets ist das &amp;ldquo;Facet by blank (null or empty string)&amp;rdquo;, welches in Abbildung 4 abgebildet ist.
Das Facet wurde geöffnet mit
&amp;ldquo;Urkundlich erwaehnt&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Customized facets&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Facet by blank (null or empty string)&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-facet-by-blank-null-or-empty-string">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des &amp;#39;Facet by blank (null or empty string)&amp;#39;." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-null-or-empty_hu1bc10f721940be5ebb0cd71462078d40_5003_74b2cee75cb7d9f9588145bd403d6d4e.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-null-or-empty_hu1bc10f721940be5ebb0cd71462078d40_5003_635e0622387449b57d128fe762cbf91a.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-null-or-empty_hu1bc10f721940be5ebb0cd71462078d40_5003_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-null-or-empty_hu1bc10f721940be5ebb0cd71462078d40_5003_74b2cee75cb7d9f9588145bd403d6d4e.webp"
width="294"
height="145"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des &amp;lsquo;Facet by blank (null or empty string)&amp;rsquo;.
&lt;/figcaption>&lt;/figure>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Öffnen Sie auf der Spalte &amp;ldquo;Urkundlich erwaehnt&amp;rdquo; zusätzlich die Facets &amp;ldquo;Facet by null&amp;rdquo; und &amp;ldquo;Facet by empty string&amp;rdquo;. Worin unterscheiden sich die drei Facets?&lt;/p>
&lt;details class="spoiler " id="spoiler-12">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>OpenRefine unterscheidet zwischen nichts (&lt;em>null&lt;/em>) und einem leeren Text (&amp;quot;&amp;quot;), der ja zumindest vom Typ Text ist.
Da wir aber häufig &lt;em>null&lt;/em> und &amp;quot;&amp;quot; gemeinsam behandeln wollen, gibt es zusätzlich &lt;em>blank&lt;/em>, was &lt;em>null&lt;/em> und &amp;quot;&amp;quot; zusammenfasst.&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-4-numeric-facets">Aufgabe 4: Numeric Facets&lt;/h2>
&lt;p>OpenRefine bietet unterschiedliche visuelle Darstellungen für Zahlen in Facets an.
In Abbildung 5 ist die Histogrammansicht gezeigt. Auf der X-Achse ist der Wertebereich abgebildet und auf der Y-Achse die Häufigkeit des entsprechenden Wertes. Der angezeigte Bereich lässt sich mit Schiebern an den Seiten einschränken.&lt;/p>
&lt;p>Zusätzlich zu dem normalen &amp;ldquo;Numeric Facet&amp;rdquo; gibt es bei den &amp;ldquo;Customized Facets&amp;rdquo; noch eine logarithmische Darstellung (&amp;ldquo;Numeric log facet&amp;rdquo;) und eine begrenzte logarithmische Darstellung (&amp;ldquo;1-boundet numeric log facet&amp;rdquo;).&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-facets-für-zahlen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Facets für Zahlen." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric_huff1be850b24c274c92d9a0557282ed50_8483_2b08673d7a095266ae1e35f80891bf47.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric_huff1be850b24c274c92d9a0557282ed50_8483_93988c38af4a094ec6bf70fff1a50cd4.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric_huff1be850b24c274c92d9a0557282ed50_8483_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric_huff1be850b24c274c92d9a0557282ed50_8483_2b08673d7a095266ae1e35f80891bf47.webp"
width="294"
height="370"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Facets für Zahlen.
&lt;/figcaption>&lt;/figure>
&lt;p>Eine andere Darstellung ist das &amp;ldquo;Scatterplot facet&amp;rdquo;, welches zuerst ein &lt;a href="https://de.wikipedia.org/wiki/Streudiagramm" target="_blank" rel="noopener">Streudiagramm&lt;/a> über alle numerischen Spalten anzeigt (Abbildung 6) und durch Auswahl eines Streudiagramms dieses in die Facet Ansicht übernimmt (Abbildung 7).&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-scatterplots-über-alle-numerischen-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Scatterplots über alle numerischen Spalten." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-all_huaf6d563d6277d1afdafaa72fdb7e9429_15212_8e6e42c8db6ed8c05b3ccd024d7a309c.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-all_huaf6d563d6277d1afdafaa72fdb7e9429_15212_a4fa0641858a082f6129d5fb78b0753b.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-all_huaf6d563d6277d1afdafaa72fdb7e9429_15212_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-all_huaf6d563d6277d1afdafaa72fdb7e9429_15212_8e6e42c8db6ed8c05b3ccd024d7a309c.webp"
width="501"
height="591"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Scatterplots über alle numerischen Spalten.
&lt;/figcaption>&lt;/figure>
&lt;p>In dem Streudiagramm in Abbildung 7 lassen sich auch Werte und Bereiche mit der Maus auswählen und danach filtern.&lt;/p>
&lt;figure id="figure-bildschirmfoto-eines-scatterplots-in-der-facet-ansicht">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto eines Scatterplots in der Facet Ansicht." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-one_hu699ad9181a84fcfbcbd0e8e7fdb09890_7568_c3aec09954d265fab433184d1d0f0c61.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-one_hu699ad9181a84fcfbcbd0e8e7fdb09890_7568_535aa6ae50d4f3ac09fb8c913550716a.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-one_hu699ad9181a84fcfbcbd0e8e7fdb09890_7568_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-scatter-one_hu699ad9181a84fcfbcbd0e8e7fdb09890_7568_c3aec09954d265fab433184d1d0f0c61.webp"
width="297"
height="210"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto eines Scatterplots in der Facet Ansicht.
&lt;/figcaption>&lt;/figure>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> In dem Datensatz gibt es laut Streudiagramm eine Stadt mit einem leichten &amp;ldquo;Männerüberschuss&amp;rdquo;. Um welche Stadt handelt es sich dabei?&lt;/p>
&lt;details class="spoiler " id="spoiler-16">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>Bei der Stadt handelt es sich um Karlsruhe.&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-5-timeline-und-custom-facets">Aufgabe 5: Timeline (und Custom) Facets&lt;/h2>
&lt;p>Es gibt ein separates Timeline Facet, welches auf eine Spalte vom Typ Datum (&amp;ldquo;date&amp;rdquo;) angewendet werden kann.
Wie in Abbildung 8 zu sehen, ist das ähnlich wie beim &amp;ldquo;Numeric facet&amp;rdquo; ein Histogramm, nur dass die Daten auf der X-Achse nach Datum geordnet sind.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-timeline-facet">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des &amp;#39;Timeline facet&amp;#39;." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-timeline_huab5159b19ff462b24c39e95d422a8e1a_5027_fe3e5a359c834200424ea5b28eff5b66.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-timeline_huab5159b19ff462b24c39e95d422a8e1a_5027_5ee51a6615e457f86915c680264daad9.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-timeline_huab5159b19ff462b24c39e95d422a8e1a_5027_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-timeline_huab5159b19ff462b24c39e95d422a8e1a_5027_fe3e5a359c834200424ea5b28eff5b66.webp"
width="294"
height="160"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des &amp;lsquo;Timeline facet&amp;rsquo;.
&lt;/figcaption>&lt;/figure>
&lt;p>Da das bei Jahreszahlen auch recht schnell unübersichtlich wird, können wir so ein Facet auch selbst erstellen.
Wir gehen dazu auf
&amp;ldquo;Urkundlich erwaehnt&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Custome Numeric Facet&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL-Ausdruck um das in Abbildung 9 gezeigte Facet zu erstellen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">datePart&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;year&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-bildschirmfoto-eines-custom-numeric-facet">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto eines &amp;#39;Custom Numeric Facet&amp;#39;." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-custom_hu35842dd8e8809bf3f7054b2c6e4f2aa4_4621_3836c8922a0ebb210796ec0c41555b33.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-custom_hu35842dd8e8809bf3f7054b2c6e4f2aa4_4621_6ea57695d0a51403cc0b38c672862a55.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-custom_hu35842dd8e8809bf3f7054b2c6e4f2aa4_4621_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-numeric-custom_hu35842dd8e8809bf3f7054b2c6e4f2aa4_4621_3836c8922a0ebb210796ec0c41555b33.webp"
width="292"
height="158"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto eines &amp;lsquo;Custom Numeric Facet&amp;rsquo;.
&lt;/figcaption>&lt;/figure>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Erstellen Sie ein Facet mit den Differenzen für &amp;ldquo;weibliche - männliche&amp;rdquo; Bevölkerung.&lt;/p>
&lt;details class="spoiler " id="spoiler-21">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;p>Dafür benötigen wir ein &amp;ldquo;Custom Numeric Facet&amp;rdquo; mit dem folgenden GREL-Ausdruck:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Weibliche Bevoelkerung (2021)&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">-&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Maennliche Bevoelkerung (2021)&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Da wir in dem GREL Ausdruck die Spalten direkt aufrufen, ist es egal von welcher Spalte aus wir das Facet erstellen.&lt;/p>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-6-text-facets">Aufgabe 6: Text Facets&lt;/h2>
&lt;p>Es gibt neben dem &amp;ldquo;normalen&amp;rdquo; Text Facet auch noch weitere Facets zum Umgang mit Text.
In Abbildung 10 sind untereinander das &amp;ldquo;Text length facet&amp;rdquo;, das &amp;ldquo;Log of text length facet&amp;rdquo; und das &amp;ldquo;Unicode char-code facet&amp;rdquo; gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-facets-zu-textlängen-und-dem-unicode-zeichenbereich">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Facets zu Textlängen und dem Unicode Zeichenbereich." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-text_hufdec9d14403abe47bf72cff729c63847_7203_08939bbb71eb51960d8c59c7baa698e2.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-text_hufdec9d14403abe47bf72cff729c63847_7203_6236bd4395a16688faad707094a40e9e.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-text_hufdec9d14403abe47bf72cff729c63847_7203_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-text_hufdec9d14403abe47bf72cff729c63847_7203_08939bbb71eb51960d8c59c7baa698e2.webp"
width="294"
height="372"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Facets zu Textlängen und dem Unicode Zeichenbereich.
&lt;/figcaption>&lt;/figure>
&lt;p>Ziemlich hilfreich bei Texten ist auch das in Abbildung 11 gezeigte &amp;ldquo;Word Facet&amp;rdquo;, welches alle in der Spalte vorkommenden Worte aufzählt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-word-facet">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des &amp;#39;Word facet&amp;#39;." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words_hud6643859f4ac9ce878705b5ed527b7fe_8207_9c82c2a262a62e0ea281bf29cf7ed546.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words_hud6643859f4ac9ce878705b5ed527b7fe_8207_d8260662a8f14438f2194f22143dce9d.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words_hud6643859f4ac9ce878705b5ed527b7fe_8207_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words_hud6643859f4ac9ce878705b5ed527b7fe_8207_9c82c2a262a62e0ea281bf29cf7ed546.webp"
width="291"
height="292"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des &amp;lsquo;Word facet&amp;rsquo;.
&lt;/figcaption>&lt;/figure>
&lt;p>In Abbildung 11 ist zum Beispiel bei &amp;ldquo;erwähnt,&amp;rdquo; zu sehen, dass das normale Wort Facet auch Satzzeichen berücksichtigt.
Möchte man das vermeiden, so kann dies durch einen Klick auf das blaue &amp;ldquo;change&amp;rdquo; im Kopfbereich des Facets angepasst werden.
Wir passen den GREL-Ausdruck wie folgt an und erhalten das in Abbildung 12 gezeigte Facet.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/(?&amp;lt;=[a-z])[,.-]/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39; &amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-bildschirmfoto-des-angepassten-word-facet">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des angepassten &amp;#39;Word facet&amp;#39;." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words-custom_hu485392b8583c1c8fa3886d7282f85979_9964_9c164403c9cadd375e87ca198755752a.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words-custom_hu485392b8583c1c8fa3886d7282f85979_9964_428d13a6e213c7898258fcdd9859f1e3.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words-custom_hu485392b8583c1c8fa3886d7282f85979_9964_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-facets-words-custom_hu485392b8583c1c8fa3886d7282f85979_9964_9c164403c9cadd375e87ca198755752a.webp"
width="293"
height="325"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des angepassten &amp;lsquo;Word facet&amp;rsquo;.
&lt;/figcaption>&lt;/figure>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Erstellen Sie auf der Spalte &amp;ldquo;Kurzbiographie&amp;rdquo; ein Facet, welches alle darin vorkommenden Jahreszahlen darstellt.&lt;/p>
&lt;details class="spoiler " id="spoiler-25">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;p>Dafür benötigen wir ein &amp;ldquo;Custom Text Facet&amp;rdquo; mit dem folgenden GREL-Ausdruck:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\d{3,4}/&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-7-facets-für-reconciliation">Aufgabe 7: Facets für Reconciliation&lt;/h2>
&lt;p>Es gibt spezielle Facets zur Unterstützung von Reconciliation Vorgängen.
Zwei davon (&amp;ldquo;Jugment action type&amp;rdquo; und &amp;ldquo;Best candidate&amp;rsquo;s score&amp;rdquo;) werden automatisch geladen.&lt;/p>
&lt;p>Es können weitere Facets nachgeladen werden.
Dafür starten wir einen Reconciliation Vorgang über
&amp;ldquo;Stadt&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start Reconciling&amp;rdquo;
und verwenden als &amp;ldquo;Service&amp;rdquo; den &amp;ldquo;GND reconciliation for OpenRefine&amp;rdquo; Service von lobid (siehe &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/">06 Reconciling mit OpenRefine und der GND&lt;/a> für die grundlegende Einrichtung und Benutzung des Dienstes).&lt;/p>
&lt;p>Wir suchen nach einem &amp;ldquo;Geografikum&amp;rdquo; und lassen gut passende Treffer automatisch auswählen.
Die Einstellungen sind in Abbildung 13 abgebildet.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-einstellungen-für-den-reconciling-dialog">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Einstellungen für den Reconciling Dialog." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-dialog_hu8757b0071674b685548561bd0d4f44e7_39892_2c56352f8f2098319e16f500492dbde2.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-dialog_hu8757b0071674b685548561bd0d4f44e7_39892_b6a4fd8c8b3541c945e5593fb8831a65.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-dialog_hu8757b0071674b685548561bd0d4f44e7_39892_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-dialog_hu8757b0071674b685548561bd0d4f44e7_39892_2c56352f8f2098319e16f500492dbde2.webp"
width="760"
height="508"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Einstellungen für den Reconciling Dialog.
&lt;/figcaption>&lt;/figure>
&lt;p>Über
&amp;ldquo;Stadt&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Facets&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;rdquo;&amp;hellip;&amp;quot;
können wir dann die restlichen Facets nachladen.&lt;/p>
&lt;h3 id="gruppe-1-entscheidung">Gruppe 1: Entscheidung&lt;/h3>
&lt;ul>
&lt;li>&lt;em>By judgment&lt;/em> (default)&lt;/li>
&lt;li>&lt;em>Jugment action type&lt;/em>&lt;/li>
&lt;li>&lt;em>Jugment action timestamp&lt;/em>&lt;/li>
&lt;/ul>
&lt;figure id="figure-bildschirmfoto-der-ersten-facet-gruppe">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der ersten Facet Gruppe." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-01_hufb43dc021b79d0661277cd65202d17d6_16099_b51356598975812d06162db0c003e7f5.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-01_hufb43dc021b79d0661277cd65202d17d6_16099_92e9345cfbf57a6e68989fbc6acdaf68.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-01_hufb43dc021b79d0661277cd65202d17d6_16099_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-01_hufb43dc021b79d0661277cd65202d17d6_16099_b51356598975812d06162db0c003e7f5.webp"
width="280"
height="466"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der ersten Facet Gruppe.
&lt;/figcaption>&lt;/figure>
&lt;p>In der Gruppe 1 sind Facets zu den getroffenen Entscheidungen zu finden.
Hier kann danach gefiltert werden, ob für eine Zeile schon eine Entscheidung getroffen wurde, ob die Entscheidung automatisch oder manuell getroffen wurde und sogar zu welchem Zeitpunkt (Zeitstempel) die Entscheidung getroffen wurde.&lt;/p>
&lt;h3 id="gruppe-2-treffer">Gruppe 2: Treffer&lt;/h3>
&lt;ul>
&lt;li>&lt;em>Best candidate&amp;rsquo;s score&lt;/em> (default)&lt;/li>
&lt;li>&lt;em>Best candidate&amp;rsquo;s type match&lt;/em>&lt;/li>
&lt;li>&lt;em>Best candidate&amp;rsquo;s name match&lt;/em>&lt;/li>
&lt;/ul>
&lt;figure id="figure-bildschirmfoto-der-zweiten-facet-gruppe">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der zweiten Facet Gruppe." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-02_hu6ba9966f242a4d53cb6b0a5011c0445b_12221_19befeddf21251f62c61e1e742e0ce7a.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-02_hu6ba9966f242a4d53cb6b0a5011c0445b_12221_4b7bc6df19224e1f77d7d3ffef1a95c2.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-02_hu6ba9966f242a4d53cb6b0a5011c0445b_12221_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-02_hu6ba9966f242a4d53cb6b0a5011c0445b_12221_19befeddf21251f62c61e1e742e0ce7a.webp"
width="279"
height="384"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der zweiten Facet Gruppe.
&lt;/figcaption>&lt;/figure>
&lt;p>Die zweite Gruppe bezieht sich auf die Treffer und zwar immer nur auf den &amp;ldquo;besten&amp;rdquo; Treffer.
Hier gibt es das Standard Facet mit der Bewertung des Treffers durch den Reconciliation Service.
Außerdem gibt es noch zwei Facets, welche nützlich sind, wenn man iterativ mehrere Reconciliation Versuche auf einer Spalte durchführt und dabei mit und ohne Typisierung sucht.&lt;/p>
&lt;h3 id="gruppe-3-treffer-ähnlichkeit">Gruppe 3: Treffer Ähnlichkeit&lt;/h3>
&lt;ul>
&lt;li>&lt;em>Best candidate&amp;rsquo;s name edit distance&lt;/em>&lt;/li>
&lt;li>&lt;em>Best candidate&amp;rsquo;s name work similarity&lt;/em>&lt;/li>
&lt;/ul>
&lt;figure id="figure-bildschirmfoto-der-dritten-facet-gruppe">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der dritten Facet Gruppe." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-03_hu8542ba5db7f0697ee778cc6e05462e8b_6595_29c30c443862bff2a50d03cc79e47395.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-03_hu8542ba5db7f0697ee778cc6e05462e8b_6595_7d33090d1ef78b25364a5fbb3531fa15.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-03_hu8542ba5db7f0697ee778cc6e05462e8b_6595_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-03_hu8542ba5db7f0697ee778cc6e05462e8b_6595_29c30c443862bff2a50d03cc79e47395.webp"
width="278"
height="277"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der dritten Facet Gruppe.
&lt;/figcaption>&lt;/figure>
&lt;p>Der Algorithmus zur Auswahl von Treffern durch den Reconciliation Service ist häufig nicht transparent oder direkt nachvollziehbar.
Daher lassen sich in OpenRefine zusätzliche Facets laden, die die Ähnlichkeit des Spalteninhalts mit dem jeweils besten Treffer anzeigen.&lt;/p>
&lt;p>Die Editierdistanz basiert auf der &lt;a href="https://de.wikipedia.org/wiki/Levenshtein-Distanz" target="_blank" rel="noopener">Levenshtein Distanz&lt;/a>, die wir schon in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/05-clustering/">05 Daten mit OpenRefine clustern&lt;/a> kennen gelernt haben. Die &lt;strong>Wortähnlichkeit&lt;/strong> hingegen wird berechnet, indem die Anzahl der übereinstimmenden Wörter &lt;strong>ohne&lt;/strong> Stoppwörter zwischen Zellinhalt und bestem Treffer gezählt und normalisiert wird. Der Wertebereich geht dabei von 0 für keine Ähnlichkeit bis 1 für vollkommene Übereinstimmung.&lt;/p>
&lt;h3 id="gruppe-4-treffer-typ">Gruppe 4: Treffer Typ&lt;/h3>
&lt;ul>
&lt;li>&lt;em>Best candidate&amp;rsquo;s types&lt;/em>&lt;/li>
&lt;/ul>
&lt;figure id="figure-bildschirmfoto-der-vierten-facet-gruppe">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der vierten Facet Gruppe." srcset="
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-04_hu6953efe4de676f06219f247b6b2520fa_6014_95b7bab093e73fe2ae9bf8243059b856.webp 400w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-04_hu6953efe4de676f06219f247b6b2520fa_6014_35aeb03dd0c24cdbaadc46e3366d9c5a.webp 760w,
/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-04_hu6953efe4de676f06219f247b6b2520fa_6014_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/screenshot-openrefine-staedte-reconciling-facets-04_hu6953efe4de676f06219f247b6b2520fa_6014_95b7bab093e73fe2ae9bf8243059b856.webp"
width="292"
height="144"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der vierten Facet Gruppe.
&lt;/figcaption>&lt;/figure>
&lt;p>Die Liste der Typen, die sich aus dem jeweils besten Treffer für die einzelnen Zeilen ergeben.&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Beim Erstellen des Tutorials sind vier Städte automatisch mit einem Treffer gematcht worden. Ein Treffer ist jedoch falsch. Überlegen Sie, mit welcher Facet Kombination Sie diesen falschen Treffer schnell isolieren können.&lt;/p>
&lt;details class="spoiler " id="spoiler-38">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;p>Eine mögliche Kombination wäre im Facet &amp;ldquo;Jugment action type&amp;rdquo; den Wert &lt;em>auto&lt;/em> auszuwählen und im Facet &amp;ldquo;Best candidate’s name edit distance&amp;rdquo; auf eine Distanz größer 1 zu filtern.&lt;/p>
&lt;p>Der falsch zugeordnete Treffer ist dann &amp;ldquo;Freiburg im Breisgau&amp;rdquo;.&lt;/p>
&lt;p>Da sich die Implementierung der Suchstrategie im lobid Reconciliation Server ändern kann, ist es möglich, dass Sie andere Ergebnisse erhalten.&lt;/p>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-8-duplikate">Aufgabe 8: Duplikate&lt;/h2>
&lt;p>Das Duplikate Facet haben wir bewusst übersprungen und an das Ende verschoben.&lt;/p>
&lt;p>Über &amp;ldquo;Urkundlich erwaehnt&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Customized facets&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Duplicates facet&amp;rdquo; können wir uns Zeilen anzeigen lassen, deren Werte mehr als einmal vorkommen.
Wir können hier aber keine Duplikate auswählen, markieren oder wie beim Clustern mit Ungenauigkeiten arbeiten.&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Überlegen Sie sich, wo das Duplikate Facet sinnvoll eingesetzt werden kann.&lt;/p>
&lt;details class="spoiler " id="spoiler-42">
&lt;summary>&lt;strong>Mögliche Lösung:&lt;/strong>&lt;/summary>
&lt;p>Im FDMLab nutzen wir das Facet zur schnellen Überprüfung, ob zum Beispiel eine ID-Spalte nur eindeutige Werte beinhaltet.&lt;/p>
&lt;/details>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Mit Facets können wir uns durch die Daten filtern, sie für die explorative Datenanalyse verwenden oder beim Data Cleaning zu bearbeitende Gruppen identifizieren und diese gesammelt korrigieren.
Mit einem Grundverständnis von GREL können wir uns selbst Facets programmieren oder den Code der voreingestellten Facets anpassen.
In Kombination mit regulären Ausdrücken können wir auf spezifischen Mustern basierende Facets erstellen.&lt;/p>
&lt;p>Da die Facets nicht selbst benannt werden können, gibt es jedoch das Risiko, sich in seinen eigenen Filtern zu verlaufen.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns mit dem Import und Export von XML in OpenRefine.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren" class="btn btn-primary px-3 py-3">14 XML importieren und exportieren&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Erweiterter GND Abgleich mit lobid</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/</guid><description>&lt;p>In diesem Tutorial vertiefen wir den Abgleich von Daten mit der GND über das lobid API.&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>Reconciling in der &lt;a href="https://docs.openrefine.org/manual/reconciling" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;br>
OpenRefine API in der &lt;a href="https://lobid.org/gnd/api#openrefine" target="_blank" rel="noopener">lobid API Dokumentation&lt;/a>.&lt;br>
GND reconciliation (advanced) im &lt;a href="https://blog.lobid.org/2019/09/30/openrefine-examples.html" target="_blank" rel="noopener">lobid Blog&lt;/a>.&lt;br>
Komplexe Suchanfragen im &lt;a href="https://blog.lobid.org/2018/07/06/lobid-gnd-queries.html" target="_blank" rel="noopener">lobid Blog&lt;/a>.&lt;br>
Query string syntax in der &lt;a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#query-string-syntax" target="_blank" rel="noopener">Elasticsearch Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;p>Das von lobid zur Verfügung gestellte API zur Nutzung der Gemeinsamen Normdatei (GND) verwendet unter der Haube die &lt;a href="https://www.elastic.co/de/elasticsearch/" target="_blank" rel="noopener">Suchtechnologie Elasticsearch&lt;/a>.
Wie andere Suchmaschinen kennt auch Elasticsearch Möglichkeiten eine Suchanfrage zu präzisieren.
Durch Verwendung von besonderen Zeichen (Operatoren) können sehr komplexe Suchanfragen gestellt werden.&lt;/p>
&lt;p>Die genauen Details sind unter &lt;a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#query-string-syntax" target="_blank" rel="noopener">Query string syntax&lt;/a> in der Elasticsearch Dokumentation zu finden.
Es sind bei dem lobid API jedoch nicht alle Features der &amp;ldquo;Abfragesprache&amp;rdquo; aktiviert.
Im Zweifel die entsprechenden Operatoren erst einmal an einem Beispiel ausprobieren.&lt;/p>
&lt;h2 id="aufgabe-1-operatoren-in-der-weboberfläche">Aufgabe 1: Operatoren in der Weboberfläche&lt;/h2>
&lt;p>Wir führen die Operatoren zur Verbesserung der Suchergebnisse an (Such-)Beispielen ein, welche wir Stück für Stück weiter entwickeln.
Da sich sowohl die Inhalte der GND, als auch die Algorithmen von Elasticsearch immer wieder ändern, ist es möglich, dass sich die Ergebnisse zu einem späteren Zeitpunkt von den hier beschriebenen unterscheiden.&lt;/p>
&lt;h3 id="beispiel-1-maria-oder-marie">Beispiel 1: Maria oder Marie?&lt;/h3>
&lt;p>Wir suchen eine Frau mit Vornamen &lt;code>Maria&lt;/code> oder &lt;code>Marie&lt;/code> und lernen dabei einige Sprachbestandteile kennen, mit denen wir die Suche in der GND via der lobid Weboberfläche einschränken können.
Die Links verweisen zum Ergebnis in der lobid Weboberfläche.&lt;/p>
&lt;p>&lt;strong>Versuch 1:&lt;/strong> &lt;a href="https://lobid.org/gnd/search?q=Maria&amp;#43;Marie" target="_blank" rel="noopener">Maria Marie&lt;/a>.&lt;/p>
&lt;p>Diese Anfrage macht jetzt nicht das, was wir (vielleicht) erwarten würden.
Mit dieser Anfrage wird nach Einträgen gesucht, die sowohl Maria als auch Marie beinhalten (&lt;code>Maria AND Marie&lt;/code>).
Die Verknüpfung via &lt;code>AND&lt;/code> ist die Standardeinstellung.
Dies können wir für unsere Anfrage anpassen, indem wir boolsche Operatoren wie &lt;code>AND&lt;/code>, &lt;code>OR&lt;/code> und &lt;code>NOT&lt;/code> explizit verwenden.&lt;/p>
&lt;p>&lt;strong>Versuch 2:&lt;/strong> &lt;a href="https://lobid.org/gnd/search?q=Maria&amp;#43;OR&amp;#43;Marie" target="_blank" rel="noopener">Maria OR Marie&lt;/a>&lt;/p>
&lt;p>Nun finden wir sowohl Personen mit Vornamen Maria, als auch mit Vornamen Marie.
Aber auch viele andere Ergebnisse, wie zum Beispiel Lieder mit dem Titel &amp;ldquo;Maria&amp;rdquo;.
Wir benötigen also weitere Einschränkungen für die mehr als 100.000 Treffer.&lt;/p>
&lt;p>&lt;strong>Versuch 3:&lt;/strong> &lt;a href="https://lobid.org/gnd/search?q=%28Maria&amp;#43;OR&amp;#43;Marie%29&amp;#43;AND&amp;#43;dateOfBirth%3A%5B1850&amp;#43;TO&amp;#43;1875%5D" target="_blank" rel="noopener">(Maria OR Marie) AND dateOfBirth:[1850 TO 1875]&lt;/a>&lt;/p>
&lt;p>Wir wissen, dass die Person zwischen 1850 und etwa 1875 geboren wurde.
Das können wir mit einer &lt;em>Range-Query&lt;/em> auf dem Feld &lt;code>dateOfBirth&lt;/code> durchführen.
Bitte auch die Klammerung beim ersten Ausdruck &lt;code>(Maria OR Marie)&lt;/code> und die Verknüpfung mit &lt;code>AND&lt;/code> beachten!
Ein weiterer Vorteil einer Einschränkung über das Feld &lt;code>dateOfBirth&lt;/code> ist, dass wir uns die zusätzliche Einschränkung auf &lt;code>type:Person&lt;/code> sparen, da in der GND hauptsächlich Personen ein Geburtsdatum haben.&lt;/p>
&lt;p>&lt;strong>Versuch 4:&lt;/strong> &lt;a href="https://lobid.org/gnd/search?q=%28Maria&amp;#43;OR&amp;#43;Marie%29&amp;#43;AND&amp;#43;dateOfBirth%3A%5B1850&amp;#43;TO&amp;#43;1875%5D&amp;#43;AND&amp;#43;dateOfDeath%3A%3C1939" target="_blank" rel="noopener">(Maria OR Marie) AND dateOfBirth:[1850 TO 1875] AND dateOfDeath:&amp;lt;1939&lt;/a>&lt;/p>
&lt;p>Wir wissen außerdem, dass die Person den Ersten Weltkrieg erlebt hat, den Zweiten jedoch nicht.
Das könnten wir wieder über eine &lt;em>Range-Query&lt;/em> abbilden: &lt;code>[1918-11-11 TO 1939-01-01}&lt;/code>.
Geschweifte Klammern &lt;code>{&lt;/code>, &lt;code>}&lt;/code> zeigen dabei an, dass der entsprechende Wert nicht in den Bereich eingeschlossen wird.
Also &lt;code>[2000 TO 2022]&lt;/code> hat die gleiche Bedeutung wie &lt;code>{1999 TO 2023}&lt;/code>.
Wir haben für den Ausdruck stattdessen einen der Vergleichsoperatoren &lt;code>&amp;lt;&lt;/code>, &lt;code>&amp;lt;=&lt;/code>, &lt;code>&amp;gt;&lt;/code>, &lt;code>&amp;gt;=&lt;/code> verwendet.&lt;/p>
&lt;p>&lt;strong>Versuch 5:&lt;/strong> &lt;a href="https://lobid.org/gnd/search?q=%28Maria&amp;#43;OR&amp;#43;Marie%29&amp;#43;AND&amp;#43;dateOfBirth%3A%5B1850&amp;#43;TO&amp;#43;1875%5D&amp;#43;AND&amp;#43;dateOfDeath%3A%3C1939&amp;#43;AND&amp;#43;placeOfBirth%3AWarschau" target="_blank" rel="noopener">(Maria OR Marie) AND dateOfBirth:[1850 TO 1875] AND dateOfDeath:&amp;lt;1939 AND placeOfBirth:Warschau&lt;/a>&lt;/p>
&lt;p>Wir wissen, dass die Person in Warschau geboren wurde.
Die Anfrage liefert aber keine Ergebnisse.
Das liegt daran, dass der Geburtsort nicht mit einem Wert, sondern mit einem anderen Objekt in der GND verknüpft ist.
Eine Möglichkeit trotzdem ein Ergebnis zu bekommen ist mit &lt;code>placeOfBirth.\*:Warschau&lt;/code> alle Felder des verknüpften Objektes zu durchsuchen.&lt;/p>
&lt;p>Die präzisere Variante ist die GND-Nummer des Ortes zu verwenden.
Diese wird dann in Anführungsstriche &lt;code>&amp;quot;...&amp;quot;&lt;/code> gesetzt, da wir hier eine exakte Phrasensuche durchführen.&lt;/p>
&lt;p>&lt;strong>Versuch 6:&lt;/strong> &lt;a href="https://lobid.org/gnd/search?q=%28Maria&amp;#43;OR&amp;#43;Marie%29&amp;#43;AND&amp;#43;dateOfBirth%3A%5B1850&amp;#43;TO&amp;#43;1875%5D&amp;#43;AND&amp;#43;dateOfDeath%3A%3C1939&amp;#43;AND&amp;#43;placeOfBirth.id%3A%22https%3A%2F%2Fd-nb.info%2Fgnd%2F4079048-4%22" target="_blank" rel="noopener">(Maria OR Marie) AND dateOfBirth:[1850 TO 1875] AND dateOfDeath:&amp;lt;1939 AND placeOfBirth.id:&amp;ldquo;https://d-nb.info/gnd/4079048-4&amp;rdquo;&lt;/a>&lt;/p>
&lt;p>Es ist inzwischen klar, dass wir nach &lt;a href="https://lobid.org/gnd/118523023" target="_blank" rel="noopener">Marie Curie&lt;/a> suchen.
Zur Übung nehmen wir jedoch noch eine weitere Einschränkung vor: Wir wissen, dass die Person eine Naturwissenschaftlerin war.
Entweder Chemikerin, oder Physikerin oder beides.&lt;/p>
&lt;p>Die Berufe sind ebenfalls als Objekte verknüpft über &lt;code>professionOrOccupation&lt;/code> und können mit &lt;code>OR&lt;/code> verknüpft mit in die Anfrage aufgenommen werden.&lt;/p>
&lt;p>&lt;strong>Bonusversuch 7:&lt;/strong> &lt;a href="https://lobid.org/gnd/search?q=%28Maria&amp;#43;OR&amp;#43;Marie%29&amp;#43;AND&amp;#43;dateOfBirth%3A%5B1850&amp;#43;TO&amp;#43;1875%5D&amp;#43;AND&amp;#43;dateOfDeath%3A%3C1939&amp;#43;AND&amp;#43;placeOfBirth.id%3A%22https%3A%2F%2Fd-nb.info%2Fgnd%2F4079048-4%22&amp;#43;AND&amp;#43;professionOrOccupation.id%3A%28%22https%3A%2F%2Fd-nb.info%2Fgnd%2F4219058-7%22&amp;#43;OR&amp;#43;%22https%3A%2F%2Fd-nb.info%2Fgnd%2F4337175-9%22&amp;#43;OR&amp;#43;%22https%3A%2F%2Fd-nb.info%2Fgnd%2F4202451-1%22%29" target="_blank" rel="noopener">(Maria OR Marie) AND dateOfBirth:[1850 TO 1875] AND dateOfDeath:&amp;lt;1939 AND placeOfBirth.id:&amp;ldquo;https://d-nb.info/gnd/4079048-4&amp;rdquo; AND professionOrOccupation.id:(&amp;ldquo;https://d-nb.info/gnd/4219058-7&amp;rdquo; OR &amp;ldquo;https://d-nb.info/gnd/4337175-9&amp;rdquo; OR &amp;ldquo;https://d-nb.info/gnd/4202451-1&amp;rdquo;)&lt;/a>&lt;/p>
&lt;p>Das ist ein Beispiel, wie die unterschiedlichen Anforderungen einer Personenrecherche in die &amp;ldquo;Suchsprache&amp;rdquo; von lobid-gnd/Elasticsearch übertragen werden können. Es gibt noch weitere Operatoren, die nicht mehr in das obige Beispiel reingepasst haben.&lt;/p>
&lt;h3 id="beispiel-2-das-nicht">Beispiel 2: Das &lt;strong>nicht&lt;/strong>&lt;/h3>
&lt;p>Manchmal kommt es vor, dass die Ergebnisse von nicht gesuchten Einträgen überschwemmt werden.
So gibt es für die Suchanfrage &lt;a href="https://lobid.org/gnd/search?q=Freiburg" target="_blank" rel="noopener">Freiburg&lt;/a> tausende Ergebnisse aus allen Kategorien.
Ein typisches Vorgehen ist, die Anfrage auf einen bestimmten Entitätstyp einzuschränken &lt;a href="https://lobid.org/gnd/search?q=Freiburg&amp;#43;AND&amp;#43;type%3APlaceOrGeographicName" target="_blank" rel="noopener">Freiburg AND type:PlaceOrGeographicName&lt;/a>.&lt;/p>
&lt;p>Neben einschränkenden Filtern gibt es auch ausschließende. So können wir in der Anfrage mit &lt;code>NOT&lt;/code> alle Einträge mit Freibug ausschließen, die in Baden-Württemberg vorkommen: &lt;a href="https://lobid.org/gnd/search?q=Freiburg&amp;#43;AND&amp;#43;type%3APlaceOrGeographicName&amp;#43;AND&amp;#43;NOT&amp;#43;geographicAreaCode.id%3A%22https%3A%2F%2Fd-nb.info%2Fstandards%2Fvocab%2Fgnd%2Fgeographic-area-code%23XA-DE-BW%22" target="_blank" rel="noopener">Freiburg AND type:PlaceOrGeographicName AND NOT geographicAreaCode.id:&amp;ldquo;https://d-nb.info/standards/vocab/gnd/geographic-area-code#XA-DE-BW&amp;rdquo;&lt;/a>.&lt;/p>
&lt;p>Wir können auch mit &lt;code>+&lt;/code> und &lt;code>-&lt;/code> betonen welche Begriffe wir explizit suchen bzw. ausschließen: &lt;a href="https://lobid.org/gnd/search?q=%2BFreiburg&amp;#43;AND&amp;#43;type%3APlaceOrGeographicName&amp;#43;AND&amp;#43;-Breisgau" target="_blank" rel="noopener">+Freiburg AND type:PlaceOrGeographicName AND -Breisgau&lt;/a>.&lt;/p>
&lt;h3 id="beispiel-3-ungenaue-suche">Beispiel 3: Ungenaue Suche&lt;/h3>
&lt;p>Manchmal kennen wir die genaue Schreibweise eines Namens nicht, oder es gibt mehrere Varianten.
Zum Glück ist die GND üblicherweise sehr großzügig alternative Schreibweisen eines Namens zu listen, so dass mit dem Suchbegriff &lt;a href="https://lobid.org/gnd/search?q=Tschaikowski" target="_blank" rel="noopener">Tschaikowski&lt;/a> auch der gesuchte Komponist &lt;a href="https://lobid.org/gnd/118638157" target="_blank" rel="noopener">Čajkovskij&lt;/a> zu finden ist.&lt;/p>
&lt;p>Bei weniger bekannten Personen, oder unpraktischen OCR- oder Tippfehlern ist das komplizierter.
Zum Beispiel gibt es zum Zeitpunkt des Schreibens dieses Tutorials für &lt;a href="https://lobid.org/gnd/search?q=Eleonore&amp;#43;Prockaska" target="_blank" rel="noopener">Eleonore Prockaska&lt;/a> keine Treffer. Mit dem Unschärfeoperator &lt;code>~&lt;/code> und einer Distanz von &lt;code>1&lt;/code> &lt;a href="https://lobid.org/gnd/search?q=Eleonore&amp;#43;Prockaska%7E1" target="_blank" rel="noopener">Eleonore Prockaska~1&lt;/a> finden wir die gesuchte &lt;a href="https://lobid.org/gnd/13305506X" target="_blank" rel="noopener">Elenonore Prochaska&lt;/a> auf Anhieb.&lt;/p>
&lt;p>Ebenfalls hilfreich bei ungenauen Suchen sind die Operatoren &lt;code>?&lt;/code> für ein unbekanntes Zeichen und &lt;code>*&lt;/code> für möglicherweise mehrere unbekannte Zeichen.
Beispielsweise findet die Anfrage &lt;a href="https://lobid.org/gnd/search?q=Winfried&amp;#43;Kretschmann&amp;#43;dateOfBirth%3A1948" target="_blank" rel="noopener">Winfried Kretschmann AND dateOfBirth:1948&lt;/a> keine Ergebnisse, da bei &lt;a href="https://lobid.org/gnd/143926683" target="_blank" rel="noopener">Winfried Kretschmann&lt;/a> das Geburtsdatum komplett (1948-05-17) angegeben ist. Mit dem Operator &lt;code>*&lt;/code> in der Anfrage &lt;a href="https://lobid.org/gnd/search?q=Winfried&amp;#43;Kretschmann&amp;#43;dateOfBirth%3A1948*" target="_blank" rel="noopener">Winfried Kretschmann AND dateOfBirth:1948*&lt;/a> lässt sich das kompensieren.&lt;/p>
&lt;h3 id="übersicht-über-die-operatoren">Übersicht über die Operatoren&lt;/h3>
&lt;p>Es gibt noch mehr Operatoren, die wir hier nicht am Beispiel besprochen haben.
Dazu gehört die exakte Phrasensuche mit &lt;code>&amp;quot;...&amp;quot;&lt;/code> und das Boosting von einzelnen Begriffen mit &lt;code>...^5&lt;/code>.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Operatoren&lt;/th>
&lt;th>Beispiel&lt;/th>
&lt;th>Bedeutung&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>[&lt;/code>, &lt;code>]&lt;/code>&lt;/td>
&lt;td>&lt;code>[1939-09-01 TO 1945-09-02]&lt;/code>&lt;/td>
&lt;td>Einschließende &amp;ldquo;Range-Query&amp;rdquo;.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>{&lt;/code>, &lt;code>}&lt;/code>&lt;/td>
&lt;td>&lt;code>{0 TO 100}&lt;/code>&lt;/td>
&lt;td>Ausschließende &amp;ldquo;Range-Query&amp;rdquo; (1-99).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>&amp;gt;&lt;/code>, &lt;code>&amp;gt;=&lt;/code>, &lt;code>&amp;lt;&lt;/code>, &lt;code>&amp;lt;=&lt;/code>&lt;/td>
&lt;td>&lt;code>&amp;lt;2000&lt;/code>&lt;/td>
&lt;td>Offene Einschränkung auf Bereiche.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>AND&lt;/code>, &lt;code>OR&lt;/code>, &lt;code>NOT&lt;/code>, &lt;code>(&lt;/code>, &lt;code>)&lt;/code>&lt;/td>
&lt;td>&lt;code>(a OR b) AND NOT c&lt;/code>&lt;/td>
&lt;td>Boolsche Operatoren und Gruppierungen.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>+&lt;/code>, &lt;code>-&lt;/code>&lt;/td>
&lt;td>&lt;code>+Hund -Katze&lt;/code>&lt;/td>
&lt;td>Begriffe explizit ein- bzw. ausschließen.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>~&lt;/code>, &lt;code>~3&lt;/code>&lt;/td>
&lt;td>&lt;code>unschraf~2&lt;/code>&lt;/td>
&lt;td>Unscharfe Suche mit erlaubtem Abstand.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>&amp;quot;...&amp;quot;&lt;/code>&lt;/td>
&lt;td>&lt;code>&amp;quot;des Pudels Kern&amp;quot;&lt;/code>&lt;/td>
&lt;td>Exakte Suche (Phrasensuche).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>&amp;quot;...&amp;quot;~3&lt;/code>&lt;/td>
&lt;td>&lt;code>&amp;quot;des Pudels Kern&amp;quot;~3&lt;/code>&lt;/td>
&lt;td>Unscharfe Suche in Phrase.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>^&lt;/code>&lt;/td>
&lt;td>&lt;code>Wichtig^5&lt;/code>&lt;/td>
&lt;td>Boosting/Gewichtung einzelner Suchbegriffe.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>?&lt;/code>&lt;/td>
&lt;td>&lt;code>M?ier&lt;/code>&lt;/td>
&lt;td>Ein unbekannter Buchstabe.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>*&lt;/code>&lt;/td>
&lt;td>&lt;code>Politik*&lt;/code>&lt;/td>
&lt;td>Kein/mehrere unbekannte Buchstaben.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>:&lt;/code>&lt;/td>
&lt;td>&lt;code>type:Person&lt;/code>&lt;/td>
&lt;td>Suche in bestimmten Feldern.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>_exists_&lt;/code>&lt;/td>
&lt;td>&lt;code>_exists_:dateOfBirth&lt;/code>&lt;/td>
&lt;td>Nur Einträge mit Geburtsdatum.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>feld.\*&lt;/code>&lt;/td>
&lt;td>&lt;code>hasBirthPlace.\*:Warschau&lt;/code>&lt;/td>
&lt;td>Geburtsort mit Warschau in beliebigem Feld.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="aufgabe-2-nutzung-in-openrefine">Aufgabe 2: Nutzung in OpenRefine&lt;/h2>
&lt;p>Über das Reconciliation API für OpenRefine funktioniert die Nutzung der Operatoren für die Suche ähnlich.
Wir wählen eine Spalte aus, deren Daten wir an den Reconciliation Service übermitteln wollen.
Für diese Spalte können wir in dem in Abbildung 1 abgebildeten Dialog anschließend eine Typeinschränkung vornehmen.
In der rechten Spalte können wir zusätzlich die Inhalte weiterer Spalten mit Feldern in der GND verknüpfen und mit übermitteln.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-reconciliation-dialogs-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Reconciliation Dialogs in OpenRefine." srcset="
/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-dialog_huced79df3f49bec1b72c3454a39aafc69_29684_8ef9af7561646e8a40bf5e996e31d0e3.webp 400w,
/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-dialog_huced79df3f49bec1b72c3454a39aafc69_29684_aa8aec2d9739a0ccc13724a873dada32.webp 760w,
/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-dialog_huced79df3f49bec1b72c3454a39aafc69_29684_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-dialog_huced79df3f49bec1b72c3454a39aafc69_29684_8ef9af7561646e8a40bf5e996e31d0e3.webp"
width="760"
height="510"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Reconciliation Dialogs in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Das schauen wir uns direkt in OpenRefine an und laden dafür die folgende Datei in ein Projekt.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/15_kretschmann-kabinett-iii-mit-fehlern.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kretschmann Kabinett III mit Fehlern&lt;/a>
&lt;p>In dieser Datei ist das Kabinett Kretschmann III.
Wie in Abbildung 2 zu erkennen, sind die Namen mit OCR üblichen Fehlern versehen.
Wir ignorieren die Spalte &amp;ldquo;GND-ID&amp;rdquo;, mit der wir die Namen sofort wieder korrekt aus der GND nachladen könnten.
Diese Spalte benötigen wir später zur schnellen Überprüfung der Ergebnisse. Unser Szenario lautet daher: Wir haben eine Liste mit Namen, deren genaue Schreibweise wir nicht kennen, können diese Namen für den Abgleich jedoch mit einem ungefähren Geburtsdatum und einem Geburtsort ergänzen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-direkt-nach-dem-import">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes direkt nach dem Import." srcset="
/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-datenset_huebcf56212d057c6a25197604ef4d79f8_24387_aac9bee388070d6f7f4070b5a6e5d5b9.webp 400w,
/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-datenset_huebcf56212d057c6a25197604ef4d79f8_24387_f9ec8a4bb4d1fad7d4098577330780b1.webp 760w,
/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-datenset_huebcf56212d057c6a25197604ef4d79f8_24387_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-datenset_huebcf56212d057c6a25197604ef4d79f8_24387_aac9bee388070d6f7f4070b5a6e5d5b9.webp"
width="600"
height="325"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes direkt nach dem Import.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="transformation-1-name-fuzzy">Transformation 1: Name fuzzy&lt;/h3>
&lt;p>Zuerst wollen wir dem lobid GND Reconciliation Service mitteilen, dass die Begriffe in der Spalte potentiell fehlerhaft sind.
Dafür haben wir in Aufgabe 1 den Fuzzy-Operator &lt;code>~&lt;/code> kennen gelernt.
Wir transformieren also die Spalte via
&amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
und fügen mit dem folgenden GREL Ausdruck zu jedem Wort &lt;code>~3&lt;/code> hinzu.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;~3&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="transformation-2-geburtsdatum-reduzieren">Transformation 2: Geburtsdatum reduzieren&lt;/h3>
&lt;p>Bei den Geburtsdaten ist in der GND manchmal das komplette Geburtsdatum angegeben, manchmal aber auch nur das Geburtsjahr.
Sollten unsere Daten genauer sein, als die in der GND, also wir das komplette Geburtsdatum haben, die GND aber nur das Geburtsjahr, oder umgekehrt, dann würden wir mit der Spalte Geburtsdatum richtige Treffer ausschließen.&lt;/p>
&lt;p>Daher nehmen wir nur das Geburts&lt;strong>jahr&lt;/strong> und ergänzen das Wildcard-Zeichen &lt;code>*&lt;/code> via
&amp;ldquo;Geburtsdatum&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
und dem folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;-&amp;#34;&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;*&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="transformation-3-geburtsort-ergänzen">Transformation 3: Geburtsort ergänzen&lt;/h3>
&lt;p>Über den lobid GND Reconciliation Service können wir auch direkt verknüpfte Objekte durchsuchen.
Wir könnten im Reconciliation Dialog also direkt die Spalte &amp;ldquo;Geburtsort&amp;rdquo; mit der Eigenschaft &amp;ldquo;Geburtsort&amp;rdquo; in der GND verknüpfen.&lt;/p>
&lt;p>Da wir die noch präzisere GND-ID des Geburtsortes haben, verwenden wir diese für unseren Abgleich.
Dafür muss die Spalte noch mit dem Präfix &lt;code>https://d-nb.info/gnd/&lt;/code> ergänzt werden.
Das funktioniert über
&amp;ldquo;Geburtsort (GND-ID)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
und dem folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;https://d-nb.info/gnd/&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">value&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die für den Reconciliation Vorgang umgewandelten Spalten sind in Abbildung 3 abgebildet.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-nach-den-transformationen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes nach den Transformationen." srcset="
/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-datenset-modified_hue3b001b1aeae5cf1a1be814852903a66_26680_2c7978826d1bd4a16c105acc8c5c6612.webp 400w,
/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-datenset-modified_hue3b001b1aeae5cf1a1be814852903a66_26680_4b1229418db49307c7af1d942ab7ba5c.webp 760w,
/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-datenset-modified_hue3b001b1aeae5cf1a1be814852903a66_26680_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-datenset-modified_hue3b001b1aeae5cf1a1be814852903a66_26680_2c7978826d1bd4a16c105acc8c5c6612.webp"
width="485"
height="324"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes nach den Transformationen.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="abgleich-durchführen">Abgleich durchführen&lt;/h3>
&lt;p>Den Reconciliation Vorgang starten wir mit
&amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo;
und den in Abbildung 4 gezeigten Einstellungen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-einstellungen-für-den-reconciliation-dialog">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Einstellungen für den Reconciliation Dialog." srcset="
/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-dialog-settings_hua6951dc4ac8f9d05ca8937eff804199a_31297_d86b1fca3e4fa2a1dc9dae615387cdaf.webp 400w,
/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-dialog-settings_hua6951dc4ac8f9d05ca8937eff804199a_31297_d1041910f8813041684436cf6b50e041.webp 760w,
/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-dialog-settings_hua6951dc4ac8f9d05ca8937eff804199a_31297_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/screenshot-openrefine-lobid-gnd-dialog-settings_hua6951dc4ac8f9d05ca8937eff804199a_31297_d86b1fca3e4fa2a1dc9dae615387cdaf.webp"
width="760"
height="508"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Einstellungen für den Reconciliation Dialog.
&lt;/figcaption>&lt;/figure>
&lt;p>Durch die ergänzenden Spalten konnten bei unserem Experiment schon 11 von 13 Politikern mit hoher Konfidenz automatisch gematcht werden.
Die restlichen Kandidaten &lt;em>matchen&lt;/em> wir automatisch via
&amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Actions&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Match each cell to its best candidate&amp;rdquo;.&lt;/p>
&lt;p>Um die Überprüfung der Ergebnisse automatisch vorzunehmen, speichern wir uns die GND-ID der vom Reconciliation Service gefundenen Treffer in einer neuen Spalte &amp;ldquo;Abgleich&amp;rdquo; über
&amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;rdquo;
und vergleichen sie dort direkt mit der Original &amp;ldquo;GND-ID&amp;rdquo; Spalte mit dem folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">cell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">recon&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">match&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;GND-ID&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Bei unserem Experiment waren alle Treffer korrekt (&lt;code>true&lt;/code>).&lt;/p>
&lt;h3 id="weitere-operationen">Weitere Operationen&lt;/h3>
&lt;p>Mit ähnlichen Transformationen können wir zum Beispiel auch &amp;ldquo;Range-Queries&amp;rdquo; oder andere Operatoren wie &lt;code>AND&lt;/code>, &lt;code>OR&lt;/code>, &amp;hellip; erzeugen.&lt;/p>
&lt;p>&lt;del>Jedoch gibt es mit manchen Operatoren (&lt;code>+&lt;/code>, &lt;code>-&lt;/code>, &lt;code>^&lt;/code>, &lt;code>&amp;gt;&lt;/code>, &lt;code>&amp;lt;&lt;/code>, &lt;code>&amp;gt;=&lt;/code>, &lt;code>&amp;lt;=&lt;/code>) aktuell ein Problem, da sie von dem lobid GND Reconciliation API gefiltert und nicht an Elasticsearch weitergegeben werden.&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>
Daher benötigen wir zur Verwendung dieser Operatoren aktuell einen Workaround.&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>&lt;/del>&lt;/p>
&lt;p>&lt;del>Bei Anfragen an das lobid GND Reconciliation API mit Gruppierungen wie &lt;code>(... OR ...)&lt;/code> werden die oben genannten Operatoren &lt;strong>nicht&lt;/strong> gefiltert. Wir können in OpenRefine also die Anfrage &lt;code>&amp;lt;1939&lt;/code> umwandeln in &lt;code>(&amp;lt;1939 OR &amp;lt;1939)&lt;/code> oder anstatt &lt;code>+Freiburg -Breisgau&lt;/code> können wir explizit &lt;code>(+Freiburg AND -Breisgau)&lt;/code> verwenden.&lt;/del>&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
&lt;strong>Update 15. Juni 2022&lt;/strong>: Der beschriebene Workaround ist mit der Umsetzung von &lt;a href="https://github.com/hbz/lobid-gnd/issues/309" target="_blank" rel="noopener">Use ElasticSearch validation endpoint to check queries before executing them&lt;/a> nicht mehr notwendig.
&lt;/div>
&lt;/div>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Mit dem GND Reconciliation API als Aufbau auf die Suchtechnologie Elasticsearch verbindet die lobid Daten in OpenRefine mit den Daten der Gemeinsamen Normdatei.
Die von Elasticsearch unterstützten Operatoren zur Einschränkung und Verbesserung der Suchergebnisse sind insbesondere beim Abgleich von großen Datenmengen ein sehr wertvolles Mittel, um auch für große Datenmengen eine übersichtliche Menge an idealerweise passenden Treffern automatisch zu ermitteln.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns mit dem erweiterten Datenabgleich zwischen OpenRefine und Wikidata.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata" class="btn btn-primary px-3 py-3">16 Erweiterter Abgleich mit Wikidata&lt;/a>
&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Siehe &lt;a href="https://github.com/hbz/lobid-gnd/issues/304" target="_blank" rel="noopener">Using range query parameter via OpenRefine Reconciliation&lt;/a> auf GitHub.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>Eine Lösung ist mit &lt;a href="https://github.com/hbz/lobid-gnd/issues/309" target="_blank" rel="noopener">Use ElasticSearch validation endpoint to check queries before executing them&lt;/a> in Arbeit.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Workshop - XML in OpenRefine importieren und exportieren</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/</guid><description>&lt;p>In diesem Tutorial beschäftigen wir uns mit dem Laden von XML in OpenRefine und dem Exportieren nach XML mit Templating.&lt;/p>
&lt;h2 id="einführung">Einführung&lt;/h2>
&lt;blockquote>
&lt;p>Templating in der &lt;a href="https://docs.openrefine.org/manual/exporting#templating-exporter" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;br>
Templating im &lt;a href="https://github.com/OpenRefine/OpenRefine/wiki/Recipes#12-templating-exporter" target="_blank" rel="noopener">OpenRefine Wiki&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;p>Die als &lt;a href="https://de.wikipedia.org/wiki/Extensible_Markup_Language" target="_blank" rel="noopener">XML&lt;/a> abgekürzte &amp;ldquo;Extensible Markup Language&amp;rdquo; kann sehr komplexe Datenformate abbilden. Von Textdokumenten über Grafikdaten zu Geodaten.
Im GLAM Bereich begegnet uns XML in Standards wie
&lt;a href="https://de.wikipedia.org/wiki/Encoded_Archival_Description" target="_blank" rel="noopener">EAD&lt;/a>,
&lt;a href="https://de.wikipedia.org/wiki/Metadata_Encoding_%26_Transmission_Standard" target="_blank" rel="noopener">METS&lt;/a>,
&lt;a href="https://de.wikipedia.org/wiki/Metadata_Object_Description_Schema" target="_blank" rel="noopener">MODS&lt;/a>,
&lt;a href="https://de.wikipedia.org/wiki/Records_in_Contexts" target="_blank" rel="noopener">RiC&lt;/a>,
&lt;a href="https://de.wikipedia.org/wiki/Text_Encoding_Initiative" target="_blank" rel="noopener">TEI&lt;/a>,
usw.&lt;/p>
&lt;p>Zur Abbildung der komplexen Strukturen in XML verwendet OpenRefine die im Workshop schon besprochenen &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/">Records&lt;/a>.
Damit können aber nur baumartige Strukturen abgebildet werden und keine komplexen Netzwerke.&lt;/p>
&lt;p>Um zu verstehen, wie OpenRefine XML einliest und ausgeben kann, verwenden wir exemplarisch ein einfaches Format.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;kabinett&lt;/span> &lt;span class="na">title=&lt;/span>&lt;span class="s">&amp;#34;Kretschmann III&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;person&lt;/span> &lt;span class="na">gnd-id=&lt;/span>&lt;span class="s">&amp;#34;143926683&amp;#34;&lt;/span> &lt;span class="na">sex=&lt;/span>&lt;span class="s">&amp;#34;m&amp;#34;&lt;/span> &lt;span class="na">birthday=&lt;/span>&lt;span class="s">&amp;#34;1948-05-17&amp;#34;&lt;/span> &lt;span class="na">birthplace=&lt;/span>&lt;span class="s">&amp;#34;Spaichingen&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>Kretschmann, Winfried&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;links&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;link&amp;gt;&lt;/span>http://dbpedia.org/resource/Winfried_Kretschmann&lt;span class="nt">&amp;lt;/link&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- ... --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/links&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- ... --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/kabinett&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das sind die Daten der Politiker des &lt;a href="https://de.wikipedia.org/wiki/Kabinett_Kretschmann_III" target="_blank" rel="noopener">Kabinetts Kretschmann III&lt;/a>, diesmal im XML Format. Die Personendaten sind teilweise in Attributen und teilweise als separates Element angelegt.
Die Links auf weitere &amp;ldquo;Profile&amp;rdquo; sind als Sammlung unterhalb des &lt;code>&amp;lt;person&amp;gt;&lt;/code> Elementes angelegt.&lt;/p>
&lt;h2 id="aufgabe-1-xml-laden">Aufgabe 1: XML Laden&lt;/h2>
&lt;p>Wir laden die folgende Datei in ein OpenRefine-Projekt.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/14_kretschmann-kabinett-iii.xml" target="_blank">
&lt;i class="fas fa-file-code pr-1 fa-fw">&lt;/i>Kretschmann III als XML&lt;/a>
&lt;p>Der Import von XML-Daten beginnt mit einem anderen Dialog, als wir es gewohnt sind.
Wie in Abbildung 1 gezeigt fragt OpenRefine nach dem ersten XML Element, welches als Record geladen werden soll.
Wir wählen hier das &lt;code>&amp;lt;person&amp;gt;&lt;/code> Element aus, da wir die Daten zu den Personen laden möchten.
Die restlichen Daten, wie zum Beispiel das &lt;code>&amp;lt;kabinett&amp;gt;&lt;/code> Element mit dem &lt;code>title&lt;/code> Attribut werden dann verworfen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-import-oberfläche-für-xml">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Import Oberfläche für XML." srcset="
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-import_hub68ca0a198a9ba6fdea2bf890ed56661_59629_15d6b92744221c3b6c74deb9da368e87.webp 400w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-import_hub68ca0a198a9ba6fdea2bf890ed56661_59629_18716695f0a9c08f1f476efdf5bc6fb9.webp 760w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-import_hub68ca0a198a9ba6fdea2bf890ed56661_59629_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-import_hub68ca0a198a9ba6fdea2bf890ed56661_59629_15d6b92744221c3b6c74deb9da368e87.webp"
width="724"
height="683"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Import Oberfläche für XML.
&lt;/figcaption>&lt;/figure>
&lt;p>In Abbildung 2 ist das Projekt direkt nach dem Import abgebildet.
Wir sind im &amp;ldquo;Record&amp;rdquo; Modus und aus jeder Person wurde ein &amp;ldquo;Record&amp;rdquo;.
Die Links sind auf mehrere Zeilen aufgeteilt.&lt;/p>
&lt;p>Interessant ist die automatische Benennung der Spalten:&lt;/p>
&lt;ul>
&lt;li>Das Attribut &lt;code>gnd-id&lt;/code> am Element &lt;code>&amp;lt;person&amp;gt;&lt;/code> wurde in die Spalte &lt;code>person - gnd-id&lt;/code> geladen.&lt;/li>
&lt;li>Das Element &lt;code>&amp;lt;name&amp;gt;&lt;/code> mit dem XML Pfad &lt;code>/kabinett/person/name&lt;/code> wurde in die Spalte &lt;code>person - name&lt;/code> geladen.&lt;/li>
&lt;li>Die Linksammlung mit dem XML Pfad &lt;code>/kabinett/person/links/link&lt;/code> wurde in die Spalte &lt;code>person - links - link&lt;/code> geladen.&lt;/li>
&lt;/ul>
&lt;figure id="figure-bildschirmfoto-der-geladenen-xml-datei">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der geladenen XML Datei." srcset="
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-start_hud2e2e10fae61fe40f219846af80f3846_50695_27515dcadc0361818f30b6312278dee0.webp 400w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-start_hud2e2e10fae61fe40f219846af80f3846_50695_fd3893a6ef9371f5e8f7e4d813335f5f.webp 760w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-start_hud2e2e10fae61fe40f219846af80f3846_50695_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-start_hud2e2e10fae61fe40f219846af80f3846_50695_27515dcadc0361818f30b6312278dee0.webp"
width="760"
height="365"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der geladenen XML Datei.
&lt;/figcaption>&lt;/figure>
&lt;p>Durch diese automatische Benennung lässt sich nachvollziehen, woher die Daten stammen und wie sie zusammengehören.
Es bedeutet aber auch, dass wir die Spalten alle manuell umbenennen müssen.&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Benennen Sie die Spalten wie in Abbildung 3 gezeigt um.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-projektes-mit-korrekten-spaltennamen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Projektes mit korrekten Spaltennamen." srcset="
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-renamed_hufcdef497729b518629de2905303bd53f_49468_3e48c0deba710bf565c9d08e411f7e35.webp 400w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-renamed_hufcdef497729b518629de2905303bd53f_49468_fd1cc8a58a1085a1d483faaf96a030d6.webp 760w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-renamed_hufcdef497729b518629de2905303bd53f_49468_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-renamed_hufcdef497729b518629de2905303bd53f_49468_3e48c0deba710bf565c9d08e411f7e35.webp"
width="760"
height="406"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Projektes mit korrekten Spaltennamen.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-2-xml-exportieren-einfach">Aufgabe 2: XML exportieren (einfach)&lt;/h2>
&lt;p>Theoretisch könnten wir die Daten im Projekt jetzt mit weiteren Daten anreichern, umformatieren&amp;hellip;
Diesen Part überspringen wir und beschäftigen uns direkt damit, wie wir die Daten wieder als XML exportieren können.&lt;/p>
&lt;p>Unser Zielformat sieht wie in folgendem Beispiel aus:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;personen&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;gnd-id&amp;gt;&lt;/span>143926683&lt;span class="nt">&amp;lt;/gnd-id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>Kretschmann, Winfried&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geschlecht&amp;gt;&lt;/span>m&lt;span class="nt">&amp;lt;/geschlecht&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtstag&amp;gt;&lt;/span>1948-05-17&lt;span class="nt">&amp;lt;/geburtstag&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtsort&amp;gt;&lt;/span>Spaichingen&lt;span class="nt">&amp;lt;/geburtsort&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- ... --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/personen&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wir wollen also die Personendaten in einzelne Elemente speichern und erstmal auf die Links verzichten.
Dafür wechseln wir in OpenRefine in den &amp;ldquo;Rows&amp;rdquo; Modus und filtern die zusätzlichen Link Zeilen via
&amp;ldquo;GND-ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Customized facets&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Facet by blank (null or empty string)&amp;rdquo;.&lt;/p>
&lt;p>Anschließend gehen wir auf &amp;ldquo;Export&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Templating&amp;hellip;&amp;rdquo; um den in Abbildung 4 gezeigten Dialog aufzurufen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-templating-dialogs-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Templating Dialogs in OpenRefine." srcset="
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-templating-json_hu9aa3c20899dacfb530f00a48cd76d281_43814_eea2c3f7d0fa044d576a8849450c274d.webp 400w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-templating-json_hu9aa3c20899dacfb530f00a48cd76d281_43814_0a5162ccabae8a3eb82f5232055a7509.webp 760w,
/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-templating-json_hu9aa3c20899dacfb530f00a48cd76d281_43814_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/screenshot-openrefine-xml-templating-json_hu9aa3c20899dacfb530f00a48cd76d281_43814_eea2c3f7d0fa044d576a8849450c274d.webp"
width="760"
height="575"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Templating Dialogs in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Dieser Dialog besteht aus fünf Teilen:&lt;/p>
&lt;ol>
&lt;li>Das &amp;ldquo;Prefix&amp;rdquo;, also der Text, der zu Beginn steht.&lt;/li>
&lt;li>Das &amp;ldquo;Row Template&amp;rdquo;, also das Template für die einzelnen Zeilen.&lt;/li>
&lt;li>Der &amp;ldquo;Row Separator&amp;rdquo;, also das Trennzeichen zwischen den einzelnen Zeilen.&lt;/li>
&lt;li>Das &amp;ldquo;Suffix&amp;rdquo;, also der Text, der am Ende steht.&lt;/li>
&lt;li>Eine Vorschau auf der rechten Seite.&lt;/li>
&lt;/ol>
&lt;p>Initial wird ein Template zum Erzeugen von JSON geladen.
Im Template Feld sind GREL-Ausdrücke in geschweiften Klammern &lt;code>{{...}}&lt;/code> zu sehen, die die Werte in den einzelnen Feldern mit der Funktion &lt;code>jsonize()&lt;/code> in ein kompatibles Format umwandeln.&lt;/p>
&lt;p>Für die Generierung von XML gehen wir ähnlich vor.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
Die Vorschau ist teilweise recht aufwendig zu berechnen.
Sollte es zu lange dauern, bis sie geladen wird, kann man die GREL-Ausdrücke in einem anderen Dialog-Fenster (zum Beispiel &amp;ldquo;Edit cells&amp;rdquo;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;ldquo;Transform&amp;rdquo;) testen und/oder zum Entwickeln die Anzahl an Einträgen via Facet (zum Beispiel &amp;ldquo;Facet by star&amp;rdquo;) reduzieren.
&lt;/div>
&lt;/div>
&lt;h3 id="prefix">Prefix&lt;/h3>
&lt;p>Zu Beginn benötigen wir die XML Deklaration und das Wurzelelement &lt;code>&amp;lt;personen&amp;gt;&lt;/code>, welche wir in das Feld &amp;ldquo;Prefix&amp;rdquo; schreiben.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;personen&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="suffix">Suffix&lt;/h3>
&lt;p>Das Wurzelelement schließen wir im Feld &amp;ldquo;Suffix&amp;rdquo; und fügen davor zur besseren Lesbarkeit noch eine Leerzeile (Zeilenumbruch) hinzu.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/personen&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="row-separator">Row Separator&lt;/h3>
&lt;p>Um die einzelnen Zeilen zu separieren verwenden wir ebenfalls eine Leerzeile (Zeilenumbruch).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="row-template">Row Template&lt;/h3>
&lt;p>Der aufwendigste Part ist die Erstellung eines Templates für die einzelnen Zeilen im Feld &amp;ldquo;Row Template&amp;rdquo;.
Hierfür können wir in einem ersten Versuch die Vorlage des Zielformates in das Feld kopieren und die einzelnen Werte mit Variablen (Spaltenname) versehen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;gnd-id&amp;gt;&lt;/span>${GND-ID}&lt;span class="nt">&amp;lt;/gnd-id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>${Name}&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geschlecht&amp;gt;&lt;/span>${Geschlecht}&lt;span class="nt">&amp;lt;/geschlecht&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtstag&amp;gt;&lt;/span>${Geburtstag}&lt;span class="nt">&amp;lt;/geburtstag&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtsort&amp;gt;&lt;/span>${Geburtsort}&lt;span class="nt">&amp;lt;/geburtsort&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die Variante mit Variablen funktioniert und ist gut zu lesen. Sie hat jedoch den Nachteil, dass einzelne Sonderzeichen in den Feldern (&lt;code>&amp;lt;&lt;/code> oder &lt;code>&amp;gt;&lt;/code> ) die Struktur des XML Dokumentes zerstören können.
Um das zu verhindern, gibt es in GREL die Funktion &lt;a href="https://docs.openrefine.org/manual/grelfunctions#escapes-s-mode" target="_blank" rel="noopener">escape()&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Schreiben sie die Vorlage so um, dass statt der Variablen analog zu dem JSON Template GREL Ausdrücke mit &lt;code>escape()&lt;/code> verwendet werden.&lt;/p>
&lt;details class="spoiler " id="spoiler-12">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;gnd-id&amp;gt;&lt;/span>{{escape(cells[&amp;#34;GND-ID&amp;#34;].value, &amp;#34;xml&amp;#34;)}}&lt;span class="nt">&amp;lt;/gnd-id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>{{escape(cells[&amp;#34;Name&amp;#34;].value, &amp;#34;xml&amp;#34;)}}&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geschlecht&amp;gt;&lt;/span>{{escape(cells[&amp;#34;Geschlecht&amp;#34;].value, &amp;#34;xml&amp;#34;)}}&lt;span class="nt">&amp;lt;/geschlecht&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtstag&amp;gt;&lt;/span>{{escape(cells[&amp;#34;Geburtstag&amp;#34;].value, &amp;#34;xml&amp;#34;)}}&lt;span class="nt">&amp;lt;/geburtstag&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtsort&amp;gt;&lt;/span>{{escape(cells[&amp;#34;Geburtsort&amp;#34;].value, &amp;#34;xml&amp;#34;)}}&lt;span class="nt">&amp;lt;/geburtsort&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-3-xml-exportieren-records">Aufgabe 3: XML exportieren (Records)&lt;/h2>
&lt;p>In Aufgabe 2 haben wir die Baumstruktur des Dokumentes ignoriert, also die Links weggelassen.
Diesmal wollen wir die Links jedoch mit ausgeben.
Dafür deaktivieren wir das in Aufgabe 2 erstellte Facet und wechseln in den &amp;ldquo;Record&amp;rdquo; Modus.&lt;/p>
&lt;p>Unser Zielformat sieht wie folgt aus:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;personen&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;gnd-id&amp;gt;&lt;/span>143926683&lt;span class="nt">&amp;lt;/gnd-id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>Kretschmann, Winfried&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geschlecht&amp;gt;&lt;/span>m&lt;span class="nt">&amp;lt;/geschlecht&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtstag&amp;gt;&lt;/span>1948-05-17&lt;span class="nt">&amp;lt;/geburtstag&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;geburtsort&amp;gt;&lt;/span>Spaichingen&lt;span class="nt">&amp;lt;/geburtsort&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;links&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;link&amp;gt;&lt;/span>http://dbpedia.org/resource/Winfried_Kretschmann&lt;span class="nt">&amp;lt;/link&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- ... --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/links&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/person&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- ... --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/personen&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Es unterscheidet sich also lediglich durch das zusätzliche Element &lt;code>&amp;lt;links&amp;gt;&lt;/code>.&lt;/p>
&lt;p>Leider gibt es bei den Vorlagen in OpenRefine keine direkte Unterstützung von &amp;ldquo;Records&amp;rdquo;, so dass wir uns mit GREL behelfen müssen.
Wir bauen also das komplette Template durch eine Verkettung von Textschnippseln in GREL zusammen.
Dafür verwenden wir die Kontrollstrukturen &lt;a href="https://docs.openrefine.org/manual/grel#ife-etrue-efalse" target="_blank" rel="noopener">if&lt;/a> und &lt;a href="https://docs.openrefine.org/manual/grel#foreache1-v-e2" target="_blank" rel="noopener">forEach&lt;/a>.&lt;/p>
&lt;p>Hier ist die allgemeine Idee für unseren Algorithmus:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Wir verarbeiten immer nur die erste Zeile eines Records.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">index&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">fromRowIndex&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;person&amp;gt;\n&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">...&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/person&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Wir geben alle Spalten mit nur einer gefüllten Zeile im Record direkt aus.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;lt;gnd-id&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;GND-ID&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/gnd-id&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Wir zählen Spalten mit mehr als einer Zeile im Record zeilenweise mit &lt;code>forEach&lt;/code> auf.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Links&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">link&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;link&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">link&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/link&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Aufgabe:&lt;/strong> Erstellen Sie mit GREL ein Template, welches zusätzlich zu den Daten aus Aufgabe 1 auch die Links mit ausgibt.
&lt;details class="spoiler " id="spoiler-13">
&lt;summary>&lt;strong>Lösung:&lt;/strong>&lt;/summary>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">index&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">fromRowIndex&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;lt;person&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;gnd-id&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;GND-ID&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/gnd-id&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;name&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Name&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="s2">&amp;#34;&amp;lt;/name&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;geschlecht&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geschlecht&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/geschlecht&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;geburtstag&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtstag&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/geburtstag&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;geburtsort&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Geburtsort&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/geburtsort&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;links&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">record&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Links&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">link&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;link&amp;gt;&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">link&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;xml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/link&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;\n&amp;lt;/links&amp;gt;\n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;/person&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Hinweis:&lt;/strong> Wir verzichten in diesem GREL Ausdruck auf Leerzeichen zur Formatierung des XML zur Einrückung der einzelnen Elemente.
Wir haben die Erfahrung gemacht, dass die Lesbarkeit der GREL Ausdrücke darunter leidet.
Einfacher ist es, bei Bedarf das XML anschließend in einem Editor wie &lt;a href="https://notepad-plus-plus.org/" target="_blank" rel="noopener">Notepad++&lt;/a> oder &lt;a href="https://code.visualstudio.com/" target="_blank" rel="noopener">Visual Studio Code&lt;/a> mit den entsprechenden XML Erweiterungen automatisch formatieren und dabei auch gleich noch validieren zu lassen.&lt;/p>
&lt;/p>
&lt;/details>&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Wir haben für diesen Workshop bewusst ein einfach strukturiertes XML Beispiel erstellt um direkt zu sehen, wie OpenRefine die XML Struktur verarbeitet und XML erstellen kann.
Üblicherweise sind XML Dateien weitaus tiefer strukturiert und es dauert entsprechend länger, bis die Daten in OpenRefine passend benannt und sortiert sind.
Auch der Export ist oft weitaus komplexer, zum Beispiel wenn Felder optional leer sein können oder es mehrere Verschachtelungen in den Records gibt.
Jedoch sind die Strategien zur Lösung dieser Probleme (&amp;ldquo;Sortieren &amp;amp; Umbenennen&amp;rdquo; bzw. &amp;ldquo;&lt;code>if&lt;/code> und &lt;code>forEach&lt;/code>&amp;rdquo;) die gleichen wie hier im Beispiel besprochen.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns mit dem erweiterten Datenabgleich zwischen OpenRefine und der Gemeinsamen Normdatei via des lobid API.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid" class="btn btn-primary px-3 py-3">15 Erweiterter GND Abgleich mit lobid&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop für Fortgeschrittene - Warum OpenRefine?</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/warum-openrefine/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/warum-openrefine/</guid><description>&lt;p>In diesem Workshop für Fortgeschrittene gehen wir tiefer in die spezialisierten Funktionalitäten von OpenRefine und beschäftigen uns mit angrenzende Themen.
Unter anderem betrachten wir reguläre Ausdrücke und programmieren mit der &lt;em>General Refine Expression Language&lt;/em> (GREL).&lt;/p>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;h2 id="inhalte-des-workshops">Inhalte des Workshops&lt;/h2>
&lt;ul>
&lt;li>Motivation: Warum OpenRefine?&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke/">08 Reguläre Ausdrücke&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/09-arbeiten-mit-grel/">09 Arbeiten mit GREL&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/10-arbeiten-mit-records/">10 Arbeiten mit Records&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/11-transponieren/">11 Transponieren&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/12-daten-zwischen-projekten-abgleichen/">12 Daten zwischen Projekten abgleichen&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/13-die-welt-der-facets/">13 Die Welt der Facets&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/14-xml-importieren-und-exportieren/">14 XML importieren und exportieren&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/">15 Erweiterter GND Abgleich mit lobid&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/16-erweiterter-abgleich-mit-wikidata/">16 Erweiterter Abgleich mit Wikidata&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/17-erweiterter-abgleich-mit-getty/">17 Erweiterter Abgleich mit Getty&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/18-nachladen-von-geokoordinaten/">18 Nachladen von Geokoordinaten&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/">19 Erweitertes Clustering&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/20-python-mit-openrefine/">20 Python mit OpenRefine&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="warum-eigentlich-openrefine-für-fortgeschrittene">Warum eigentlich OpenRefine für Fortgeschrittene?&lt;/h2>
&lt;blockquote>
&lt;p>OpenRefine is Excel on steroids!&lt;/p>
&lt;/blockquote>
&lt;p>Oder um einen bildlichen Vergleich eines Workshop Teilnehmers wiederzuverwenden:&lt;/p>
&lt;blockquote>
&lt;p>Mit Excel hatten wir bisher einen Trabi.&lt;br>
Mit OpenRefine haben wir einen Ferrari bekommen.&lt;/p>
&lt;/blockquote>
&lt;p>Der Umgang mit einem solchen Werkzeug sollte jedoch geübt und vertieft werden.
Viele Funktionalitäten von OpenRefine sind über die graphische Oberfläche bedienbar.
Jedoch können einige Bearbeitungsschritte vereinfacht oder automatisiert werden.
Im &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/warum-openrefine/">Workshop für Einsteiger&lt;/a> haben wir uns auf grundlegende Funktionen von OpenRefine fokussiert. Diesmal vertiefen wir einige Konzepte oder ergänzen Sie mit weiteren Technologien.&lt;/p>
&lt;p>Wir werden dabei unter anderem die Programmiersprache GREL kennen lernen.
Diese ist bei weitem nicht so mächtig, wie zum Beispiel Java oder Python.
Jedoch können wir damit schon einige Dinge automatisieren und vereinfachen.&lt;/p>
&lt;p>Außerdem werden wir uns mit regulären Ausdrücken beschäftigen.
Diese helfen uns Daten zu finden, die bestimmten Mustern entsprechen.&lt;/p>
&lt;hr>
&lt;p>Im ersten Teil machen wir einen Exkurs zum Arbeiten mit regulären Ausdrücken zur Erkennung und Extraktion von Mustern.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/08-regulaere-ausdruecke" target="_blank" rel="noopener" class="btn btn-primary px-3 py-3">08 Arbeiten mit regulären Ausdrücken&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>OpenRefine Workshop für Einsteiger veröffentlicht</title><link>https://fdmlab.landesarchiv-bw.de/post/2022-04-openrefine-workshop-veroeffentlicht/</link><pubDate>Tue, 19 Apr 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/post/2022-04-openrefine-workshop-veroeffentlicht/</guid><description>&lt;p>Was hat denn der Osterhase hier im Blog entdeckt?
Da ist seit Anfang April ein OpenRefine Workshop versteckt!&lt;/p>
&lt;p>Wir haben schon 2021 im FDMLab einen an die Bedürfnisse im Archiv angepassten Workshop für OpenRefine entwickelt. Diesen internen Workshop haben wir anschließend zum Nachlesen oder selbst Lernen für den FDMLab Blog aufbereitet und online gestellt.&lt;/p>
&lt;p>Im &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/warum-openrefine/">Workshop für Einsteiger&lt;/a> geben wir eine grundlegende Einführung in die Bedienung mit OpenRefine.
Dabei behandeln wir das Filtern, Sortieren und Umwandeln von Daten.
Anschließend beschäftigen wir uns mit den Funktionalitäten von OpenRefine um Daten zu Clustern, mit der Gemeinsamen Normdatei (GND) oder Wikidata abzugleichen.&lt;/p>
&lt;p>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/warum-openrefine/">
&lt;figure id="figure-link-zum-einsteiger-workshop-für-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Folie zum Einsteiger Workshop zu OpenRefine" srcset="
/post/2022-04-openrefine-workshop-veroeffentlicht/einsteiger-workshop_huae1fc9740e631dcd5f3ab7c106300ec3_255031_aa392a193ca03f2bd4e7b25597cad8fe.webp 400w,
/post/2022-04-openrefine-workshop-veroeffentlicht/einsteiger-workshop_huae1fc9740e631dcd5f3ab7c106300ec3_255031_c978c4014edcaa15435a7a004d5d1fa7.webp 760w,
/post/2022-04-openrefine-workshop-veroeffentlicht/einsteiger-workshop_huae1fc9740e631dcd5f3ab7c106300ec3_255031_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-04-openrefine-workshop-veroeffentlicht/einsteiger-workshop_huae1fc9740e631dcd5f3ab7c106300ec3_255031_aa392a193ca03f2bd4e7b25597cad8fe.webp"
width="760"
height="494"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Link zum Einsteiger Workshop für OpenRefine
&lt;/figcaption>&lt;/figure>
&lt;/a>&lt;/p>
&lt;p>Im Mai veröffentlichen wir darauf aufbauend einen &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/warum-openrefine/">Workshop für Fortgeschrittene&lt;/a>.
Hier werden wir uns uns mit regulären Ausdrücken und der Programmiersprache GREL beschäftigen.
Anschließend vertiefen wir die Arbeit mit OpenRefine im Kontext von Records und dem Umgang mit XML.
Als Bonus lernen wir die erweiterten Suchoptionen beim Abgleich mit dem lobid GND API kennen.&lt;/p>
&lt;p>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/warum-openrefine/">
&lt;figure id="figure-link-zum-fortgeschrittenen-workshop-für-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Folie zum Fortgeschrittenen Workshop zu OpenRefine" srcset="
/post/2022-04-openrefine-workshop-veroeffentlicht/fortgeschrittenen-workshop_hu00fd59ce174da3b35c679c79bdf7d37f_135707_3fd3e401d70943332d628859cd815222.webp 400w,
/post/2022-04-openrefine-workshop-veroeffentlicht/fortgeschrittenen-workshop_hu00fd59ce174da3b35c679c79bdf7d37f_135707_f48739266f38b516b4b9e68346058966.webp 760w,
/post/2022-04-openrefine-workshop-veroeffentlicht/fortgeschrittenen-workshop_hu00fd59ce174da3b35c679c79bdf7d37f_135707_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2022-04-openrefine-workshop-veroeffentlicht/fortgeschrittenen-workshop_hu00fd59ce174da3b35c679c79bdf7d37f_135707_3fd3e401d70943332d628859cd815222.webp"
width="760"
height="494"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Link zum Fortgeschrittenen Workshop für OpenRefine
&lt;/figcaption>&lt;/figure>
&lt;/a>&lt;/p></description></item><item><title>Workshop - Daten mit OpenRefine clustern</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/05-clustering/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/05-clustering/</guid><description>&lt;p>Wir verwenden verschiedene Clustering Methoden in OpenRefine, um Schreibweisen zu vereinheitlichen.&lt;/p>
&lt;blockquote>
&lt;p>Clustering in der &lt;a href="https://docs.openrefine.org/manual/cellediting#cluster-and-edit" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;p>Clustering im &lt;a href="https://github.com/OpenRefine/OpenRefine/wiki/Clustering-In-Depth" target="_blank" rel="noopener">OpenRefine Wiki&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;h2 id="hintergrund">Hintergrund&lt;/h2>
&lt;p>OpenRefine implementiert unterschiedliche Methoden, um Cluster in Mengen von Werten zu finden.
Dies hilft uns beim Vereinheitlichen von Werten, finden von Tippfehlern, usw.&lt;/p>
&lt;p>Im folgenden Diagramm ist dargestellt, wie alle Vorkommen von &amp;ldquo;Michael Müller&amp;rdquo; in einer Liste von Namen zusammengefasst werden können.
Ein einfaches Sortieren nach Namen genügt hier nicht, da &amp;ldquo;Michael Müller&amp;rdquo; unterschiedlich geschrieben wurde.
Hier ist eine Deduplizierung erforderlich, wofür in OpenRefine Clustering eingesetzt werden kann.&lt;/p>
&lt;div class="mermaid">---
title: Visualisierung Clustering
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph unsorted["Unsortiert"]
mm1_1["Michael Müller"]
mm1_2["Michael Müller"]
mm1_3["Michael Müller"]
mm2_1["Michael Mueller"]
mm2_2["Michael Mueller"]
mm3_1["Michel Müller"]
end
subgraph original["Sortiert (Original)"]
mm1["3 x Michael Müller"]
mm2["2 x Michael Mueller"]
mm3["1 x Michel Müller"]
end
subgraph clustered["Zusammengeführt"]
mm_finished["9 x Michael Müller"]
end
mm1_1 &amp; mm1_2 &amp; mm1_3 -.-> mm1
mm2_1 &amp; mm2_2 -.-> mm2
mm3_1 -.-> mm3
mm1 &amp; mm2 &amp; mm3 -.-> mm_finished
unsorted --Sortieren--> original --Deduplizieren--> clustered
&lt;/div>
&lt;p>Hier eine Übersicht über die verschiedenen Arten von Cluster-Verfahren und welche Probleme sie lösen.
Die Zusammenfassung basiert auf &lt;a href="https://github.com/OpenRefine/OpenRefine/wiki/Clustering-In-Depth" target="_blank" rel="noopener">Clustering In Depth&lt;/a> aus dem OpenRefine Wiki
und aus unseren Erfahrungen beim &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-10-clustering-von-namen-mit-openrefine/">Clustering von Namen mit OpenRefine&lt;/a>.&lt;/p>
&lt;h3 id="fingerprint-verfahren-schnell">Fingerprint Verfahren (schnell)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Name&lt;/th>
&lt;th>Beschreibung&lt;/th>
&lt;th>Beispiel&lt;/th>
&lt;th>Kommentar&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Fingerprinting&lt;/td>
&lt;td>Normalisiert und Sortiert auf Wortebene. Entfernt Satzzeichen!&lt;/td>
&lt;td>&lt;ul>&lt;li>Straßburg (Elsaß, Frankreich)&lt;/li>&lt;li>Elsass (Frankreich), Strassburg&lt;/li>&lt;li>Strassburg, Elsáss, Frankreich&lt;/li>&lt;/ul>&lt;/td>
&lt;td>Probleme mit kleinen Abweichungen.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>N-Gram Fingerprinting&lt;/td>
&lt;td>Normalisiert und sortiert auf Buchstabenebene&lt;/td>
&lt;td>&lt;ul>&lt;li>Paris = 1-gram =&amp;gt; a i p r s&lt;/li>&lt;li>Paris = 2-gram =&amp;gt; ar is pa ri&lt;/li>&lt;/ul>&lt;/td>
&lt;td>Schnell und hilft z.B. bei Buchstabendrehern.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Die Fingerprinting Methoden sind sehr schnell und helfen bei typischen Problemen wie Wortreihenfolgen, unterschiedlicher Verwendung von Sonderzeichen oder Satzzeichen. OpenRefine bietet hier ein Verfahren auf Wortebene und eines auf Buchstabenebene an.&lt;/p>
&lt;p>Hierbei ist zu beachten, dass schon kleine Abweichungen (ein zusätzliches/anders geschriebenes Wort) dazu führen, dass ein Text aus einem Cluster ausgeschlossen wird.&lt;/p>
&lt;h3 id="phonetische-verfahren">Phonetische Verfahren&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Name&lt;/th>
&lt;th>Sprache&lt;/th>
&lt;th>Beispiel&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Cologne-phonetic&lt;/td>
&lt;td>Deutsch&lt;/td>
&lt;td>Meier, Maier, Mayer, Mayr.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Metaphone3&lt;/td>
&lt;td>Englisch&lt;/td>
&lt;td>Reuben Gevorkiantz und Ruben Gevorkyants.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Daitsch-Moktoff&lt;/td>
&lt;td>Slawisch und Jiddisch&lt;/td>
&lt;td>Moskowitz und Moskovitz.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Beider-Morse&lt;/td>
&lt;td>Slawisch und Jiddisch&lt;/td>
&lt;td>Weniger Falsch-Positive als Daitsch-Moktoff.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Die phonetischen Verfahren berücksichtigen, dass manche Buchstaben in der gesprochenen Sprache die gleichen Laute erzeugen.
Das ist gerade für Namen in historischen Dokumenten sinnvoll, da diese häufig nach Hörverständnis geschrieben werden.&lt;/p>
&lt;p>OpenRefine hat Implementierungen für die deutsche Sprache in Form von &lt;a href="https://de.wikipedia.org/wiki/K%C3%B6lner_Phonetik" target="_blank" rel="noopener">Cologne Phonetic&lt;/a>,
für die englische Sprache in Form von &lt;a href="https://de.wikipedia.org/wiki/Metaphone" target="_blank" rel="noopener">Metaphone&lt;/a>,
und für slawische Sprachen und Jiddisch &lt;a href="https://en.wikipedia.org/wiki/Daitch%E2%80%93Mokotoff_Soundex" target="_blank" rel="noopener">Daitsch-Moktoff und Beider-Morse&lt;/a>.&lt;/p>
&lt;h3 id="nearest-neighbor-verfahren-langsam">Nearest-Neighbor-Verfahren (langsam)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Name&lt;/th>
&lt;th>Beschreibung&lt;/th>
&lt;th>Beispiel&lt;/th>
&lt;th>Kommentar&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Levensthein&lt;/td>
&lt;td>$d(A, B) = repl + ins + del$&lt;/td>
&lt;td>&lt;ul>&lt;li>Se&lt;strong>i&lt;/strong>d, Christoph&lt;/li>&lt;li>Se&lt;strong>l&lt;/strong>d, Christoph&lt;/li>&lt;/ul>&lt;/td>
&lt;td>&lt;ul>&lt;li>Aufwendig&lt;/li>&lt;li>Gut bei OCR Fehlern&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prediction by&lt;br>Partial Matching&lt;/td>
&lt;td>$d(A, B) = \frac{compress(A, B) + compress(B, A)}{compress(A, A) + compress(B, B)}$&lt;/td>
&lt;td>&lt;ul>&lt;li>Streitt, Johann &lt;strong>K&lt;/strong>onrad&lt;/li>&lt;li>Streitt&lt;strong>er&lt;/strong>, Johann, &lt;strong>C&lt;/strong>onrad&lt;/li>&lt;/ul>&lt;/td>
&lt;td>&lt;ul>&lt;li>Aufwendig&lt;/li>&lt;li>Falsch-Positive&lt;/li>&lt;li>Braucht lange Texte&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Die &lt;a href="https://de.wikipedia.org/wiki/Levenshtein-Distanz" target="_blank" rel="noopener">Levensthein Distanz&lt;/a> berechnet die Ähnlichkeit zwischen zwei Texten, indem sie die notwendigen Änderungsoperationen (Ersetzungen, Einfügungen, Löschungen) zählt, die notwendig sind um zwei Texte ineinander zu überführen.
Die Berechnung ist jedoch recht aufwendig. Dafür ist die Levensthein Methode hilfreich um Tippfehler oder OCR-Fehler zu identifizieren.&lt;/p>
&lt;p>Bei &lt;a href="https://de.wikipedia.org/wiki/Prediction_by_Partial_Matching" target="_blank" rel="noopener">Prediction by Partial Matching&lt;/a> werden Kompressionsverfahren verwendet.
Die Annahme dabei ist, dass Texte mit ähnlichen Inhalten (strukturell, nicht semantisch!) komprimiert ähnlich aussehen.
Das ist gerade bei längeren Texten hilfreich, bei kurzen Texten (einzelne Worte) ist das Verfahren nicht so erfolgreich.&lt;/p>
&lt;h3 id="probleme-beim-clustering">Probleme beim Clustering&lt;/h3>
&lt;p>Auch wenn man mit den Clustering Methoden schnell zu sinnvollen Ergebnissen kommt, gibt es einige Bereiche, für die es in OpenRefine (noch) keine Lösungen gibt, bzw. spezialisierte Clustering Methoden notwendig wären. Hier eine unvollständige Liste von separat zu behandelnden Problemen mit Beispielen:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Abkürzungen&lt;/strong>: w, weibl., weiblich&lt;/li>
&lt;li>&lt;strong>Synonyme&lt;/strong>: ledig, single, alleinstehend, frei, unverheiratet&lt;/li>
&lt;li>&lt;strong>Bestimmte OCR-Fehler&lt;/strong>: &lt;strong>Fl&lt;/strong>einrich und &lt;strong>H&lt;/strong>einrich&lt;/li>
&lt;li>&lt;strong>Fehlende Zweitnamen&lt;/strong>: Speckmann, &lt;strong>Johann&lt;/strong> Stefan&lt;/li>
&lt;li>&lt;strong>Fehlende Namensbestandteile&lt;/strong>: Albrecht &lt;strong>(von Lauterburg)&lt;/strong> Johann Konrad&lt;/li>
&lt;li>&lt;strong>Alternative Schreibweisen&lt;/strong>: Greck, Leo und Greck &lt;strong>(Gregk)&lt;/strong>, Leo&lt;/li>
&lt;/ul>
&lt;h2 id="aufgabe-1-clustering-mit-fingerprint-methoden">Aufgabe 1: Clustering mit &amp;ldquo;fingerprint&amp;rdquo; Methoden&lt;/h2>
&lt;p>Die Spalte &amp;ldquo;Todesdatum (beschreibend)&amp;rdquo; sieht auf den ersten Blick recht aufgeräumt aus.&lt;/p>
&lt;p>Wir testen auf dieser Spalte die Cluster-Methoden &amp;ldquo;fingerprint&amp;rdquo; und &amp;ldquo;ngram-fingerprint&amp;rdquo;.
Den Dialog für das Clustering öffnen wir entweder über die Bedienfläche &amp;ldquo;Cluster&amp;rdquo; im &amp;ldquo;Text Facet&amp;rdquo; der Spalte,
oder über das Spaltenmenü
&amp;ldquo;Todesdatum (beschreibend)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Cluster and edit&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-vom-clustering-dialog-mit-der-fingerprint-methode">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto vom Clustering Dialog mit der &amp;#39;fingerprint&amp;#39; Methode." srcset="
/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_cluster_fingerprint_hu3a08678164454302d4885d06293ab6a3_39467_d96373b11d0a6adafc987b9ad2427646.webp 400w,
/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_cluster_fingerprint_hu3a08678164454302d4885d06293ab6a3_39467_63ae227ae67b7f8f3b3a2b900e63f839.webp 760w,
/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_cluster_fingerprint_hu3a08678164454302d4885d06293ab6a3_39467_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_cluster_fingerprint_hu3a08678164454302d4885d06293ab6a3_39467_d96373b11d0a6adafc987b9ad2427646.webp"
width="760"
height="474"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto vom Clustering Dialog mit der &amp;lsquo;fingerprint&amp;rsquo; Methode.
&lt;/figcaption>&lt;/figure>
&lt;p>Wie in Abbildung 1 zu sehen, wird automatisch die &amp;ldquo;fingerprint&amp;rdquo; Methode ausgeführt, die auch gleich drei mögliche Cluster findet.
Diese unterscheiden sich lediglich in der Reihenfolge der Satzstellung sowie Groß- und Kleinschreibung.&lt;/p>
&lt;p>Wir führen diese Cluster noch nicht zusammen, sondern schauen uns noch die Ergebnisse der &amp;ldquo;NGram-Fingerprint&amp;rdquo; Methode an.
Diese findet in den Standardeinstellungen hier keine Cluster, sondern erst, wenn wir, wie in Abbildung 2 markiert, die Größe auf 1 reduzieren.&lt;/p>
&lt;figure id="figure-bildschirmfoto-vom-clustering-dialog-mit-der-ngram-fingerprint-methode">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto vom Clustering Dialog mit der &amp;#39;Ngram fingerprint&amp;#39; Methode." srcset="
/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_cluster_n_gram_fingerprint_hu3416120f2fa7f484961bbfe1218687cf_37570_e7cedc4fa506bbdae6cc6fb3d7611401.webp 400w,
/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_cluster_n_gram_fingerprint_hu3416120f2fa7f484961bbfe1218687cf_37570_79c7d12fc436e36157a7434b0ead3015.webp 760w,
/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_cluster_n_gram_fingerprint_hu3416120f2fa7f484961bbfe1218687cf_37570_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_cluster_n_gram_fingerprint_hu3416120f2fa7f484961bbfe1218687cf_37570_e7cedc4fa506bbdae6cc6fb3d7611401.webp"
width="760"
height="474"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto vom Clustering Dialog mit der &amp;lsquo;Ngram fingerprint&amp;rsquo; Methode.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-2-clustering-mit-phonetischen-und-nearest-neighbor-methoden">Aufgabe 2: Clustering mit phonetischen und &amp;ldquo;Nearest-Neighbor&amp;rdquo;-Methoden&lt;/h2>
&lt;p>Die Spalte &amp;ldquo;Familienverhältnis&amp;rdquo; beinhaltet unterschiedliche Abkürzungen und Tippfehler.
Testen Sie verschiedene phonetische und &amp;ldquo;Nearest-Neighbor&amp;rdquo;-Methoden zum Clustern aus.&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-text-facet-auf-der-spalte-familienverhältnis">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit Text Facet auf der Spalte Familienverhältnis." srcset="
/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_facet_familienverhaeltnis_huea56992cfd4ec76bdab4bc79ba0cdc86_12108_474ef03e023f885a9195fb5bbe348e5c.webp 400w,
/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_facet_familienverhaeltnis_huea56992cfd4ec76bdab4bc79ba0cdc86_12108_e3e87bd354ff7121c4d74943c6c08a21.webp 760w,
/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_facet_familienverhaeltnis_huea56992cfd4ec76bdab4bc79ba0cdc86_12108_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_facet_familienverhaeltnis_huea56992cfd4ec76bdab4bc79ba0cdc86_12108_474ef03e023f885a9195fb5bbe348e5c.webp"
width="288"
height="490"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit Text Facet auf der Spalte Familienverhältnis.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-3-clustern">Aufgabe 3: Clustern?&lt;/h2>
&lt;p>Auch in der Spalte &amp;ldquo;Religion&amp;rdquo; haben sich unterschiedliche Abkürzungen und Tippfehler eingeschlichen.
Lohnt sich hier ein Clustering, oder besser eine Kombination aus &amp;ldquo;Text Facet&amp;rdquo; und Textfilter?&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-text-facet-auf-der-spalte-religion">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit Text Facet auf der Spalte Religion." srcset="
/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_facet_religion_hu6ee4eec991ce1f02772049d09073bd21_8955_d0c0d84c7e9f6df0dba88adf21873e81.webp 400w,
/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_facet_religion_hu6ee4eec991ce1f02772049d09073bd21_8955_60fde6545e10f30bd3ad406149532532.webp 760w,
/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_facet_religion_hu6ee4eec991ce1f02772049d09073bd21_8955_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/05-clustering/screenshot_openrefine_facet_religion_hu6ee4eec991ce1f02772049d09073bd21_8955_d0c0d84c7e9f6df0dba88adf21873e81.webp"
width="288"
height="269"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit Text Facet auf der Spalte Religion.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Die in OpenRefine implementierten Clusteringverfahren sind mächtig und komfortabel integriert.
Auch wenn man ohne Hintergrundwissen über die einzelnen Clusteringverfahren zu einem brauchbaren Ergebnis kommt, ist es sinnvoll sich im Vorfeld einen passenden Workflow zurechtzulegen. Je nach Datenmenge wartet man sonst unnötig lange auf das Ergebnis eines aufwendiger zu berechnenden Nearest-Neighbor-Verfahrens.&lt;/p>
&lt;p>Hier gibt es im GLAM-Bereich auch durchaus noch Potential weitere Clusteringverfahren zu implementieren.
Zum Beispiel zur Korrektur von OCR-Fehlern, Berücksichtigung von Synonymen, oder &lt;a href="https://de.wikipedia.org/wiki/Worteinbettung" target="_blank" rel="noopener">Worteinbettungen&lt;/a> wie &lt;a href="https://en.wikipedia.org/wiki/Bag-of-words_model" target="_blank" rel="noopener">Bag-of-Words Modelle&lt;/a> und &lt;a href="https://en.wikipedia.org/wiki/Word2vec" target="_blank" rel="noopener">Word2Vec&lt;/a>.&lt;/p>
&lt;div class="alert alert-info">
&lt;div>
&lt;strong>Update Mai 2025&lt;/strong>: Seit OpenRefine &lt;strong>3.9.3&lt;/strong> lassen sich eigene Clustering Funktionen definieren.
Das wird in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/19-erweitertes-clustering/">19 Erweitertes Clustering&lt;/a> vertieft.
&lt;/div>
&lt;/div>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns mit dem Abgleich von Daten in OpenRefine mit der Gemeinsamen Normdatei (GND) über das lobid API.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/06-reconciling-mit-gnd" class="btn btn-primary px-3 py-3">06 Reconciling mit OpenRefine und der GND&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Daten mit OpenRefine exportieren</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/04-exportieren/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/04-exportieren/</guid><description>&lt;p>Wir exportieren Daten mit OpenRefine in unterschiedliche Formate.&lt;/p>
&lt;blockquote>
&lt;p>Daten exportieren in der &lt;a href="https://docs.openrefine.org/manual/exporting" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;h2 id="hintergrund">Hintergrund&lt;/h2>
&lt;p>OpenRefine bietet sowohl verschiedene fertige Exportmöglichkeiten an als auch die Möglichkeit, eigene Formate (JSON, XML) zu erstellen.
Wir konzentrieren uns in diesem Workshop auf tabellenartige Formate.&lt;/p>
&lt;h2 id="aufgabe-1-daten-als-excel-exportieren">Aufgabe 1: Daten als Excel exportieren&lt;/h2>
&lt;p>Wir verwenden das Projekt &amp;ldquo;Kretschmann Kabinett III&amp;rdquo;, das wir in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/">Projekte in OpenRefine laden und verwalten&lt;/a> erstellt haben.&lt;/p>
&lt;p>Dort erstellen wir ein &amp;ldquo;Text Facet&amp;rdquo; auf der Spalte &amp;ldquo;Geschlecht&amp;rdquo; und wählen darüber alle weiblichen Kabinettsmitglieder aus.&lt;/p>
&lt;p>Über &amp;ldquo;Export&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Excel 2007+ (.xlsx)&amp;rdquo; erzeugen wir eine Excel Datei.&lt;/p>
&lt;h2 id="aufgabe-2-daten-als-csv-exportieren">Aufgabe 2: Daten als CSV exportieren&lt;/h2>
&lt;p>Wir verwenden das gleiche Setup wie in Aufgabe 1.&lt;/p>
&lt;p>Über &amp;ldquo;Export&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Comma-separated value&amp;rdquo; erzeugen wir eine CSV Datei.&lt;/p>
&lt;h2 id="aufgabe-3-datenexport-spezifizieren">Aufgabe 3: Datenexport spezifizieren&lt;/h2>
&lt;p>Wir verwenden das gleiche Setup wie in Aufgabe 1.&lt;/p>
&lt;p>Über &amp;ldquo;Export&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Custom tabular exporter&amp;hellip;&amp;rdquo; erzeugen wir eine spezielle Datei.&lt;/p>
&lt;p>Die Einstellungen sind mit Bildschirmfotos in Abbildung 1 und 2 dokumentiert.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-export-einstellungen-1">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine Export Einstellungen 1." srcset="
/workshop/openrefine-einsteiger/04-exportieren/screenshot_openrefine_export_custom_1_hue6fb988869e431cf86898e9a40a00c67_32699_6be5b4fb54c9d2b5fe663ffd49b6120e.webp 400w,
/workshop/openrefine-einsteiger/04-exportieren/screenshot_openrefine_export_custom_1_hue6fb988869e431cf86898e9a40a00c67_32699_ea83a9c2c54507ac113a1cb01656c994.webp 760w,
/workshop/openrefine-einsteiger/04-exportieren/screenshot_openrefine_export_custom_1_hue6fb988869e431cf86898e9a40a00c67_32699_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/04-exportieren/screenshot_openrefine_export_custom_1_hue6fb988869e431cf86898e9a40a00c67_32699_6be5b4fb54c9d2b5fe663ffd49b6120e.webp"
width="760"
height="557"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine Export Einstellungen 1.
&lt;/figcaption>&lt;/figure>
&lt;figure id="figure-bildschirmfoto-von-openrefine-export-einstellungen-2">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine Export Einstellungen 2." srcset="
/workshop/openrefine-einsteiger/04-exportieren/screenshot_openrefine_export_custom_2_hu00bec272d2b2ffd74665ad233cc818de_17287_b6c317d217c1c0d1fa2f4ab03a46ef4b.webp 400w,
/workshop/openrefine-einsteiger/04-exportieren/screenshot_openrefine_export_custom_2_hu00bec272d2b2ffd74665ad233cc818de_17287_a9db0cab7322ff2cc4dc1513d5e62126.webp 760w,
/workshop/openrefine-einsteiger/04-exportieren/screenshot_openrefine_export_custom_2_hu00bec272d2b2ffd74665ad233cc818de_17287_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/04-exportieren/screenshot_openrefine_export_custom_2_hu00bec272d2b2ffd74665ad233cc818de_17287_b6c317d217c1c0d1fa2f4ab03a46ef4b.webp"
width="760"
height="360"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine Export Einstellungen 2.
&lt;/figcaption>&lt;/figure>
&lt;p>Die Dateiendung der heruntergeladenen Datei ändern wir anschließend von &lt;code>.txt&lt;/code> nach &lt;code>.csv&lt;/code>.&lt;/p>
&lt;h2 id="aufgabe-4-datenexporte-vergleichen">Aufgabe 4: Datenexporte vergleichen&lt;/h2>
&lt;p>Wir öffnen die drei exportierten Dateien mit Excel.&lt;/p>
&lt;p>Was sind die Unterschiede zwischen den Dateien?&lt;/p>
&lt;p>Welcher Export eignet sich für welchen Anwendungsfall?&lt;/p>
&lt;details class="spoiler " id="spoiler-7">
&lt;summary>&lt;strong>Hinweise/Lösungen:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Der normale Export berücksichtigt die momentan aktiven &amp;ldquo;Facets&amp;rdquo; und Filter.&lt;/li>
&lt;li>Excel erwartet bei CSV ein Semikolon &lt;code>;&lt;/code> als Trennzeichen und &lt;code>windows-1252&lt;/code> als Kodierung. Daher sieht die erste CSV-Datei in Excel &amp;ldquo;seltsam&amp;rdquo; aus. &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/li>
&lt;li>Der normale CSV Export von OpenRefine ist mit Komma &lt;code>,&lt;/code> getrennt und verwendet &lt;code>utf-8&lt;/code> als Kodierung, wie es von den meisten Anwendungen erwartet wird.&lt;/li>
&lt;li>Beim spezifischen Datenexport hat man die Kontrolle darüber, was exportiert wird und kann Trennzeichen, Kodierungen, &amp;hellip; beeinflussen.&lt;/li>
&lt;li>Im FDMLab verwenden wir &lt;code>xlsx&lt;/code>, wenn die Daten in Excel weiter bearbeitet werden sollen, und &lt;code>csv&lt;/code>, wenn wir die Daten mit anderen Anwendungen weiter bearbeiten.&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Microsoft Excel hat einen &lt;a href="https://support.microsoft.com/de-de/office/textimport-assistent-c5b02af6-fda1-4440-899f-f78bafe41857" target="_blank" rel="noopener">Textimport-Assistenten&lt;/a>, mit dem auch andere Formate importiert werden können.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div>
&lt;/p>
&lt;/details>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>OpenRefine kann die Projekte in gängige Formate exportieren.
Das ist schnell und bequem. Komplexer wird es bei verschachtelten Formaten wie XML.
Das behandeln wir in unserem Workshop für Fortgeschrittene.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns mit den Mechanismen zum Clustering in OpenRefine.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/05-clustering" class="btn btn-primary px-3 py-3">05 Daten mit OpenRefine clustern&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Daten mit OpenRefine filtern und sortieren</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/02-filtern-und-sortieren/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/02-filtern-und-sortieren/</guid><description>&lt;p>Wir erkunden Datensätze mit OpenRefine, indem wir sie filtern und sortieren.&lt;/p>
&lt;blockquote>
&lt;p>Facets in der &lt;a href="https://docs.openrefine.org/manual/facets" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;p>Sortieren in der &lt;a href="https://docs.openrefine.org/manual/sortview" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;h2 id="hintergrund">Hintergrund&lt;/h2>
&lt;p>OpenRefine bietet umfangreiche Möglichkeiten Daten zu sortieren und zu filtern. So können Filter kombiniert und Teilmengen des Datensatzes gesammelt bearbeitet werden.&lt;/p>
&lt;p>Wir fokussieren uns in diesem Workshop auf die Funktionen, mit denen man &lt;strong>Text&lt;/strong> ordnen und filtern kann.
Um Daten zu filtern gibt es in OpenRefine so genannte &amp;ldquo;Facets&amp;rdquo;.
Diese lassen sich über das Spaltenmenü via &amp;ldquo;Facet&amp;rdquo; aktivieren.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-text-facet">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine Text Facet." srcset="
/workshop/openrefine-einsteiger/02-filtern-und-sortieren/screenshot_openrefine_facets_1_hu6a20f51aebd89cd986bfb00c65782be7_16609_9533f557df259cd1aa8b02e2dc22eb34.webp 400w,
/workshop/openrefine-einsteiger/02-filtern-und-sortieren/screenshot_openrefine_facets_1_hu6a20f51aebd89cd986bfb00c65782be7_16609_e52a27c1da62b2559a753dbb64dcfb69.webp 760w,
/workshop/openrefine-einsteiger/02-filtern-und-sortieren/screenshot_openrefine_facets_1_hu6a20f51aebd89cd986bfb00c65782be7_16609_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/02-filtern-und-sortieren/screenshot_openrefine_facets_1_hu6a20f51aebd89cd986bfb00c65782be7_16609_9533f557df259cd1aa8b02e2dc22eb34.webp"
width="291"
height="582"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine Text Facet.
&lt;/figcaption>&lt;/figure>
&lt;p>Das &amp;ldquo;Text Facet&amp;rdquo; zeigt alle Werte einer Spalte an.
Man kann die Werte nach Name oder Anzahl sortieren lassen, ein oder mehrere Werte auswählen oder die Auswahl umkehren (&amp;ldquo;invert&amp;rdquo;).&lt;/p>
&lt;p>Das &amp;ldquo;Text Facet&amp;rdquo; über der Spalte Vorname in Abbildung 1 informiert uns, dass der häufigste Vorname &amp;ldquo;Max&amp;rdquo; lautet.
Von den Personen mit Vornamen &amp;ldquo;Max&amp;rdquo; haben laut der Spalte &amp;ldquo;akad. Grad/Titel&amp;rdquo; zwei einen Doktortitel.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-text-facet">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine Text Facet." srcset="
/workshop/openrefine-einsteiger/02-filtern-und-sortieren/screenshot_openrefine_facets_2_hu522b908b357d69022f2dc7b97bb0a4f6_20183_50fbab04ec026985fb5750dc940256c8.webp 400w,
/workshop/openrefine-einsteiger/02-filtern-und-sortieren/screenshot_openrefine_facets_2_hu522b908b357d69022f2dc7b97bb0a4f6_20183_1ed677ab8d311c7a5a3d2e1559f06eef.webp 760w,
/workshop/openrefine-einsteiger/02-filtern-und-sortieren/screenshot_openrefine_facets_2_hu522b908b357d69022f2dc7b97bb0a4f6_20183_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/02-filtern-und-sortieren/screenshot_openrefine_facets_2_hu522b908b357d69022f2dc7b97bb0a4f6_20183_50fbab04ec026985fb5750dc940256c8.webp"
width="251"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine Text Facet.
&lt;/figcaption>&lt;/figure>
&lt;p>Facets lassen sich auch kombinieren. Wählen wir zusätzlich im &amp;ldquo;Text Facet&amp;rdquo; zum Titel den &amp;ldquo;Dr. med.&amp;rdquo; aus und aktivieren das &amp;ldquo;Text Facet&amp;rdquo; auf der Spalte &amp;ldquo;Beruf&amp;rdquo;, so erfahren wir in Abbildung 2, dass ein Max Arzt und ein Max Zahnarzt war.&lt;/p>
&lt;div class="alert alert-info">
&lt;div>
Die Gurs-Daten wurden zur Veröffentlichung im Blog aufbereitet.
Die Spalten für die Namen und Berufe wurden dabei entfernt!
&lt;/div>
&lt;/div>
&lt;h2 id="aufgabe-1-spalten-mit-facets-analysieren">Aufgabe 1: Spalten mit Facets analysieren&lt;/h2>
&lt;p>Wir arbeiten mit dem Gurs-Datensatz, den wir in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/">&amp;ldquo;Projekte in OpenRefine laden und verwalten&amp;rdquo;&lt;/a> geladen haben.&lt;/p>
&lt;p>Untersuchen Sie mit &amp;ldquo;Text Facets&amp;rdquo; die einzelnen Spalten.
Diese rufen Sie auf über
&amp;ldquo;Spalte&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Text facet&amp;rdquo;.
Fällt Ihnen bei den Werten einzelner Spalten etwas auf?&lt;/p>
&lt;p>Besteht Bedarf die Werte einzelner Spalten zu korrigieren?&lt;/p>
&lt;p>Notieren Sie Ihre Beobachtungen.&lt;/p>
&lt;h2 id="aufgabe-2-andere-facets">Aufgabe 2: Andere Facets&lt;/h2>
&lt;p>Was gibt es noch für &amp;ldquo;Facets&amp;rdquo;?&lt;/p>
&lt;p>Gibt es Spalten mit passenden Daten um die &amp;ldquo;Facets&amp;rdquo; darauf anzuwenden?&lt;/p>
&lt;p>&lt;strong>Hinweis&lt;/strong>: Um ein spezielles Facet für &amp;ldquo;Number&amp;rdquo; oder &amp;ldquo;Date&amp;rdquo; zu verwenden, muss die entsprechende Spalte zuerst in diesen Datentyp umgewandelt werden. Das geht zum Beispiel über
&amp;ldquo;Spalte&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Common transforms&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;To number&amp;rdquo;.&lt;/p>
&lt;h2 id="aufgabe-3-facets-auf-alle-spalten">Aufgabe 3: Facets auf alle Spalten&lt;/h2>
&lt;p>Es gibt eine &amp;ldquo;All&amp;rdquo; Spalte, wo Aktionen für alle Spalten verfügbar sind.&lt;/p>
&lt;p>Wir verwenden das &amp;ldquo;Facet by blank (null or empty string)&amp;rdquo; um Leerzeilen zu identifizieren. In den 4.000 Einträgen (rows) sollte es fünf Leerzeilen geben. Das Facet wird geöffnet über
&amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Facet by blank (null or empty string)&amp;rdquo;.&lt;/p>
&lt;p>Warum werden diese fünf Leerzeilen mit dem Facet nicht gefunden?&lt;/p>
&lt;details class="spoiler " id="spoiler-12">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Sollten Ihnen nur 3.995 Zeilen angezeigt werden, so haben Sie die Leerzeilen beim Importieren der Daten schon gelöscht.&lt;/li>
&lt;li>Es gibt in dem Datensatz fünf Zeilen, die lediglich Leerzeichen enthalten. Diese sind aus Sicht von OpenRefine nicht &amp;ldquo;leer&amp;rdquo;.
Wir werden in einer späteren Aufgabe lernen, wie wir diese Leerzeichen und Zeilen automatisiert entfernen können.&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-4-zeilen-sortieren">Aufgabe 4: Zeilen sortieren&lt;/h2>
&lt;p>Wir sortieren die Spalte &amp;ldquo;Geburtsort&amp;rdquo; via
&amp;ldquo;Geburtsort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Sort&amp;hellip;&amp;rdquo;
und sortieren die Spalte als alphabetisch aufsteigenden Text.
Dadurch erscheint ein neues Menü in der Kopfzeile namens &amp;ldquo;Sort&amp;rdquo;, welches wir in Abbildung 3 markiert haben.&lt;/p>
&lt;p>Wird dadurch eine Aktion in der &amp;ldquo;History&amp;rdquo; hinterlegt?
Was passiert in der &amp;ldquo;History&amp;rdquo;, wenn wir in dem Menü &amp;ldquo;Sort&amp;rdquo; die Aktion &amp;ldquo;Reorder rows permanently&amp;rdquo; ausführen?&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-mit-dem-menü-zum-sortieren">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine mit dem Menü zum Sortieren." srcset="
/workshop/openrefine-einsteiger/02-filtern-und-sortieren/screenshot_openrefine_sort_hu5905c9f4a7ca257d990f586cdb920aec_19571_8d4cd29a369cbccd1409c5f720e7bee7.webp 400w,
/workshop/openrefine-einsteiger/02-filtern-und-sortieren/screenshot_openrefine_sort_hu5905c9f4a7ca257d990f586cdb920aec_19571_5412158baba49bbd6ca4d975a3a79b43.webp 760w,
/workshop/openrefine-einsteiger/02-filtern-und-sortieren/screenshot_openrefine_sort_hu5905c9f4a7ca257d990f586cdb920aec_19571_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/02-filtern-und-sortieren/screenshot_openrefine_sort_hu5905c9f4a7ca257d990f586cdb920aec_19571_8d4cd29a369cbccd1409c5f720e7bee7.webp"
width="760"
height="156"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine mit dem Menü zum Sortieren.
&lt;/figcaption>&lt;/figure>
&lt;p>Machen Sie abschließend die Sortierung wieder rückgängig.&lt;/p>
&lt;p>&lt;strong>Hinweis&lt;/strong>: In der Spalte Geburtsort gibt es einige Orte, die nur eine GND-ID haben. Darum kümmern wir uns in einer späteren Aufgabe.&lt;/p>
&lt;h2 id="aufgabe-5-spalten-löschen--ausblenden">Aufgabe 5: Spalten löschen / ausblenden&lt;/h2>
&lt;p>Wir haben in Aufgabe 1 festgestellt, dass die Spalte &amp;ldquo;Geburtsdatum (beschreibend)&amp;rdquo; leer ist.&lt;/p>
&lt;p>Wir können diese Spalte entweder via
&amp;ldquo;Geburtsdatum (beschreibend)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Remove this column&amp;rdquo;
löschen oder via
&amp;ldquo;Geburtsdatum (beschreibend)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;View&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Collapse this column&amp;rdquo;
ausblenden.&lt;/p>
&lt;p>Testen Sie die beiden Varianten. Was sind die Vor- und Nachteile davon?&lt;/p>
&lt;h2 id="aufgabe-6-spalten-sortieren">Aufgabe 6: Spalten sortieren&lt;/h2>
&lt;p>Um Spalten umzusortieren gibt es zwei Möglichkeiten:&lt;/p>
&lt;ol>
&lt;li>Im Spaltenmenü unter &amp;ldquo;Edit column&amp;rdquo; die Spalte nach links oder rechts verschieben.&lt;/li>
&lt;li>Im &amp;ldquo;All&amp;rdquo; Menü unter &amp;ldquo;Edit columns&amp;rdquo; den Dialog &amp;ldquo;Re-order / remove columns&amp;hellip;&amp;rdquo; aufrufen.&lt;/li>
&lt;/ol>
&lt;p>Testen Sie die Funktionen und machen Sie sie anschließend wieder rückgängig.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Die Möglichkeit Daten mit Facets zu filtern und sie mit anderen Facets oder Filtern zu kombinieren ist ein häufig genutztes Feature von uns.
Das Umbenennen und Sortieren von Spalten fühlt sich manchmal jedoch etwas aufwendiger an, als es sein sollte.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil löschen wir Daten in OpenRefine, wandeln sie um und Bearbeiten sie.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren" class="btn btn-primary px-3 py-3">03 Daten mit OpenRefine transformieren&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Daten mit OpenRefine umwandeln</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/</guid><description>&lt;p>Wir lernen verschiedene Methoden kennen um Daten aufzuräumen und umzuwandeln.&lt;/p>
&lt;blockquote>
&lt;p>Daten transformieren in der &lt;a href="https://docs.openrefine.org/manual/transforming" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;h2 id="hintergrund">Hintergrund&lt;/h2>
&lt;p>OpenRefine bietet unterschiedliche Arten an Daten umzuwandeln.
Dies kann manuell auf Zellebene passieren, in einem &amp;ldquo;Facet&amp;rdquo;, auf Spaltenebene oder für bestimmte Aktionen auf dem kompletten Datensatz.&lt;/p>
&lt;p>In den folgenden Aufgaben werden wir nun aktiv Daten filtern, umwandeln und zusammenführen.&lt;/p>
&lt;h2 id="aufgabe-1-leere-zeilen-identifizieren-und-löschen">Aufgabe 1: Leere Zeilen identifizieren und löschen&lt;/h2>
&lt;p>Wie in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/02-filtern-und-sortieren/#aufgabe-3-facets-auf-alle-spalten">Aufgabe 3 in 02 Filtern und Sortieren&lt;/a> verwenden wir das &amp;ldquo;Facet by blank (null or empty string)&amp;rdquo; um Leerzeilen zu identifizieren.
Denn in den 4.000 Einträgen (rows) sollte es 5 Leerzeilen geben.
Diese werden jedoch nicht angezeigt, da sie nicht leer sind, sondern Leerzeichen beinhalten.&lt;/p>
&lt;p>Die Leerzeichen können wir global über
&amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit all columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Trim leading and trailing whitespace&amp;rdquo;
entfernen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-mit-blank-facet">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine mit Blank Facet." srcset="
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_blank_hu378b95591ddb24bf1fc8cc32ccdc3103_28410_32164c41a1792ed7b6bbcdfdcbf4f0e4.webp 400w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_blank_hu378b95591ddb24bf1fc8cc32ccdc3103_28410_66f621a0f4b2860544a20fe42bcc1e49.webp 760w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_blank_hu378b95591ddb24bf1fc8cc32ccdc3103_28410_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_blank_hu378b95591ddb24bf1fc8cc32ccdc3103_28410_32164c41a1792ed7b6bbcdfdcbf4f0e4.webp"
width="760"
height="231"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine mit Blank Facet.
&lt;/figcaption>&lt;/figure>
&lt;p>Anschließend können wir, wie in Abbildung 1, mit dem &amp;ldquo;Facet by blank (null or empty string)&amp;rdquo; die Leerzeilen auswählen und via
&amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit rows&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Remove matching rows&amp;rdquo;
entfernen.&lt;/p>
&lt;p>Gehen Sie noch einmal zurück zu den Bildschirmfotos der Importeinstellungen in &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/">Projekte in OpenRefine laden und verwalten&lt;/a> und vergleichen diese für Aufgabe 1 und 2.&lt;/p>
&lt;p>Wir können Probleme mit Leerzeilen schon beim Importieren lösen, indem wir, wie bei Aufgabe 2, das Kontrollkästchen bei &amp;ldquo;Trim leading &amp;amp; trailing whitespace from strings&amp;rdquo; aktivieren und das Kontrollkästchen bei &amp;ldquo;Store blank rows&amp;rdquo; abwählen.
Das ist jedoch nicht immer möglich, oder manchmal wird es vergessen.&lt;/p>
&lt;h2 id="aufgabe-2-geschlechter-vereinheitlichen">Aufgabe 2: Geschlechter vereinheitlichen&lt;/h2>
&lt;p>Die Geschlechtsbezeichnungen in der Spalte &amp;ldquo;Geschlecht (m/w)&amp;rdquo; sind sehr uneinheitlich.
Wir wollen dies vereinheitlichen, so dass überall nur noch die Werte &amp;ldquo;m&amp;rdquo; und &amp;ldquo;w&amp;rdquo; stehen.&lt;/p>
&lt;p>Dafür testen wir mehrere Methoden.&lt;/p>
&lt;h3 id="1-einzeln-bearbeiten">1. Einzeln bearbeiten&lt;/h3>
&lt;p>Wenn wir mit der Maus über eine Zelle gehen, dann erscheint wie in Abbildung 2 eine blaue Bedienfläche mit der Bezeichnung &amp;ldquo;edit&amp;rdquo;.
Darüber können wir einzelne Zellen bearbeiten.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-edit-bedienfläche-in-zelle">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von Edit Bedienfläche in Zelle." srcset="
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_geschlecht_edit_cell_hu9003179a9c2d1df58f6647238692909f_1878_5043ab5c026ba3cf3f00d682d398b4f2.webp 400w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_geschlecht_edit_cell_hu9003179a9c2d1df58f6647238692909f_1878_4d16fa3e640c9369efe7485262fd8b09.webp 760w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_geschlecht_edit_cell_hu9003179a9c2d1df58f6647238692909f_1878_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_geschlecht_edit_cell_hu9003179a9c2d1df58f6647238692909f_1878_5043ab5c026ba3cf3f00d682d398b4f2.webp"
width="123"
height="42"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von Edit Bedienfläche in Zelle.
&lt;/figcaption>&lt;/figure>
&lt;details class="spoiler " id="spoiler-9">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Die Bearbeitung auf diesem Weg kann zwar rückgängig gemacht, aber &lt;strong>nicht&lt;/strong> als Aktion exportiert werden!&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;h3 id="2-im-facet-bearbeiten">2. Im Facet bearbeiten&lt;/h3>
&lt;p>Wenn wir mit der Maus über einen Wert im Facet gehen, dann erscheint wie in Abbildung 3 ein blauer &amp;ldquo;edit&amp;rdquo; Link.
Darüber können wir alle Zellen mit diesem Wert in der Spalte gleichzeitig bearbeiten.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-edit-bedienfläche-in-facet">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von Edit Bedienfläche in Facet." srcset="
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_geschlecht_hu080af32c4dc2c9b0fcea7c796a263dec_11914_944b096cb01d3aaa514dd3112e2eac0e.webp 400w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_geschlecht_hu080af32c4dc2c9b0fcea7c796a263dec_11914_de525552bfa6b853e0c335c741dbdc6c.webp 760w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_geschlecht_hu080af32c4dc2c9b0fcea7c796a263dec_11914_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_geschlecht_hu080af32c4dc2c9b0fcea7c796a263dec_11914_944b096cb01d3aaa514dd3112e2eac0e.webp"
width="288"
height="432"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von Edit Bedienfläche in Facet.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="3-ersetzen-in-der-spalte">3. Ersetzen in der Spalte&lt;/h3>
&lt;p>Im Spaltenmenü findet sich unter
&amp;ldquo;Geschlecht (m/w)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Replace&amp;rdquo;
ein Dialog, mit dem in dieser Spalte Ersetzungen durchgeführt werden können.&lt;/p>
&lt;h3 id="4-textfilter-und-transform">4. Textfilter und Transform&lt;/h3>
&lt;p>Eine andere Methode ist eine Kombination aus Textfilter und &amp;ldquo;Transform&amp;rdquo;.
Im Spaltenmenü wählen wir
&amp;ldquo;Geschlecht (m/w)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Textfilter&amp;rdquo;
und geben im Eingabefeld des Filters nur den Buchstaben &amp;ldquo;w&amp;rdquo; ein, der praktischerweise in &amp;ldquo;männlich&amp;rdquo; nicht vorkommt.&lt;/p>
&lt;p>Im &amp;ldquo;Text Facet&amp;rdquo; für die Spalte Geschlecht, sehen wir analog zu Abbildung 4 die gefilterten Werte.&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-kombination-aus-facet-und-textfilter">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit Kombination aus Facet und Textfilter." srcset="
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_filter_geschlecht_hu06f838c25ee978cac463847e92f7f1d7_12086_6bf18f78c0133e7c1a4f78bc23b9db95.webp 400w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_filter_geschlecht_hu06f838c25ee978cac463847e92f7f1d7_12086_bbe7c44877f809d106d29a1505f0aeaa.webp 760w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_filter_geschlecht_hu06f838c25ee978cac463847e92f7f1d7_12086_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_filter_geschlecht_hu06f838c25ee978cac463847e92f7f1d7_12086_6bf18f78c0133e7c1a4f78bc23b9db95.webp"
width="288"
height="524"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit Kombination aus Facet und Textfilter.
&lt;/figcaption>&lt;/figure>
&lt;p>Anschließend rufen wir den Dialog zum Transformieren über das Spaltenmenü via
&amp;ldquo;Geschlecht (m/w)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
auf.&lt;/p>
&lt;p>In dem Dialog könnte komplexer Code geschrieben werden, wir wollen den Inhalt jeder Zelle jedoch einfach mit dem Wert &lt;code>&amp;quot;w&amp;quot;&lt;/code> ersetzen. Die Anführungszeichen sind wichtig, da wir dadurch OpenRefine mitteilen, dass wir den Wert &lt;code>w&lt;/code> meinen, und keinen Programmcode.&lt;/p>
&lt;h2 id="aufgabe-3-spalte-akad-gradtitel-vereinheitlichen">Aufgabe 3: Spalte akad. Grad/Titel vereinheitlichen&lt;/h2>
&lt;p>In der Spalte &amp;ldquo;akad. Grad/Titel&amp;rdquo; sind die akademischen Grade uneinheitlich geschrieben (siehe auch Abbildung 5).
Überlegen Sie, welche der in Aufgabe 2 gelernten Methoden hier geeignet wäre und vereinheitlichen Sie die Titel.&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-text-facet-auf-spalte-titel">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit Text Facet auf Spalte Titel." srcset="
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_titel_hud98cf43111f0fa64f872a053c322fb7f_11328_30b0c4a31aab0daf18f39dcf2dc2628a.webp 400w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_titel_hud98cf43111f0fa64f872a053c322fb7f_11328_099667ca615f430511ba7213d8baa03e.webp 760w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_titel_hud98cf43111f0fa64f872a053c322fb7f_11328_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_facet_titel_hud98cf43111f0fa64f872a053c322fb7f_11328_30b0c4a31aab0daf18f39dcf2dc2628a.webp"
width="288"
height="435"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit Text Facet auf Spalte Titel.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-4-spalten-auftrennen">Aufgabe 4: Spalten auftrennen&lt;/h2>
&lt;p>Bei den Ortsangaben sind der Ortsname und die GND-ID des Ortes mit &lt;code>|&lt;/code> getrennt in einer Zelle.
Wir wollen die Spalte &amp;ldquo;Geburtsort&amp;rdquo; auftrennen, so dass wir jeweils eine Spalte mit dem Ortsnamen und eine mit der zugehörigen GND-ID haben.&lt;/p>
&lt;p>Dafür verwenden wir im Spaltenmenü den Dialog
&amp;ldquo;Geburtsort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split into several columns&amp;hellip;&amp;rdquo;
mit den in Abbildung 6 gezeigten Einstellungen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-vom-dialog-zum-auftrennen-von-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto vom Dialog zum Auftrennen von Spalten." srcset="
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_split_column_hua24e41abaf33f0085585e637446515dd_15506_5aa6213ad2f873d5991a6d07d190fe34.webp 400w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_split_column_hua24e41abaf33f0085585e637446515dd_15506_905ab864be45f409dc7f9cbca87ce243.webp 760w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_split_column_hua24e41abaf33f0085585e637446515dd_15506_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_split_column_hua24e41abaf33f0085585e637446515dd_15506_5aa6213ad2f873d5991a6d07d190fe34.webp"
width="602"
height="321"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto vom Dialog zum Auftrennen von Spalten.
&lt;/figcaption>&lt;/figure>
&lt;p>Anschließend entfernen wir überflüssige Leerzeichen via
&amp;ldquo;Geburtsort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Common transforms&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Trim leading and trailing whitespace&amp;rdquo;
und benennen die neuen Spalten entsprechend in &amp;ldquo;Geburtsort&amp;rdquo; und &amp;ldquo;Geburtsort (GND-ID)&amp;rdquo; um.&lt;/p>
&lt;details class="spoiler " id="spoiler-24">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Mit Hilfe des regulären Ausdrucks &lt;code>\s*\|\s*&lt;/code> hätten wir die Leerzeichen beim Aufsplitten auch direkt entfernen können.&lt;/li>
&lt;li>Vielleicht sind Ihnen Zeilen aufgefallen, wo anstelle des Ortes nur die GND-ID steht. Um diese kümmern wir uns später.&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-5-spalten-zusammenführen">Aufgabe 5: Spalten zusammenführen&lt;/h2>
&lt;p>Beim Sterbedatum haben wir das umgekehrte Problem. Hier ist das Datum in drei Spalten aufgeteilt, wir wollen jedoch eine Spalte haben.
Bevor wir die Spalten zusammenführen, prüfen wir, ob die Werte in den einzelnen Spalten sinnvoll sind, und korrigieren die Werte bei Bedarf.&lt;/p>
&lt;p>Anschließend rufen wir im Spaltenmenü den Dialog zum Zusammenführen von Spalten auf
&amp;ldquo;Todesdatum (Tag)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Join columns&amp;hellip;&amp;rdquo;
mit den in Abbildung 7 gezeigten Einstellungen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-vom-dialog-zum-zusammenführen-von-spalten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto vom Dialog zum Zusammenführen von Spalten." srcset="
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_join_columns_hu5409e89bb940588afaebe13a709cb939_35082_072651385d676f82fd4dd4c0b9b198b2.webp 400w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_join_columns_hu5409e89bb940588afaebe13a709cb939_35082_eb0b404a55e10512c6b9398741113963.webp 760w,
/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_join_columns_hu5409e89bb940588afaebe13a709cb939_35082_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/screenshot_openrefine_join_columns_hu5409e89bb940588afaebe13a709cb939_35082_072651385d676f82fd4dd4c0b9b198b2.webp"
width="760"
height="437"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto vom Dialog zum Zusammenführen von Spalten.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-6-datum-vereinheitlichen">Aufgabe 6: Datum vereinheitlichen&lt;/h2>
&lt;p>In der Spalte &amp;ldquo;Geburtsdatum (exakt)&amp;rdquo; gibt es mehrere Formate für das Geburtsdatum:&lt;/p>
&lt;ul>
&lt;li>&amp;ldquo;31.03.1920&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;31-03-1920&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;31. März 1920&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>OpenRefine bietet verschiedene Funktionen an, um mit Daten zu arbeiten.&lt;/p>
&lt;blockquote>
&lt;p>Datumsfunktionen in der &lt;a href="https://docs.openrefine.org/manual/grelfunctions#date-functions" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;p>Um die Daten in ein einheitliches Format zu bringen, wandeln wir sie zuerst in ein Datumsobjekt um und schreiben sie anschließend als Text wieder raus.&lt;/p>
&lt;p>Dafür müssen wir OpenRefine noch mitteilen, wie die Eingabe- und Zielformate aussehen:&lt;/p>
&lt;ul>
&lt;li>&amp;ldquo;dd.MM.yyyy&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;dd-MM-yyyy&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;dd. MMMM yyyy&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>Um die Daten umzuwandeln öffnen wir den Dialog zum Transformieren über das Spaltenmenü von
&amp;ldquo;Geburtsdatum (exakt)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;rdquo;
und verwenden den Ausdruck:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toDate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;dd.MM.yyyy&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;dd-MM-yyyy&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;dd. MMMM yyyy&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;dd.MM.yyyy&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;details class="spoiler " id="spoiler-30">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>OpenRefine bietet die Möglichkeit Programmcode zu nutzen um Transformationen durchzuführen. Dazu gehören &lt;a href="https://docs.openrefine.org/manual/jythonclojure" target="_blank" rel="noopener">Clojure/Python&lt;/a> und die &lt;a href="https://docs.openrefine.org/manual/expressions" target="_blank" rel="noopener">General Refine Expression Language (GREL)&lt;/a>.&lt;/li>
&lt;li>Die Datumsumwandlung gehört zu den Funktionen von GREL, die wir auf Grund ihrer Relevanz in diesen Einführungsworkshop mit aufgenommen haben.&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-7-daten-mit-filter-auf-eine-andere-spalte-übertragen">Aufgabe 7: Daten mit Filter auf eine andere Spalte übertragen&lt;/h2>
&lt;p>In der Spalte &amp;ldquo;Geburtsort&amp;rdquo; ist bei einem Ort die GND-ID verrutscht und der Ortsname verloren gegangen.
Bei dem Ort handelt es sich um &amp;ldquo;Breslau (Polen)&amp;rdquo; mit der GND-ID &amp;ldquo;4008216-7&amp;rdquo;.&lt;/p>
&lt;p>Um dies zu beheben erstellen wir ein &amp;ldquo;Text Facet&amp;rdquo; für die Spalte &amp;ldquo;Geburtsort&amp;rdquo; und filtern nur die Einträge mit &amp;ldquo;4008216-7&amp;rdquo;.
Es gibt nun verschiedene Möglichkeiten die Daten in die Spalte &amp;ldquo;Geburtsort (GND-ID)&amp;rdquo; zu übertragen.&lt;/p>
&lt;ol>
&lt;li>Zellen einzeln bearbeiten&lt;/li>
&lt;li>Ein weiteres &amp;ldquo;Text Facet&amp;rdquo; für die Spalte &amp;ldquo;Geburtsort (GND-ID)&amp;rdquo; erstellen und in beiden die Werte gesammelt bearbeiten.&lt;/li>
&lt;li>Die Werte via Textfilter oder &amp;ldquo;Text Facet&amp;rdquo; filtern und die Spalten zusammenführen (
&amp;ldquo;Geburtsort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Join columns&amp;hellip;&amp;rdquo;),
ohne die Original Spalte zu löschen.&lt;/li>
&lt;li>Im Spaltenmenü via
&amp;ldquo;Geburtsort (GND-ID)&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;rdquo;
die Daten aus der anderen Spalte mit dem Ausdruck &lt;code>row.cells[&amp;quot;Geburtsort&amp;quot;].value&lt;/code> kopieren.&lt;/li>
&lt;/ol>
&lt;p>Alle Varianten haben ihre Berechtigung und je nach Kontext oder Anwendungsfall eignet sich die ein oder andere eher.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Die Kombination aus Facets/Filtern und den Bearbeitungsmöglichkeiten machen OpenRefine zu unserem Liebling beim Aufräumen von Daten (&lt;em>Data Cleaning&lt;/em>). Manchmal vermissen wir es jedoch größere Bereiche manuell auszuwählen und in eine andere Spalte zu Verschieben.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil lernen wir verschiedene Exportmöglichkeiten in OpenRefine kennen.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/04-exportieren" class="btn btn-primary px-3 py-3">04 Daten mit OpenRefine exportieren&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Die Oberfläche von OpenRefine</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/oberflaeche/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/oberflaeche/</guid><description>&lt;p>Wir geben einen Überblick über die OpenRefine Oberfläche.&lt;/p>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;div class="mermaid">---
title: OpenRefine Setup
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph server[fas:fa-server Server]
server_api[fas:fa-code Reconciliation API]
end
subgraph laptop[fas:fa-laptop Laptop]
browser[far:fa-window-maximize Browser]
laptop_or[fas:fa-gem OpenRefine]
end
browser -.-> laptop_or
laptop_or -.-> server_api
&lt;/div>
&lt;h2 id="die-startseite">Die Startseite&lt;/h2>
&lt;p>Wir verwenden OpenRefine auf unserem Laptop oder PC im Browser.
In Abbildung 1 ist die Startseite von OpenRefine gezeigt.
Hier kann von unterschiedlichen Datenquellen heraus ein neues Projekt erstellt werden.
Ein existierendes Projekt kann man via &amp;ldquo;Open Project&amp;rdquo; öffnen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-der-startseite-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von der Startseite in OpenRefine." srcset="
/workshop/openrefine-einsteiger/oberflaeche/screenshot-openrefine-create_hu65d14ab2a214edd303274b6512583563_24724_4b12ae0a6c4c7eaa372f4e4e894a8abb.webp 400w,
/workshop/openrefine-einsteiger/oberflaeche/screenshot-openrefine-create_hu65d14ab2a214edd303274b6512583563_24724_b10d2c0e320f96e65e6fe1245f4eb827.webp 760w,
/workshop/openrefine-einsteiger/oberflaeche/screenshot-openrefine-create_hu65d14ab2a214edd303274b6512583563_24724_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/oberflaeche/screenshot-openrefine-create_hu65d14ab2a214edd303274b6512583563_24724_4b12ae0a6c4c7eaa372f4e4e894a8abb.webp"
width="760"
height="177"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von der Startseite in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="die-projektübersicht">Die Projektübersicht&lt;/h2>
&lt;p>Mit &amp;ldquo;Open Project&amp;rdquo; gelangt man zu der in Abbildung 2 gezeigten Projektübersicht.
Die Projekte kann man nach &amp;ldquo;Tags&amp;rdquo; filtern.
Die blaue Schrift zeigt hier Links an, mit denen zum Beispiel die Projektmetadaten bearbeitet oder Projekte geöffnet werden können.&lt;/p>
&lt;p>Praktisch ist in dieser Ansicht auch der Link zum Speicherort der Projekte, falls man diese zum Beispiel für ein Update sichern möchte.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-der-projektübersicht-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von der Projektübersicht in OpenRefine." srcset="
/workshop/openrefine-einsteiger/oberflaeche/screenshot-openrefine-projects_huf52aa0a0083f300f6d7b67cc335a6f3e_32877_7e56b8b883506d44a1a0025f77164d25.webp 400w,
/workshop/openrefine-einsteiger/oberflaeche/screenshot-openrefine-projects_huf52aa0a0083f300f6d7b67cc335a6f3e_32877_9c764dbc472adcf4ffced5fabf76f0c2.webp 760w,
/workshop/openrefine-einsteiger/oberflaeche/screenshot-openrefine-projects_huf52aa0a0083f300f6d7b67cc335a6f3e_32877_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/oberflaeche/screenshot-openrefine-projects_huf52aa0a0083f300f6d7b67cc335a6f3e_32877_7e56b8b883506d44a1a0025f77164d25.webp"
width="718"
height="302"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von der Projektübersicht in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="die-bearbeitungsansicht">Die Bearbeitungsansicht&lt;/h2>
&lt;p>Die Daten in der Bearbeitungsansicht eines Projektes werden wie in Abbildung 3 gezeigt tabellarisch dargestellt.
Zurück zu Startseite kommt man durch einen Klick auf das OpenRefine Logo oder über die in OpenRefine neu eingeführte Schaltfläche mit der Aufschrift &amp;ldquo;Open&amp;rdquo;.
Neben der Schaltfläche gibt es ein so genanntes Dropdown-Menü
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i> mit verschiedenen Möglichkeiten die Daten zu exportieren.&lt;/p>
&lt;p>Der Name des Projektes lässt sich in dieser Ansicht mit einem Klick auf den Text bearbeiten.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-der-bearbeitungsansicht-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von der Bearbeitungsansicht in OpenRefine." srcset="
/workshop/openrefine-einsteiger/oberflaeche/screenshot-openrefine-project_huadf8a2eef708680b7d3fc7e836154574_106401_40f74c71459d97e12800894909bd8691.webp 400w,
/workshop/openrefine-einsteiger/oberflaeche/screenshot-openrefine-project_huadf8a2eef708680b7d3fc7e836154574_106401_65268dae8ea7c8151f79f6515f014f95.webp 760w,
/workshop/openrefine-einsteiger/oberflaeche/screenshot-openrefine-project_huadf8a2eef708680b7d3fc7e836154574_106401_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/oberflaeche/screenshot-openrefine-project_huadf8a2eef708680b7d3fc7e836154574_106401_40f74c71459d97e12800894909bd8691.webp"
width="724"
height="478"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von der Bearbeitungsansicht in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>In der nächsten Zeile finden sich verschiedene Navigationselemente.
Ganz links kann zwischen der Facet- und Filter-Ansicht und der History hin- und hergewechselt werden.
Über der Tabelle kann zwischen dem Zeilen- und dem Record-Modus gewechselt werden.&lt;/p>
&lt;p>Außerdem gibt es die Möglichkeit auszuwählen, wie viele Zeilen/Records pro Seite angezeigt werden sollen, und ganz rechts kann dann durch die einzelnen Seiten geblättert werden.&lt;/p>
&lt;p>Die Bearbeitungsfunktionalität versteckt sich bei OpenRefine in so genannten Dropdown-Menüs
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i> über jeder Spalte, die wir kurzerhand &amp;ldquo;Spaltenmenüs&amp;rdquo; nennen.
Es gibt ganz links auch eine &amp;ldquo;All&amp;rdquo;-Spalte, mit der Aktionen auf allen Spalten angewendet, oder einzelne Zeilen mit Sternen oder Fahnen markiert werden können.&lt;/p>
&lt;p>Die Facets und Filter ganz links können einzeln reduziert, geschlossen und miteinander kombiniert werden.
Mit ihnen können die Daten nicht nur zur Ansicht gefiltert werden, sondern auch Bearbeitungen auf einer Teilmenge des Datensatzes durchgeführt werden.&lt;/p>
&lt;h2 id="die-sprache-der-benutzeroberfläche">Die Sprache der Benutzeroberfläche&lt;/h2>
&lt;p>Die Sprache der Benutzeroberfläche von OpenRefine lässt sich von der Startseite ausgehend unter &amp;ldquo;Language Settings&amp;rdquo; auch auf Deutsch umstellen.
Wir verzichten im FDMLab und für diesen Workshop explizit darauf.&lt;/p>
&lt;p>Da die Dokumentation (noch) nicht auf Deutsch verfügbar ist, hat es sich nach unserer Erfahrung gezeigt, dass die Orientierung in OpenRefine mit englischer Benutzeroberfläche einfacher ist.
Bei einer deutschen Benutzeroberfläche ist es deutlich schwieriger die in der Dokumentation beschriebenen Menüs, Schaltflächen und Konzepte zu finden.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Es zuerst etwas gewöhnungsbedürftig die Funktionen in den Spaltenmenüs zu finden und nicht zum Beispiel via Rechtsklick in einem Kontextmenü.
Auch die räumliche Trennung von Daten und Funktionalität in OpenRefine ist im direkten Vergleich mit Excel ungewohnt, da man in Excel Formeln direkt in die Datenzellen schreiben kann.&lt;/p>
&lt;p>Jedoch gewöhnten wir und unsere bisherigen Workshop Teilnehmer uns ziemlich schnell an das Bedienkonzept von OpenRefine.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil gibt es eine Erklärung zur Installation von OpenRefine.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/00-installieren" class="btn btn-primary px-3 py-3">00 Openrefine Installieren&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - OpenRefine installieren</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/00-installieren/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/00-installieren/</guid><description>&lt;p>Wir &amp;ldquo;installieren&amp;rdquo; OpenRefine als portable Anwendung.
Anschließend starten wir die Anwendung.&lt;/p>
&lt;blockquote>
&lt;p>OpenRefine installieren in der &lt;a href="https://docs.openrefine.org/manual/installing" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;h2 id="herunterladen">Herunterladen&lt;/h2>
&lt;p>OpenRefine kann auf der Webseite &lt;a href="https://openrefine.org/download.html" target="_blank" rel="noopener">https://openrefine.org/download.html&lt;/a> heruntergeladen werden.
Wir verwenden für unseren Workshop die Version: &lt;strong>OpenRefine 3.9.3&lt;/strong>.&lt;/p>
&lt;p>Als Distribution verwenden wir das &lt;a href="https://openrefine.org/post_download?version=3.9.3&amp;amp;platform=win-with-java" target="_blank" rel="noopener">Windows kit with embedded Java&lt;/a>. Dadurch ersparen wir uns die separate Installation von Java.&lt;/p>
&lt;h2 id="einrichten">Einrichten&lt;/h2>
&lt;p>Das Archiv &lt;code>openrefine-win-with-java-3.9.3.zip&lt;/code> können wir via Rechtsklick
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Alle extrahieren&amp;quot; entpacken und anschließend den darin enthaltenen Ordner &lt;code>openrefine-3.9.3&lt;/code> kopieren.&lt;/p>
&lt;p>Wir verwenden OpenRefine als &lt;a href="https://de.wikipedia.org/wiki/Portable_Software" target="_blank" rel="noopener">portable Software&lt;/a>.
Das bedeutet, dass OpenRefine nicht installiert wird, und es gibt auch keine Startsymbole auf dem Desktop oder dem Startmenü.&lt;/p>
&lt;p>Es empfiehlt sich auf dem &lt;strong>lokalen&lt;/strong> Rechner in seinen Dateien einen Ordner mit z.B. dem Namen &lt;code>Portable Software&lt;/code> anzulegen, wo solch portable Programme abgelegt werden können.
Dieser Ordner sollte &lt;strong>nicht&lt;/strong> auf einem Netzwerklaufwerk liegen, da von dort aus keine Programme ausgeführt werden können,
bzw. sie sehr langsam laufen.&lt;/p>
&lt;h2 id="starten">Starten&lt;/h2>
&lt;p>Zum Starten öffnen wir die Datei &lt;code>openrefine.exe&lt;/code> im Ordner &lt;code>openrefine-3.9.3&lt;/code>.&lt;/p>
&lt;p>Beim ersten Starten kann es sein, dass sich, wie in Abbildung 1 gezeigt, der &lt;em>SmartScreen&lt;/em> Schutzmechanismus von Windows meldet,
da wir versuchen ein aus dem Internet heruntergeladenes Programm auszuführen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-windows-smartscreen-1">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von Windows SmartScreen 1." srcset="
/workshop/openrefine-einsteiger/00-installieren/screenshot_smart_screen_01_huccde4a8a699a518c1b873b80f9ba0a9c_21967_1a6947edc452286fa898e7b2dcdad9f3.webp 400w,
/workshop/openrefine-einsteiger/00-installieren/screenshot_smart_screen_01_huccde4a8a699a518c1b873b80f9ba0a9c_21967_6fd8762946515f7d400898519682a889.webp 760w,
/workshop/openrefine-einsteiger/00-installieren/screenshot_smart_screen_01_huccde4a8a699a518c1b873b80f9ba0a9c_21967_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/00-installieren/screenshot_smart_screen_01_huccde4a8a699a518c1b873b80f9ba0a9c_21967_1a6947edc452286fa898e7b2dcdad9f3.webp"
width="548"
height="507"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von Windows SmartScreen 1.
&lt;/figcaption>&lt;/figure>
&lt;p>Mit einem Klick auf &amp;ldquo;Weitere Informationen&amp;rdquo; erhalten wir, wie in Abbildung 2 gezeigt, die Möglichkeit OpenRefine &amp;ldquo;Trotzdem aus[zu]führen&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-windows-smartscreen-2">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von Windows SmartScreen 2." srcset="
/workshop/openrefine-einsteiger/00-installieren/screenshot_smart_screen_02_huc2ba586e246abc887cd29d81afd76688_24604_943f04dbca3c0fb1df2f2b8c8bf4a2f7.webp 400w,
/workshop/openrefine-einsteiger/00-installieren/screenshot_smart_screen_02_huc2ba586e246abc887cd29d81afd76688_24604_c1d22a57dd1cf6ab50b1169b8c9c6aed.webp 760w,
/workshop/openrefine-einsteiger/00-installieren/screenshot_smart_screen_02_huc2ba586e246abc887cd29d81afd76688_24604_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/00-installieren/screenshot_smart_screen_02_huc2ba586e246abc887cd29d81afd76688_24604_943f04dbca3c0fb1df2f2b8c8bf4a2f7.webp"
width="548"
height="507"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von Windows SmartScreen 2.
&lt;/figcaption>&lt;/figure>
&lt;p>Anschließend öffnet sich eine so genannte Konsole, die den OpenRefine Server startet. Die Bedienoberfläche öffnet sich im Webbrowser unter &lt;code>http://127.0.0.1:3333/&lt;/code>.&lt;/p>
&lt;h2 id="stoppen">Stoppen&lt;/h2>
&lt;p>Zum Schließen das OpenRefine Konsolenfenster auswählen und wie zum Kopieren von Text die Tastaturkombination &lt;em>STRG-C&lt;/em> drücken.
Dies stellt sicher, dass alle Änderungen am Projekt gespeichert werden.&lt;/p>
&lt;p>Alternativ kann nach kurzer Wartezeit das Konsolenfenster auch einfach geschlossen werden.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Das von uns schon mehrfach gelobte Client-Server-Modell von OpenRefine sorgte beim ersten Start von OpenRefine bei einigen Kursteilnehmerinnen und Kursteilnehmern für Stirnrunzeln.
Ein Programm ohne Einträge im Startmenü, welches irgendwo abgelegt werden kann, in einer Konsole läuft und via Browser bedient wird?&lt;/p>
&lt;p>Aber auch daran konnten wir uns alle recht schnell gewöhnen. Also haben Sie noch Geduld und bleiben Sie noch etwas bei uns im Workshop!&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil laden wir verschiedene Dateien als Projekte in OpenRefine.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden" class="btn btn-primary px-3 py-3">01 Projekte in OpenRefine laden&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Projekte in OpenRefine laden und verwalten</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/</guid><description>&lt;p>Wir laden mehrere Dateien in OpenRefine Projekte und bearbeiten deren Metadaten.&lt;/p>
&lt;blockquote>
&lt;p>Projekte in der &lt;a href="https://docs.openrefine.org/manual/starting" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;h2 id="hintergrund">Hintergrund&lt;/h2>
&lt;p>OpenRefine kann unterschiedliche Dateiformate über verschiedene Quellen in das interne Projektformat importieren. Der &amp;ldquo;übliche&amp;rdquo; Weg ist der Import von einer oder mehreren Dateien, weshalb wir uns vorerst darauf beschränken.&lt;/p>
&lt;h2 id="aufgabe-1-eine-datei-laden">Aufgabe 1: Eine Datei laden&lt;/h2>
&lt;p>Wir werden im Laufe des Workshops häufiger mit einem &lt;strong>Ausschnitt&lt;/strong> der &lt;a href="https://www.landesarchiv-bw.de/de/aktuelles/nachrichten/73495" target="_blank" rel="noopener">Gurs-Deportationsliste&lt;/a> arbeiten, die vom &lt;a href="https://www.landesarchiv-bw.de/de/aktuelles/nachrichten/71420" target="_blank" rel="noopener">Generallandesarchiv Karlsruhe recherchiert&lt;/a> und im FDMLab bereinigt und mit weiteren Normdaten ergänzt wurde.&lt;/p>
&lt;p>Für diesen Workshop wurde die Liste nachträglich mit einigen &amp;ldquo;Problemen&amp;rdquo; versehen, die wir in den nachfolgenden Aufgaben bereinigen werden.
Für diese Aufgabe wollen wir erst einmal nur die Datei &lt;code>01_gurs.csv&lt;/code> in das Projekt &amp;ldquo;Gurs&amp;rdquo; laden.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/01_gurs.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Gurs als CSV&lt;/a>
&lt;p>Beim Projektimport verwenden wir die folgenden Einstellungen:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Project name&lt;/strong>: Gurs&lt;/li>
&lt;li>&lt;strong>Tags&lt;/strong>: Gurs, GND, Workshop, 2024&lt;/li>
&lt;/ul>
&lt;p>Die Optionen für das Format sind als Bildschirmfoto hinterlegt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-parsing-options">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine Parsing Options." srcset="
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_gurs_settings_hu60621eac040320a9ad6fb0b2765fc562_30441_34e175f2d0ab23d34c3d99487b07883e.webp 400w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_gurs_settings_hu60621eac040320a9ad6fb0b2765fc562_30441_483613f4efeb23895037daa7ea94ce6a.webp 760w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_gurs_settings_hu60621eac040320a9ad6fb0b2765fc562_30441_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_gurs_settings_hu60621eac040320a9ad6fb0b2765fc562_30441_34e175f2d0ab23d34c3d99487b07883e.webp"
width="760"
height="207"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine Parsing Options.
&lt;/figcaption>&lt;/figure>
&lt;div class="alert alert-warning">
&lt;div>
Die Gurs-Daten wurden zur Veröffentlichung im Blog aufbereitet, indem Zeilen und Spalten gelöscht sowie die restlichen Spalten zufällig sortiert wurden. Für die Verwendung in den Aufgaben des Workshops ist die Datei nach wie vor geeignet, jedoch &lt;strong>nicht&lt;/strong> für Recherche und Forschungszwecke!
&lt;/div>
&lt;/div>
&lt;h2 id="aufgabe-2-mehrere-dateien-gleichzeitig-laden">Aufgabe 2: Mehrere Dateien gleichzeitig laden&lt;/h2>
&lt;p>Wir haben die Beteiligten des &lt;a href="https://de.wikipedia.org/wiki/Kabinett_Kretschmann_III" target="_blank" rel="noopener">Kabinetts Kretschmann III&lt;/a> getrennt nach Frauen und Männern in zwei CSV Dateien gespeichert (&lt;code>01_kretschmann-kabinett-frauen.csv&lt;/code> und &lt;code>01_kretschmann-kabinett-maenner.csv&lt;/code>).&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgenden zwei Dateien (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/01_kretschmann-kabinett-frauen.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kretschmann Kabinett Frauen als CSV&lt;/a>
&lt;blockquote>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/01_kretschmann-kabinett-maenner.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kretschmann Kabinett Maenner als CSV&lt;/a>
&lt;p>Diese Dateien laden wir gemeinsam in ein OpenRefine Projekt.&lt;/p>
&lt;p>Beim Projektimport verwenden wir die folgenden Einstellungen:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Project name&lt;/strong>: Kretschmann Kabinett III&lt;/li>
&lt;li>&lt;strong>Tags&lt;/strong>: GND, Workshop, 2024&lt;/li>
&lt;/ul>
&lt;p>Die Optionen für das Format sind als Bildschirmfoto hinterlegt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-parsing-options">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine Parsing Options." srcset="
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_kretschmann_settings_hu8224cd6c68e4b146c149cfc50ced7396_28906_1b3f025ec667f3cf1990b6febe70abc8.webp 400w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_kretschmann_settings_hu8224cd6c68e4b146c149cfc50ced7396_28906_d4d87b5c79418c601a15e8a412987a48.webp 760w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_kretschmann_settings_hu8224cd6c68e4b146c149cfc50ced7396_28906_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_kretschmann_settings_hu8224cd6c68e4b146c149cfc50ced7396_28906_1b3f025ec667f3cf1990b6febe70abc8.webp"
width="760"
height="190"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine Parsing Options.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-3-projektdaten-anpassen">Aufgabe 3: Projektdaten anpassen&lt;/h2>
&lt;p>OpenRefine bietet noch mehr Einstellungen für Projekte, als die die wir beim Erstellen angeben.
Dazu gehören zum Beispiel der Name des Erstellers, ein Vorschaubild, die Lizenz, &amp;hellip;&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-projekt-metadaten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine Projekt Metadaten." srcset="
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_gurs_metadata_hu0287b496007f4faea312a1fe2572f240_7262_8cda4d3b058e1761940f225c068f2116.webp 400w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_gurs_metadata_hu0287b496007f4faea312a1fe2572f240_7262_9a2dc1802451126798412245a04b5ed3.webp 760w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_gurs_metadata_hu0287b496007f4faea312a1fe2572f240_7262_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_gurs_metadata_hu0287b496007f4faea312a1fe2572f240_7262_8cda4d3b058e1761940f225c068f2116.webp"
width="760"
height="49"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine Projekt Metadaten.
&lt;/figcaption>&lt;/figure>
&lt;p>Um diese anzupassen, verwendet man den Link &amp;ldquo;About&amp;rdquo; in der Projektübersicht wie in Abbildung 3 und fügt die Informationen via &amp;ldquo;Edit&amp;rdquo; ein.
Um dies einmal durchzuführen, ergänzen wir bei dem Gurs-Projekt im Feld &lt;em>Homepage&lt;/em> die URL des LABW, wie in Abbildung 4 gezeigt.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">https://www.landesarchiv-bw.de
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-bildschirmfoto-von-dem-bearbeitungsdialog-der-openrefine-projekt-metadaten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von dem Bearbeitungsdialog der OpenRefine Projekt Metadaten." srcset="
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_gurs_metadata_edit_hue766fd0ec3f66ea47a58be41ff649efc_48851_fce0e27a657b8fe22d038d5b91ba346e.webp 400w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_gurs_metadata_edit_hue766fd0ec3f66ea47a58be41ff649efc_48851_4f553f7719efd1f4828aee1af79523c2.webp 760w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_gurs_metadata_edit_hue766fd0ec3f66ea47a58be41ff649efc_48851_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_project_gurs_metadata_edit_hue766fd0ec3f66ea47a58be41ff649efc_48851_fce0e27a657b8fe22d038d5b91ba346e.webp"
width="760"
height="495"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von dem Bearbeitungsdialog der OpenRefine Projekt Metadaten.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="aufgabe-4-aktionsverlauf">Aufgabe 4: Aktionsverlauf&lt;/h2>
&lt;p>OpenRefine speichert Änderungen automatisch und erstellt einen Verlauf aller auf ein Projekt angewendeter Aktionen.
Diese können im Tab &amp;ldquo;Undo/Redo&amp;rdquo; angesehen, rückgängig gemacht oder importiert werden.&lt;/p>
&lt;p>Um das besser kennen zu lernen laden wir ein OpenRefine Projekt und übertragen die Änderungshistorie auf ein Projekt von uns.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/01_kretschmann-kabinett-iii-vorlage.openrefine.tar.gz" target="_blank">
&lt;i class="fas fa-file-zipper pr-1 fa-fw">&lt;/i>Kretschmann Kabinett (Vorlage) als OpenRefine Projektdatei&lt;/a>
&lt;p>Wir laden die OpenRefine Projektdatei über das in Abbildung 5 gezeigte Formular zum Importieren von OpenRefine Projekten.&lt;/p>
&lt;figure id="figure-bildschirmfoto-vom-formular-zum-importieren-von-openrefine-projekten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto vom Formular zum Importieren von OpenRefine Projekten." srcset="
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot-openrefine-project-import_hu8aac3b5e820504d1d1b06a13beec916d_15262_a5403a0e4948a623a8da26eb65f9792d.webp 400w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot-openrefine-project-import_hu8aac3b5e820504d1d1b06a13beec916d_15262_5b82c1c49b90bd760db11f48194c6aa7.webp 760w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot-openrefine-project-import_hu8aac3b5e820504d1d1b06a13beec916d_15262_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/screenshot-openrefine-project-import_hu8aac3b5e820504d1d1b06a13beec916d_15262_a5403a0e4948a623a8da26eb65f9792d.webp"
width="738"
height="177"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto vom Formular zum Importieren von OpenRefine Projekten.
&lt;/figcaption>&lt;/figure>
&lt;p>Anschließend öffnen wir den Reiter für die Änderungshistorie in OpenRefine.
Dort werden automatisch alle automatisch gespeicherten Arbeitsschritte gezeigt.
Frühere Zustände des Projektes können durch Anklicken des entsprechenden Eintrages in der Änderungshistorie wiederhergestellt oder überschrieben werden.
Geht man in der Änderungshistorie zum Beispiel zu Schritt 2 zurück und fügt dann eine neue Änderung ein, dann werden die nachfolgenden Schritte (3-4) überschrieben.&lt;/p>
&lt;p>Wie in Abbildung 6 gezeigt können die Arbeitsschritte eines Projektes auch extrahiert werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-reiters-für-die-änderungshistorie-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Reiters für die Änderungshistorie in OpenRefine." srcset="
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot-openrefine-project-history_hu9b0394b8f2ce103a993c0493226ebd35_54539_044ef6d5cb2495d05a61b98791719c44.webp 400w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot-openrefine-project-history_hu9b0394b8f2ce103a993c0493226ebd35_54539_14ee8984d054bf51b3d11538c209be17.webp 760w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot-openrefine-project-history_hu9b0394b8f2ce103a993c0493226ebd35_54539_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/screenshot-openrefine-project-history_hu9b0394b8f2ce103a993c0493226ebd35_54539_044ef6d5cb2495d05a61b98791719c44.webp"
width="760"
height="390"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Reiters für die Änderungshistorie in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Der in Abbildung 7 gezeigte Dialog zum Extrahieren erlaubt es auch einzelne Schritte zum Export aus- oder abzuwählen.
Wir extrahieren den kompletten Text und kopieren ihn in die Zwischenablage.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialogs-zum-extrahieren-von-änderungen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialogs zum Extrahieren von Änderungen." srcset="
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot-openrefine-project-history-extract_hu5bb3a1676ba07aa9a94c00a9087975ac_37591_015f44628c2fd6dc7a9a05d4c71b8aa1.webp 400w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot-openrefine-project-history-extract_hu5bb3a1676ba07aa9a94c00a9087975ac_37591_47c8d7363e0947dfea847718251852a2.webp 760w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot-openrefine-project-history-extract_hu5bb3a1676ba07aa9a94c00a9087975ac_37591_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/screenshot-openrefine-project-history-extract_hu5bb3a1676ba07aa9a94c00a9087975ac_37591_015f44628c2fd6dc7a9a05d4c71b8aa1.webp"
width="760"
height="577"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialogs zum Extrahieren von Änderungen.
&lt;/figcaption>&lt;/figure>
&lt;p>Der kopierte Text sieht in etwa wie folgt aus, wobei die Beschreibung (&lt;em>description&lt;/em>) nachträglich mit einer deutschsprachigen Erklärung versehen wurde.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;op&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;core/column-split&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;engineConfig&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;facets&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;mode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;row-based&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;columnName&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Bevorzugter Name&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;guessCellType&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;removeOriginalColumn&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;mode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;separator&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;separator&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;regex&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;maxColumns&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Spalte nach Vorname und Nachname auftrennen.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;op&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;core/column-rename&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;oldColumnName&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Bevorzugter Name 1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;newColumnName&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Nachname&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Spalte Bevorzugter Name 1 in Nachname umbenennen.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;op&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;core/column-rename&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;oldColumnName&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Bevorzugter Name 2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;newColumnName&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Vorname&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Spalte Bevorzugter Name 2 in Vorname umbenennen.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;op&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;core/text-transform&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;engineConfig&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;facets&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;mode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;row-based&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;columnName&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Geschlecht&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;expression&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;grel:if(value == \&amp;#34;Weiblich\&amp;#34;, \&amp;#34;w\&amp;#34;, \&amp;#34;m\&amp;#34;)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;onError&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;keep-original&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;repeat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;repeatCount&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Männlich und Weiblich als m und w kodieren.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Um die Änderungen in unserem eigenen Projekt anzuwenden öffnen wir das Projekt &amp;ldquo;Kretschmann Kabinett III&amp;rdquo;, öffnen dort den Tab &amp;ldquo;Undo/Redo&amp;rdquo;, drücken auf &amp;ldquo;Apply&amp;rdquo; und kopieren wie in Abbildung 8 den Text in den Dialog.&lt;/p>
&lt;figure id="figure-anwenden-von-aktionen-über-die-history-funktion-von-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Anwenden von Aktionen über die History Funktion von OpenRefine." srcset="
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_apply_history_hu63b2e3056be6bd66a529ba8f252b2a8a_60003_c785ec4c48ca44010ae7c8638ba661f1.webp 400w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_apply_history_hu63b2e3056be6bd66a529ba8f252b2a8a_60003_1ec7892b98a8640862d8b479394f7660.webp 760w,
/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_apply_history_hu63b2e3056be6bd66a529ba8f252b2a8a_60003_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/screenshot_openrefine_apply_history_hu63b2e3056be6bd66a529ba8f252b2a8a_60003_c785ec4c48ca44010ae7c8638ba661f1.webp"
width="760"
height="569"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Anwenden von Aktionen über die History Funktion von OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Da wir in unserem Projekt die gleichen Spaltennamen haben, wie im Vorlagenprojekt, konnten wir die Änderungen direkt übernehmen und haben nun den gleichen Stand.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>OpenRefine öffnet viele unterschiedliche Dateitypen, extrahiert Archive, rät die Einstellungen für den Import und bietet mit der Vorschau eine tolle Möglichkeit die Einstellungen anzupassen. Das Metadatenmanagement der Projekte ist etwas lieblos implementiert.
Die Möglichkeit (fast) jeden Bearbeitungsschritt wieder rückgängig zu machen gibt die Sicherheit, auch mal Datenbearbeitungen ausprobieren zu können, ohne sich in verschiedenen Versionen einer &amp;ldquo;Datei&amp;rdquo; zu verlaufen. Beim Verlauf der Bearbeitungsschritte wäre es noch praktisch, wenn man verschiedene Stände markieren könnte, um schneller dorthin zurückzuspringen.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil lernen wir, wie wir Daten in OpenRefine filtern und sortieren können.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/02-filtern-und-sortieren" class="btn btn-primary px-3 py-3">02 Daten mit OpenRefine filtern und sortieren&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Reconciling mit OpenRefine und der GND</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/</guid><description>&lt;p>Wir nutzen die Daten der GND über OpenRefine, gleichen damit Daten ab und laden Daten nach.&lt;/p>
&lt;blockquote>
&lt;p>Reconciling in der &lt;a href="https://docs.openrefine.org/manual/reconciling" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;h2 id="hintergrund">Hintergrund&lt;/h2>
&lt;p>Die Gemeinsame Normdatei (GND) wird als Linked Open Data (LOD) angeboten. Das ermöglicht uns Daten mit eindeutigen Identifikatoren (GND-ID) zu verknüpfen.&lt;/p>
&lt;p>Mit OpenRefine können wir mit der GND zwei Dinge tun:&lt;/p>
&lt;ol>
&lt;li>basierend auf GND-IDs weitere Daten nachladen (Aufgabe 1).&lt;/li>
&lt;li>via Reconciliation Service GND-IDs für Entitäten suchen (Aufgabe 2).&lt;/li>
&lt;/ol>
&lt;h3 id="kurzer-exkurs-zur-gnd-als-lod">Kurzer Exkurs zur GND als LOD&lt;/h3>
&lt;p>Die GND als LOD bedeutet, dass die Daten nicht in einer klassischen Datenbank angeboten werden, sondern mit einer Ontologie versehen wurden.
Die Hierarchie der Ontologie ist in Abbildung 1 visualisiert.&lt;/p>
&lt;figure id="figure-visualisierung-der-gnd-ontologie-mit-den-für-uns-relevanten-bereichen-personen-orte-und-dinge">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Visualisierung der GND Ontologie, mit den für uns relevanten Bereichen Personen, Orte und Dinge." srcset="
/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/gnd_ontology_huc2fd5ef60259cb939e2f1be69042268b_197325_71edcd371b7f2aaada84eb827ee081bc.webp 400w,
/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/gnd_ontology_huc2fd5ef60259cb939e2f1be69042268b_197325_3606ef697c47aadeb8ca7f005cb242ca.webp 760w,
/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/gnd_ontology_huc2fd5ef60259cb939e2f1be69042268b_197325_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/gnd_ontology_huc2fd5ef60259cb939e2f1be69042268b_197325_71edcd371b7f2aaada84eb827ee081bc.webp"
width="760"
height="578"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Visualisierung der GND Ontologie, mit den für uns relevanten Bereichen Personen, Orte und Dinge.
&lt;/figcaption>&lt;/figure>
&lt;p>Neben den Typen der Objekte in der GND Ontologie gibt es auch vordefinierte Verbindungen zwischen diesen Objekten.
Ein Beispiel ist im folgenden Diagramm für einen Teil der GND-Daten für Winfried Kretschmann gezeigt.
Beispielsweise gibt es die bidirektionale Verbindung &lt;code>hasSpouse&lt;/code>, zwischen ihm und Gerlinde Kretschmann.
Oder die unidirektionale Verbindung &lt;code>placeOfBirth&lt;/code> zwischen der Person Winfried Kretschmann und dem Ort Spaichingen.&lt;/p>
&lt;div class="mermaid">---
title: Visualisierung zu Objekten und Verbindungen in der GND
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph place["fa:fa-map-marked Place"]
spaichingen["Spaichingen"]
laiz["Laiz"]
end
subgraph person["fa:fa-user Person"]
kretschmann_winfried["Kretschmann, Winfried"]
kretschmann_gerlinde["Kretschmann, Gerlinde"]
end
subgraph shss["fa:fa-tag Subject heading senso stricto"]
politiker["Politiker"]
politikerin["Politikerin"]
lehrer["Lehrer"]
lehrerin["Lehrerin"]
end
kretschmann_winfried &lt;-- hasSpouse --> kretschmann_gerlinde
kretschmann_winfried -- professionOrOccupation --> politiker &amp; lehrer
kretschmann_gerlinde -- professionOrOccupation --> lehrerin
kretschmann_winfried -- placeOfBirth --> spaichingen
kretschmann_gerlinde -- placeOfBirth --> laiz
kretschmann_winfried -- placeOfActivity --> laiz
lehrer &lt;-- relatedTerm --> lehrerin
politiker &lt;-- relatedTerm --> politikerin
&lt;/div>
&lt;p>Optional kann in einer Ontologie festgelegt werden, dass zum Beispiel eine Verbindung wie &lt;code>placeOfBirth&lt;/code> nur zwischen einer Person und einem Ort existieren kann.&lt;/p>
&lt;h2 id="vorbereitung">Vorbereitung&lt;/h2>
&lt;h3 id="datensatz-laden">Datensatz laden&lt;/h3>
&lt;p>Wir erstellen eine neues Projekt mit dem Namen &amp;ldquo;Kretschmann Kabinett III&amp;rdquo; aus der Datei &lt;code>06_kretschmann-kabinett-iii.csv&lt;/code>.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/06_kretschmann-kabinett-iii.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Kretschmann III als CSV&lt;/a>
&lt;p>Diese Datei besteht nur aus einer Spalte mit GND-IDs.&lt;/p>
&lt;h3 id="reconciliation-service-hinzufügen">Reconciliation Service hinzufügen&lt;/h3>
&lt;p>Die GND selbst wird von der DNB aktuell als kompletter Datensatz zur Verfügung gestellt und nicht als Service.
Daher nutzen wir den &lt;a href="https://lobid.org/gnd" target="_blank" rel="noopener">GND Service von lobid&lt;/a>. Über diesen kann die GND via einer Online-Oberfläche durchsucht werden. Es gibt aber auch einen so genannten &lt;a href="https://lobid.org/gnd/reconcile" target="_blank" rel="noopener">Reconciliation Service&lt;/a>, mit dem direkt via OpenRefine Daten mit den Daten in der GND abgeglichen werden können.&lt;/p>
&lt;p>Dafür fügen wir den Service zu OpenRefine hinzu. Im Spaltenmenü finden wir den in Abbildung 2 gezeigten Dialog über
&amp;ldquo;GND-ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-reconciliation-services">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine Reconciliation Services." srcset="
/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/screenshot_openrefine_reconciliation_services_hu8d6a26d9b55f88943ffb6ad478e41a57_18083_147b52cca785efa5f65677fbdabb4985.webp 400w,
/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/screenshot_openrefine_reconciliation_services_hu8d6a26d9b55f88943ffb6ad478e41a57_18083_8303cd34867b0ee0cc082800e528f491.webp 760w,
/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/screenshot_openrefine_reconciliation_services_hu8d6a26d9b55f88943ffb6ad478e41a57_18083_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/screenshot_openrefine_reconciliation_services_hu8d6a26d9b55f88943ffb6ad478e41a57_18083_147b52cca785efa5f65677fbdabb4985.webp"
width="760"
height="520"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine Reconciliation Services.
&lt;/figcaption>&lt;/figure>
&lt;p>Über &amp;ldquo;Add Standard Service&amp;rdquo; geben wir die folgende URL ein:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">https://lobid.org/gnd/reconcile/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="aufgabe-1-daten-nachladen">Aufgabe 1: Daten nachladen&lt;/h2>
&lt;p>Wir wollen die folgenden Spalten zu unserem Datensatz aus der GND ergänzen:&lt;/p>
&lt;ul>
&lt;li>Name der Person&lt;/li>
&lt;li>Geburtsdatum&lt;/li>
&lt;li>Geburtsort&lt;/li>
&lt;li>GND-ID des Geburtsortes&lt;/li>
&lt;li>Liste der Berufe der Person&lt;/li>
&lt;/ul>
&lt;p>Dafür nutzen wir im Spaltenmenü der Spalte &amp;ldquo;GND-ID&amp;rdquo; die Funktion
&amp;ldquo;GND-ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Use values as identifiers&amp;rdquo;
und wählen den Service &amp;ldquo;GND reconciliation for OpenRefine&amp;rdquo; aus.&lt;/p>
&lt;p>Anschließend können wir ebenfalls über das Spaltenmenü mit
&amp;ldquo;GND-ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column from reconciled values&amp;hellip;&amp;rdquo;
weitere Daten nachladen.&lt;/p>
&lt;p>Das Ergebnis sieht dann ungefähr wie in Abbildung 3 aus.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-ergebnis">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine Ergebnis." srcset="
/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/screenshot_openrefine_ergebnis_hu5fcd1a8d65005e27c086d66cbabdad9b_49580_e79caaa3edab95ce0e96d1b63b99d437.webp 400w,
/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/screenshot_openrefine_ergebnis_hu5fcd1a8d65005e27c086d66cbabdad9b_49580_bd75d9c51074da63cf1a7b787987c320.webp 760w,
/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/screenshot_openrefine_ergebnis_hu5fcd1a8d65005e27c086d66cbabdad9b_49580_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/screenshot_openrefine_ergebnis_hu5fcd1a8d65005e27c086d66cbabdad9b_49580_e79caaa3edab95ce0e96d1b63b99d437.webp"
width="633"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine Ergebnis.
&lt;/figcaption>&lt;/figure>
&lt;details class="spoiler " id="spoiler-11">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Die Spaltennamen stimmen nicht unbedingt mit der Bezeichnung in der GND überein.&lt;/li>
&lt;li>Die GND-ID des Geburtsortes erhalten wir über die Spalte &amp;ldquo;Geburtsort&amp;rdquo;.&lt;/li>
&lt;li>Sollten Sie für Zeilen keine Ergebnisse erhalten, prüfen Sie ob sich ggf. noch Leerzeichen im Datensatz befinden.&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-2-daten-verknüpfen">Aufgabe 2: Daten verknüpfen&lt;/h2>
&lt;p>Hierfür verwenden wir den Gurs-Datensatz, der uns über den kompletten Workshop begleitet.&lt;/p>
&lt;p>In der Spalte &amp;ldquo;Geburtsort&amp;rdquo; sind nicht alle Orte mit GND-IDs verknüpft. Wir filtern diese Orte und verknüpfen sie mit GND-IDs.&lt;/p>
&lt;p>Dafür nutzen wir im Spaltenmenü der Spalte
&amp;ldquo;Geburtsort&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo;
und wählen den Service &amp;ldquo;GND reconciliation for OpenRefine&amp;rdquo; aus.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-gefilterten-gurs-datensatzes-mit-reconciliation-vorschlägen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des gefilterten Gurs Datensatzes mit Reconciliation Vorschlägen." srcset="
/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/screenshot_openrefine_gnd_reconciling_hu4d9c700a3cffecb94f94f42023252736_136298_d98f04b062215adbfbfc677066a2fd3f.webp 400w,
/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/screenshot_openrefine_gnd_reconciling_hu4d9c700a3cffecb94f94f42023252736_136298_23096a6d1f9e5f4fe05c267117e03b79.webp 760w,
/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/screenshot_openrefine_gnd_reconciling_hu4d9c700a3cffecb94f94f42023252736_136298_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/screenshot_openrefine_gnd_reconciling_hu4d9c700a3cffecb94f94f42023252736_136298_d98f04b062215adbfbfc677066a2fd3f.webp"
width="693"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des gefilterten Gurs Datensatzes mit Reconciliation Vorschlägen.
&lt;/figcaption>&lt;/figure>
&lt;p>Die GND-ID können wir anschließend wie in Aufgabe 1 als extra Spalte hinzufügen. Anschließend verbinden wir die neue Spalte &amp;ldquo;GND-Nummer&amp;rdquo; mit der Spalte &amp;ldquo;Geburtsort (GND-ID)&amp;rdquo; (siehe &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/#aufgabe-5-spalten-zusammenf%C3%BChren">Aufgabe 5 in 03 Daten mit OpenRefine umwandeln&lt;/a>).&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Durch die Implementierung und Integration des &lt;a href="https://reconciliation-api.github.io/specs/" target="_blank" rel="noopener">Reconciliation Service API&lt;/a> in OpenRefine und der GND von dem &lt;a href="https://www.hbz-nrw.de/produkte/linked-open-data" target="_blank" rel="noopener">hbz&lt;/a> gestaltet sich der Abgleich von ganzen Datensätzen mit der GND auch für technische Laien als machbar.
Im Workshop für Fortgeschrittene besprechen wir, wie wir die Treffer beim Abgleich mit dem lobid API verbessern können.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil beschäftigen wir uns mit dem Abgleich von Daten in OpenRefine mit Wikidata.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata" class="btn btn-primary px-3 py-3">07 Reconciling mit OpenRefine und Wikidata&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop - Reconciling mit OpenRefine und Wikidata</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/</guid><description>&lt;p>Wir nutzen die Daten von Wikidata über OpenRefine, gleichen damit Daten ab und laden Daten nach.&lt;/p>
&lt;blockquote>
&lt;p>Arbeiten mit Wikibase in der &lt;a href="https://docs.openrefine.org/manual/wikibase/overview" target="_blank" rel="noopener">OpenRefine Dokumentation&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;h2 id="hintergrund">Hintergrund&lt;/h2>
&lt;p>Eine weitere interessante Wissensquelle ist Wikipedia.
Auch dort liegen strukturierte Daten vor.
In dem Bildschirmfoto der &lt;a href="https://de.wikipedia.org/wiki/Spaichingen" target="_blank" rel="noopener">Wikipediaseite der Stadt Spaichingen&lt;/a> in Abbildung 1 sind zum Beispiel die Infobox und die Geokoordinaten der Stadt markiert.&lt;/p>
&lt;figure id="figure-annotiertes-bildschirmfoto-der-wikipedia-seite-von-spaichingen">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Annotiertes Bildschirmfoto der Wikipedia Seite von Spaichingen." srcset="
/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/wikipedia_spaichingen_huc69f80803da0434961dfcb1d41f876e5_208349_8bc45900eeb3dd87cc8fd023fd0ded18.webp 400w,
/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/wikipedia_spaichingen_huc69f80803da0434961dfcb1d41f876e5_208349_cc4532943755db15a4fedd44d20442ae.webp 760w,
/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/wikipedia_spaichingen_huc69f80803da0434961dfcb1d41f876e5_208349_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/wikipedia_spaichingen_huc69f80803da0434961dfcb1d41f876e5_208349_8bc45900eeb3dd87cc8fd023fd0ded18.webp"
width="760"
height="318"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Annotiertes Bildschirmfoto der Wikipedia Seite von Spaichingen.
&lt;/figcaption>&lt;/figure>
&lt;p>Die Daten auf der Wikipediaseite direkt sind jedoch noch kein Linked Open Data (LOD).
Diese Lücke schließt zum Beispiel das DBPedia Projekt, welches aus den Daten der Wikipedia einen Linked Data Graphen erstellt.
Hier der Link zum &lt;a href="https://dbpedia.org/page/Spaichingen" target="_blank" rel="noopener">DBPedia-Eintrag der Stadt Spaichingen&lt;/a>.&lt;/p>
&lt;p>Außerdem gibt es das Wikidata-Projekt, welches ebenfalls semantische Daten beinhaltet.
Das entsprechende Datenobjekt ist auf jeder Wikipediaseite verlinkt.
Der Link ist in Abbildung 1 markiert. Hier der Link zum &lt;a href="https://www.wikidata.org/wiki/Q519688" target="_blank" rel="noopener">Wikidata-Eintrag der Stadt Spaichingen&lt;/a>.&lt;/p>
&lt;p>Die Auswahl der Datenquelle (Wikipedia, Wikidata, oder DBPedia) ist nicht nur abhängig von der verfügbaren Technologie (für Wikidata gibt es einen Reconciliation Service),
sondern auch eine Frage der Lizenzbedingungen.
So stehen die Daten in der DBPedia als abgeleitetes Werk von Wikipedia unter einer &lt;a href="https://creativecommons.org/licenses/by-sa/3.0/deed.de" target="_blank" rel="noopener">CC BY-SA 3.0 Lizenz&lt;/a>,
wohingegen die Daten in Wikidata analog zur GND unter einer &lt;a href="https://creativecommons.org/publicdomain/zero/1.0/deed.de" target="_blank" rel="noopener">CC0 1.0 Lizenz&lt;/a> stehen,
was die Weiternutzung zum Beispiel für Erschließungsdaten vereinfacht.&lt;/p>
&lt;div class="mermaid">---
title: Lizenzen für Wikipedia und Wikidata
config:
look: handDrawn
theme: neutral
---
flowchart LR
gnd[("GND")]
wikipedia[("Wikipedia")]
wikidata[("Wikidata")]
dbpedia[("DBPedia")]
cc0[["fab:fa-creative-commons fab:fa-creative-commons-zero CC0 1.0"]]
cc-by-sa[["fab:fa-creative-commons fab:fa-creative-commons-by fab:fa-creative-commons-sa CC BY-SA 3.0"]]
gnd &amp; wikidata -.-> cc0
dbpedia &amp; wikipedia -.-> cc-by-sa
wikidata --> wikipedia --> dbpedia
&lt;/div>
&lt;h2 id="vorbereitung">Vorbereitung&lt;/h2>
&lt;h3 id="datensatz-laden">Datensatz laden&lt;/h3>
&lt;p>Wir erstellen ein neues Projekt mit dem Namen &amp;ldquo;Bundeslaender&amp;rdquo; aus der Datei &lt;code>07_bundeslaender.csv&lt;/code>.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen die folgende Datei (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/openrefine-workshop/07_bundeslaender.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Bundeslaender als CSV&lt;/a>
&lt;p>Diese Datei besteht nur aus einer Spalte mit der Wikidata-Kennung (QID).&lt;/p>
&lt;h3 id="reconciliation-service-hinzufügen-optional">Reconciliation Service hinzufügen (optional)&lt;/h3>
&lt;p>OpenRefine 3.5 kommt schon mit Wikidata als voreingestelltem &lt;a href="%28https://docs.openrefine.org/manual/reconciling%29">Reconciliation Service&lt;/a>.&lt;/p>
&lt;p>Es ist jedoch auch möglich, Wikidata auf Deutsch zu verwenden.&lt;/p>
&lt;p>Dafür fügen wir den Service in deutscher Sprache zu OpenRefine hinzu.
Im Spaltenmenü finden wir den in der Abbildung gezeigten Dialog über
&amp;ldquo;QID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-reconciliation-services">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine Reconciliation Services." srcset="
/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/screenshot_openrefine_reconciliation_services_hu8d6a26d9b55f88943ffb6ad478e41a57_18083_147b52cca785efa5f65677fbdabb4985.webp 400w,
/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/screenshot_openrefine_reconciliation_services_hu8d6a26d9b55f88943ffb6ad478e41a57_18083_8303cd34867b0ee0cc082800e528f491.webp 760w,
/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/screenshot_openrefine_reconciliation_services_hu8d6a26d9b55f88943ffb6ad478e41a57_18083_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/screenshot_openrefine_reconciliation_services_hu8d6a26d9b55f88943ffb6ad478e41a57_18083_147b52cca785efa5f65677fbdabb4985.webp"
width="760"
height="520"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine Reconciliation Services.
&lt;/figcaption>&lt;/figure>
&lt;p>Über &amp;ldquo;Add Standard Service&amp;rdquo; geben wir die folgende URL ein:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">https://wikidata.reconci.link/de/api
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="aufgabe-1-daten-nachladen">Aufgabe 1: Daten nachladen&lt;/h2>
&lt;p>Wir wollen die folgenden Spalten zu unserem Datensatz aus Wikidata ergänzen:&lt;/p>
&lt;ul>
&lt;li>Name des Bundeslandes&lt;/li>
&lt;li>GND-ID des Bundeslandes&lt;/li>
&lt;li>Hauptstadt des Bundeslandes&lt;/li>
&lt;li>Geokoordinaten der Landeshauptstadt im WGS84 Format&lt;/li>
&lt;li>Zuständiges Archiv des Bundeslandes&lt;/li>
&lt;li>GND-ID des zuständigen Archivs&lt;/li>
&lt;li>ISIL des zuständigen Archivs&lt;/li>
&lt;li>Webseite des zuständigen Archivs&lt;/li>
&lt;/ul>
&lt;p>Dafür nutzen wir im Spaltenmenü der Spalte &amp;ldquo;QID&amp;rdquo; die Funktion
&amp;ldquo;QID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Use values as identifiers&amp;rdquo; und wählen den Service &amp;ldquo;Wikidata (en)&amp;rdquo; (oder die deutschsprachige Alternative) aus.&lt;/p>
&lt;p>Anschließend können wir ebenfalls über das Spaltenmenü mit
&amp;ldquo;QID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column from reconciled values&amp;hellip;&amp;rdquo; weitere Daten nachladen.&lt;/p>
&lt;p>Das Ergebnis sieht dann ungefähr wie im folgendem Bildschirmfoto aus.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-ergebnis">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine Ergebnis." srcset="
/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/screenshot_openrefine_ergebnis_hu268614241ef27e6a88dbe7014dedb601_75154_ff9443073c310bbe29d5bcd9cabb761c.webp 400w,
/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/screenshot_openrefine_ergebnis_hu268614241ef27e6a88dbe7014dedb601_75154_be38d04a43902d0b265a88a5644ddebf.webp 760w,
/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/screenshot_openrefine_ergebnis_hu268614241ef27e6a88dbe7014dedb601_75154_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/screenshot_openrefine_ergebnis_hu268614241ef27e6a88dbe7014dedb601_75154_ff9443073c310bbe29d5bcd9cabb761c.webp"
width="760"
height="231"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine Ergebnis.
&lt;/figcaption>&lt;/figure>
&lt;details class="spoiler " id="spoiler-11">
&lt;summary>&lt;strong>Hinweise:&lt;/strong>&lt;/summary>
&lt;p>&lt;ul>
&lt;li>Die Spaltennamen stimmen nicht unbedingt mit der Bezeichnung in Wikidata überein.&lt;/li>
&lt;li>Einige Daten erhalten Sie nicht direkt über die Spalte &amp;ldquo;Bundesland&amp;rdquo;.&lt;/li>
&lt;li>Sollten Sie für Zeilen keine Ergebnisse erhalten, prüfen Sie ob sich ggf. noch Leerzeichen im Datensatz befinden.&lt;/li>
&lt;/ul>
&lt;/p>
&lt;/details>
&lt;h2 id="aufgabe-2-daten-verknüpfen">Aufgabe 2: Daten verknüpfen&lt;/h2>
&lt;p>Hier ist eine Liste der Mitgliedstaaten der Europäischen Union (Stand November 2021).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl"> - Belgien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Bulgarien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Dänemark
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Deutschland
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Estland
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Finnland
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Frankreich
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Griechenland
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Irland
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Italien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Kroatien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Lettland
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Litauen
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Luxemburg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Malta
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Niederlande
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Österreich
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Polen
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Portugal
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Rumänien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Schweden
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Slowakei
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Slowenien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Spanien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Tschechien
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Ungarn
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Zypern
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wir legen diese Liste via Zwischenablage (&amp;ldquo;Clipboard&amp;rdquo;) als OpenRefine Projekt an.
Nachdem wir die Daten aufgeräumt haben, starten wir den Abgleich mit Wikidata via
&amp;ldquo;Land&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo;
und wählen den Service &amp;ldquo;Wikidata (en)&amp;rdquo; (oder die deutschsprachige Alternative) aus.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Mit nur einem Klick können wir über die gleiche Oberfläche Daten in OpenRefine nicht nur mit der Gemeinsamen Normdatei (GND) via dem lobid API abgleichen, sondern auch mit Wikidata oder einer spezifischen &lt;a href="https://wikiba.se/" target="_blank" rel="noopener">Wikibase&lt;/a>-Instanz wie zum Beispiel &lt;a href="https://blog.factgrid.de/welcome" target="_blank" rel="noopener">FactGrid&lt;/a> für historische Daten.&lt;/p>
&lt;hr>
&lt;p>Der OpenRefine Workshop für Einsteiger ist an dieser Stelle zu Ende.
Bei Interesse werden Themen und Konzepte vertieft im OpenRefine Workshop für Fortgeschrittene.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/warum-openrefine" class="btn btn-primary px-3 py-3">OpenRefine Workshop für Fortgeschrittene&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Workshop für Einsteiger - Warum OpenRefine?</title><link>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/warum-openrefine/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/warum-openrefine/</guid><description>&lt;p>In diesem Workshop für Einsteiger betrachten wir die grundlegenden Funktionen von OpenRefine im Archivalltag.
Wir geben dabei nur eine grundlegende Einführung in den Umgang mit dem Programm und fokussieren uns gegen Ende auf den Abgleich mit Normdaten.
Vertiefende Themen behandeln wir im &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/warum-openrefine/">Workshop für Fortgeschrittene&lt;/a>.&lt;/p>
&lt;div class="alert alert-note">
Dieser Workshop wurde erstellt mit OpenRefine Version 3.5.0.&lt;br>
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version &lt;strong>3.9.3&lt;/strong>.
&lt;/div>
&lt;h2 id="inhalte-des-workshops">Inhalte des Workshops&lt;/h2>
&lt;ul>
&lt;li>Motivation: Warum OpenRefine?&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/oberflaeche/">Die Benutzeroberfläche von OpenRefine&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/00-installieren/">00 OpenRefine installieren&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/01-projekte-laden/">01 Projekte in OpenRefine laden und verwalten&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/02-filtern-und-sortieren/">02 Daten mit OpenRefine filtern und sortieren&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/03-transformieren/">03 Daten mit OpenRefine umwandeln&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/04-exportieren/">04 Daten mit OpenRefine exportieren&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/05-clustering/">05 Daten mit OpenRefine clustern&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/06-reconciling-mit-gnd/">06 Reconciling mit OpenRefine und der GND&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/07-reconciling-mit-wikidata/">07 Reconciling mit OpenRefine und Wikidata&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="zur-herkunft-von-openrefine">Zur Herkunft von OpenRefine&lt;/h2>
&lt;p>Ursprünglich wurde OpenRefine als &lt;em>Freebase Gridworks&lt;/em> (OpenSource) für die Datenbanktechnologie &lt;a href="https://en.wikipedia.org/wiki/Freebase_%28database%29" target="_blank" rel="noopener">Freebase&lt;/a> entwickelt.
Später wurde die entwickelnde Firma (Metaweb Technologies) von Google übernommen.
Das Produkt wurde anschließend erst als &lt;em>Google Refine&lt;/em> veröffentlicht und später als &lt;em>OpenRefine&lt;/em> zu einem von der Community getragenen OpenSource Projekt.&lt;/p>
&lt;h2 id="warum-eigentlich-openrefine">Warum eigentlich OpenRefine?&lt;/h2>
&lt;blockquote>
&lt;p>OpenRefine is Excel on steroids!&lt;/p>
&lt;/blockquote>
&lt;p>Diese Aussage findet sich manchmal als Kurzbeschreibung von OpenRefine und ist genauso falsch wie goldrichtig.
OpenRefine und Microsoft Excel haben unterschiedliche Anwendungsfälle.&lt;/p>
&lt;p>Microsoft Excel ist ein Programm zur Tabellen&lt;strong>kalkulation&lt;/strong>, wohingegen OpenRefine ein Programm zur Bereinigung, Umwandlung und Anreicherung von tabellarischen Daten ist.&lt;/p>
&lt;p>Da aber Microsoft Excel zumindest bei uns häufig dafür eingesetzt wird, tabellarische Daten zu bereinigen, ist OpenRefine tatsächlich wie &amp;ldquo;Excel on steroids!&amp;rdquo;.
Oder um einen Workshopteilnehmer zu zitieren:&lt;/p>
&lt;blockquote>
&lt;p>Mit Excel hatten wir bisher einen Trabi.&lt;br>
Mit OpenRefine haben wir einen Ferrari bekommen.&lt;/p>
&lt;/blockquote>
&lt;h2 id="openrefine-und-künstliche-intelligenz">OpenRefine und Künstliche Intelligenz?&lt;/h2>
&lt;p>Wie schon in
&lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-09-fuenf-dinge-die-wir-an-openrefine-moegen/">Fünf Dinge, die wir an OpenRefine mögen&lt;/a>
berichtet, ermöglicht es die Architektur von OpenRefine, das Werkzeug sowohl auf einem Client (Laptop, Rechner), als auch auf einem Server laufen zu lassen.
Die Bedienung erfolgt anschließend über den Browser.&lt;/p>
&lt;div class="mermaid">---
title: OpenRefine Setup
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph server[fas:fa-server Server]
server_or[fas:fa-gem OpenRefine]
server_api[fas:fa-code Other API]
end
subgraph laptop[fas:fa-laptop Laptop]
browser[far:fa-window-maximize Browser]
laptop_or[fas:fa-gem OpenRefine]
laptop_api[fas:fa-code Other API]
laptop_python[fab:fa-python Python]
end
browser -.-> laptop_or &amp; server_or
laptop_python -.-> laptop_or &amp; server_or
laptop_or -.-> laptop_api &amp; server_api
server_or -.-> server_api
&lt;/div>
&lt;p>Wenn es auf einem Laptop eingesetzt wird, behält OpenRefine alle Daten lokal und führt auch die Bearbeitungen lokal durch.
Erst wenn Daten aus dem Internet nachgeladen werden (Stichwort Reconciling), werden Daten an Dienste im Internet übermittelt.&lt;/p>
&lt;p>Da OpenRefine verschiedene Clustering Methoden anbietet und über das Reconciliation API Protokoll den Zugriff auf Suchtechnologien ermöglicht, könnte man behaupten, dass OpenRefine die Bearbeitung von Daten mit künstlicher Intelligenz ermöglicht (konkret &lt;a href="https://de.wikipedia.org/wiki/Maschinelles_Lernen" target="_blank" rel="noopener">Maschinelles Lernen&lt;/a>, ein Teilgebiet der künstlichen Intelligenz).
Und damit gehört es genau zu der Art von Werkzeugen, die wir im FDMLab suchen, testen und bei Gefallen vorstellen.&lt;/p>
&lt;h2 id="openrefine-und-big-data">OpenRefine und Big Data&lt;/h2>
&lt;p>Eine recht pragmatische Betrachtung von &lt;em>Big Data&lt;/em> ist&lt;/p>
&lt;blockquote>
&lt;p>Wenn es in den Arbeitsspeicher passt, ist es &lt;strong>kein&lt;/strong> Big Data.&lt;/p>
&lt;/blockquote>
&lt;p>Sobald ein Datensatz zu groß ist, um ihn komplett im Arbeitsspeicher zu halten,
werden Strategien aus dem Big Data Bereich benötigt, um sie bearbeiten zu können.
OpenRefine hat solche Strategien (noch) nicht implementiert. &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p>
&lt;p>Dabei ist der Begriff &lt;em>Big Data&lt;/em> nach obiger Betrachtung sehr relativ.
Ein normaler Bürorechner ist üblicherweise mit 2 GB Arbeitsspeicher ausgestattet,
eine Data Science Workstation mit 128 GB (und mehr) und ein Superrechner teilweise mit mehr als 4.500.000 GB.&lt;/p>
&lt;p>Es ist also nicht zu erwarten, dass der Bürorechner eines Sachbearbeiters mit OpenRefine
riesige Datenlieferungen umwandeln und bereinigen kann,
auch wenn das auf einem besser ausgestatteten Rechner eines Data Scientist problemlos möglich wäre.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Wir setzen OpenRefine ein, wenn wir Daten für die Übernahme in unser Archivisches Fachinformationssystem vorbereiten,
oder für die Veröffentlichung in anderen Informationssystemen umwandeln.
Hierfür nutzten wir bisher Excel mit viel manuellen Tätigkeiten oder spezialisierte Werkzeuge,
die explizit für das Zielsystem entwickelt wurden.&lt;/p>
&lt;p>Mit OpenRefine haben wir nun eine Zwischenlösung,
die es uns ermöglicht, langwierige manuelle Tätigkeiten zu automatisieren,
ohne explizit Programme dafür zu entwickeln.&lt;/p>
&lt;p>Auch beim Zusammenführen von Daten aus unterschiedlichen Datenquellen nimmt uns OpenRefine viele manuelle Arbeiten ab.&lt;/p>
&lt;hr>
&lt;p>Im nächsten Teil gibt es eine allgemeine Einführung in die Bedienoberfläche von OpenRefine.&lt;/p>
&lt;ul class="cta-group">
&lt;li>
&lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-einsteiger/oberflaeche" target="_blank" rel="noopener" class="btn btn-primary px-3 py-3">Die Oberfläche von OpenRefine&lt;/a>
&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Dies ändert sich mit OpenRefine 4.0 und der geplanten Unterstützung von &lt;a href="https://spark.apache.org/" target="_blank" rel="noopener">Apache Spark&lt;/a>.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Gemeinsam an OpenRefine-Projekten arbeiten</title><link>https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/</link><pubDate>Tue, 07 Dec 2021 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/</guid><description>&lt;p>Im FDMLab testeten wir verschiedene Möglichkeiten mit OpenRefine gemeinsam an Projekten zu arbeiten.
Dieser Artikel fasst unsere Erfahrungen beim kollaborativen Arbeiten mit OpenRefine 3.5.0 zusammen.&lt;/p>
&lt;p>Wir hatten in
&lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-09-fuenf-dinge-die-wir-an-openrefine-moegen/">Fünf Dinge, die wir an OpenRefine mögen&lt;/a>
schon darüber berichtet, dass uns die Architektur von OpenRefine gefällt,
da sie es ermöglicht OpenRefine sowohl auf einem Client (Laptop, Rechner), als auch auf einem Server laufen zu lassen.
Die Bedienung erfolgt anschließend über den Browser.&lt;/p>
&lt;div class="mermaid">---
title: OpenRefine Setup
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph server[fas:fa-server Server]
server_or[fas:fa-gem OpenRefine]
end
subgraph laptop[fas:fa-laptop Laptop]
browser[far:fa-window-maximize Browser]
laptop_or[fas:fa-gem OpenRefine]
end
browser -.-> laptop_or &amp; server_or
&lt;/div>
&lt;p>Da läge es nahe, dass OpenRefine auch eine Benutzerverwaltung und eine Möglichkeit zum Kollaborativen Arbeiten an Projekten anbietet.
Dafür gab es Pläne ein &lt;a href="https://github.com/OpenRefine/OpenRefine/wiki/Broker-Protocol" target="_blank" rel="noopener">Broker Protokoll für OpenRefine&lt;/a> einzuführen, die bisher aber weder umgesetzt noch eingeplant wurden.&lt;/p>
&lt;p>In der &lt;a href="https://docs.openrefine.org/" target="_blank" rel="noopener">Dokumentation von OpenRefine&lt;/a> wird folgendes Vorgehen empfohlen:&lt;/p>
&lt;blockquote>
&lt;p>Die beste Art, mit einer anderen Person zusammenzuarbeiten, ist, Projekte zu exportieren und zu importieren, wobei alle Änderungen gespeichert werden, so dass Sie an der Stelle weiterarbeiten können, wo die andere Person aufgehört hat.&lt;/p>
&lt;p>Übersetzt von &lt;a href="https://docs.openrefine.org/manual/starting#import-a-project" target="_blank" rel="noopener">Starting a project: Import a project&lt;/a>, aufgerufen am 01.12.2021.&lt;/p>
&lt;/blockquote>
&lt;div class="mermaid">---
title: Gemeinsam arbeiten - Strategie 1
config:
look: handDrawn
theme: neutral
---
flowchart TD
subgraph a["fa:fa-user Alice"]
vaa["fa:fa-table Version A"]
vab["fa:fa-table Version B"]
vac["fa:fa-table Version C"]
vad["fa:fa-table Version D"]
end
subgraph b["fa:fa-user Bob"]
vba["fa:fa-table Version A"]
vbb["fa:fa-table Version B"]
end
subgraph c["fa:fa-user Charly"]
vcb["fa:fa-table Version B"]
vcc["fa:fa-table Version C"]
end
vaa -.Übergabe.-> vba --Arbeiten--> vbb -.Übergabe.-> vab -.Übergabe.-> vcb --Arbeiten--> vcc -.Übergabe.-> vac --Arbeiten--> vad
&lt;/div>
&lt;p>Konkret bedeutet das, dass bei einer Kooperation von Alice, Bob und Charly zwar alle an dem gleichen Projekt arbeiten können, jedoch nicht gleichzeitig. Nachdem Alice das Projekt an Bob übergeben hat, arbeitet Bob daran. Nachdem Bob fertig ist, übergibt er das Projekt an Alice zurück, die es an Charly übergibt. Nachdem Charly fertig ist, übergibt er das Projekt an Alice zurück,
die dann erst daran weiterarbeiten kann.
Das war für uns im FDMLab ein eher unbefriedigender Zustand, weshalb wir zu einer anderen Strategie gewechselt haben.&lt;/p>
&lt;div class="mermaid">---
title: Gemeinsam Arbeiten - Strategie 2
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph a["fa:fa-user Alice"]
va["fa:fa-table Version A"]
vb["fa:fa-table Version B"]
vc["fa:fa-table Version C"]
vd["fa:fa-table Version D"]
end
subgraph b["fa:fa-user Bob"]
pa["fa:fa-table Part A"]
end
subgraph c["fa:fa-user Charly"]
pb["fa:fa-table Part B"]
end
va -.-> pa
vb -.-> pb
pa -.-> vc
pb -.-> vd
va --Arbeiten--> vb --Arbeiten--> vc --Arbeiten--> vd
&lt;/div>
&lt;p>Wir haben angefangen Teile eines Projektes in OpenRefine auszulagern und nach erfolgreicher Bearbeitung wieder in das Originalprojekt einzupflegen.
So kann in unserem Beispiel Alice weiter an dem Projekt arbeiten, während Bob und Charly sie durch die Bearbeitung einzelner Teile unterstützen. Diese Teile werden anschließend von Alice wieder in das Originalprojekt eingepflegt.
Wie das funktioniert besprechen wir in den folgenden Unterpunkten.&lt;/p>
&lt;h2 id="zeilenweise-zusammenführen">Zeilenweise zusammenführen&lt;/h2>
&lt;p>Manchmal ist es möglich, ein Projekt zeilenweise aufzuteilen. Also dass Alice die ersten 100 Zeilen, Bob die nächsten 100 und Charly die letzten 75 Zeilen bearbeitet.&lt;/p>
&lt;p>Die Ergebnisse können nach der Bearbeitung als CSV-Dateien exportiert und daraus anschließend ein neues OpenRefine-Projekt erstellt werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-dateiauswahl-oberfläche-von-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Dateiauswahl Oberfläche von OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-1_hu402989673ec7c7ca2e68b32580c83e60_3527_f8f279f4f94d7c5e8446255ac0f8e90a.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-1_hu402989673ec7c7ca2e68b32580c83e60_3527_6bff2ecacd8694f256793a04bf94172b.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-1_hu402989673ec7c7ca2e68b32580c83e60_3527_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-1_hu402989673ec7c7ca2e68b32580c83e60_3527_f8f279f4f94d7c5e8446255ac0f8e90a.webp"
width="304"
height="77"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Dateiauswahl Oberfläche von OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Wie in Abbildung 1 gezeigt, kann OpenRefine ein Projekt aus mehreren Dateien erstellen.
Das kann auch ein Dateiarchiv sein, dessen Dateien in ein neues Projekt importiert werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dateifilter-oberfläche-von-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dateifilter Oberfläche von OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-2_hu632d044bc7e37669654237939b6eb031_22723_1399221371f58cd8b77ea03867927303.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-2_hu632d044bc7e37669654237939b6eb031_22723_fabc96d2b52b33acf2c43c94a595e0fd.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-2_hu632d044bc7e37669654237939b6eb031_22723_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-create-multiple-2_hu632d044bc7e37669654237939b6eb031_22723_1399221371f58cd8b77ea03867927303.webp"
width="760"
height="167"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dateifilter Oberfläche von OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Bevor das Projekt konfiguriert wird, gibt es wie in Abbildung 2 gezeigt, die Möglichkeit einzelne Dateien aus- oder abzuwählen.
Im Idealfall haben die einzelnen Dateien schon die gleichen Spaltenüberschriften in der richtigen Reihenfolge.
Ansonsten bietet OpenRefine mit der Möglichkeit &lt;a href="https://docs.openrefine.org/manual/columnediting#join-columns" target="_blank" rel="noopener">Spalten zu verbinden&lt;/a> und &lt;a href="https://docs.openrefine.org/manual/columnediting#renaming-removing-and-moving" target="_blank" rel="noopener">Spalten zu verschieben&lt;/a> die Möglichkeit das nachträglich zu bereinigen.&lt;/p>
&lt;h2 id="spaltenweise-zusammenführen">Spaltenweise zusammenführen&lt;/h2>
&lt;p>Ein häufiger Anwendungsfall im FDMLab ist, dass das Aufräumen und Transformieren der Daten von einer Person erledigt wird, die zum Beispiel beim Reconciling oder dem Abgleich mit weiteren Datenquellen von weiteren Personen unterstützt wird. Dafür werden einzelne Spalten als CSV (oder Excel) exportiert, von der unterstützenden Person bearbeitet und die Ergebnisse dann wieder in das Originalprojekt übernommen.&lt;/p>
&lt;p>Ein anderer Fall kann sein, dass es schon einen anderen Datensatz gibt, dessen Daten komplett oder teilweise übernommen werden sollen.
Das haben wir in &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/">Findbuchdaten mit OpenRefine wiederverwenden&lt;/a> teilweise besprochen.&lt;/p>
&lt;h3 id="beispiel">Beispiel&lt;/h3>
&lt;p>In unserem fiktiven Beispiel arbeitet Alice mit einem Datensatz der 16 Bundesländer, wie er in Abbildung 3 gezeigt ist.
Diesen gibt sie an Bob und Charly weiter.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-oberfläche-von-openrefine-mit-den-16-bundesländern">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Oberfläche von OpenRefine mit den 16 Bundesländern." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender_hu834d87ba914778413fda02e8c0d2c96a_13980_40dbfda5bc30f47578f1087796953bee.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender_hu834d87ba914778413fda02e8c0d2c96a_13980_40fbe0ec9c8e7474c5eba9551e95a797.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender_hu834d87ba914778413fda02e8c0d2c96a_13980_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender_hu834d87ba914778413fda02e8c0d2c96a_13980_40dbfda5bc30f47578f1087796953bee.webp"
width="226"
height="367"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Oberfläche von OpenRefine mit den 16 Bundesländern.
&lt;/figcaption>&lt;/figure>
&lt;p>Bob unterstützt Alice, indem er für die 16 Bundesländer das &amp;ldquo;Motto&amp;rdquo; recherchiert, er kann jedoch nicht für alle Bundesländer ein Motto finden und liefert den in Abbildung 4 gezeigten Datensatz zurück. &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-oberfläche-von-openrefine-mit-dem-motto-einiger-bundesländer">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Oberfläche von OpenRefine mit dem Motto einiger Bundesländer." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-motto_hue850d04bcf76bdb2f02a1168cb267115_9708_e3618f764baaa0d2c91b126a4d9aefef.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-motto_hue850d04bcf76bdb2f02a1168cb267115_9708_d3434bad2b7cf904e687d49ae311e4d2.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-motto_hue850d04bcf76bdb2f02a1168cb267115_9708_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-motto_hue850d04bcf76bdb2f02a1168cb267115_9708_e3618f764baaa0d2c91b126a4d9aefef.webp"
width="372"
height="174"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Oberfläche von OpenRefine mit dem Motto einiger Bundesländer.
&lt;/figcaption>&lt;/figure>
&lt;p>Charly hat die Aufgabe die Hauptstädte der einzelnen Bundesländer zu recherchieren, und liefert den in Abbildung 5 gezeigten Datensatz zurück. Dabei wurden jedoch die Namen der Bundesländer teilweise geändert, also zum Beispiel der Begriff &amp;ldquo;Freistaat&amp;rdquo; aus dem Namen wegoptimiert.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-oberfläche-von-openrefine-mit-den-hauptstädten-der-16-bundesländer">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Oberfläche von OpenRefine mit den Hauptstädten der 16 Bundesländer." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-hauptstadt_hudb6941757d764e7bc3df4946962e3922_15914_937e0ee52a239fc231180e731f64bfde.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-hauptstadt_hudb6941757d764e7bc3df4946962e3922_15914_5ded926aea1e6c28aa156d981867df94.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-hauptstadt_hudb6941757d764e7bc3df4946962e3922_15914_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-hauptstadt_hudb6941757d764e7bc3df4946962e3922_15914_937e0ee52a239fc231180e731f64bfde.webp"
width="297"
height="373"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Oberfläche von OpenRefine mit den Hauptstädten der 16 Bundesländer.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="datensätze-herunterladen">Datensätze herunterladen&lt;/h3>
&lt;p>Die drei beschriebenen Datensätze können hier heruntergeladen werden, um die vorgestellten Methoden zum Zusammenführen von Daten beim gemeinsamen Arbeiten in OpenRefine selbst auszuprobieren&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen drei Dateien (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/bundeslaender/bundeslaender.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Bundesländer als CSV&lt;/a>
&lt;blockquote>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/bundeslaender/bundeslaender-motto.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Bundesländer Motto als CSV&lt;/a>
&lt;blockquote>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/bundeslaender/bundeslaender-hauptstadt.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Bundesländer Hauptstädte als CSV&lt;/a>
&lt;h3 id="id-spalte-erstellen">ID Spalte erstellen&lt;/h3>
&lt;p>Wir werden die Daten auf drei Arten abgleichen:&lt;/p>
&lt;ol>
&lt;li>Via einer dedizierten ID-Spalte&lt;/li>
&lt;li>Mit einer improvisierten ID-Spalte (Name des Bundeslandes)&lt;/li>
&lt;li>Via Reconciling&lt;/li>
&lt;/ol>
&lt;p>Idealerweise haben alle Datensätze eine einheitliche ID-Spalte zum Abgleichen.
Diese lässt sich in OpenRefine über
&amp;ldquo;Spaltenmenü&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
mit dem folgenden GREL Ausdruck anlegen:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">row&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">index&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wie in Abbildung 6 gezeigt, wird so eine ID-Spalte erzeugt, deren Nummerierung analog zur Nummerierung der Zeilen in OpenRefine verläuft.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-spalten-hinzufügen-dialogs-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Spalten hinzufügen Dialogs in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-add-id-col_hucd48aca33617d55cebd18e34c8369c9e_21645_259a34aa11dacb6cd88d12217fda7b0c.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-add-id-col_hucd48aca33617d55cebd18e34c8369c9e_21645_b9e3e4c99d43a2fa57a52ad9239a711c.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-add-id-col_hucd48aca33617d55cebd18e34c8369c9e_21645_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-add-id-col_hucd48aca33617d55cebd18e34c8369c9e_21645_259a34aa11dacb6cd88d12217fda7b0c.webp"
width="721"
height="530"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Spalten hinzufügen Dialogs in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Alternativ lassen sich manchmal auch ID-Spalten improvisieren, indem zum Beispiel bei Personen die Namen und Vornamen in eine ID-Spalte übernommen werden.&lt;/p>
&lt;h3 id="zusammenführen-mit-cross">Zusammenführen mit cross()&lt;/h3>
&lt;p>Alice hat von Bob und Charly zwei CSV-Dateien bekommen, die sie in ihr OpenRefine-Projekt übernehmen möchte.
Eine Möglichkeit, das innerhalb von OpenRefine zu erledigen, ist die Funktion
&lt;a href="https://docs.openrefine.org/manual/grelfunctions#crosscell-s-projectname-optional-s-columnname-optional" target="_blank" rel="noopener">cross()&lt;/a>.&lt;/p>
&lt;p>Im OpenRefine-Wiki gibt es einige
&lt;a href="https://github.com/OpenRefine/OpenRefine/wiki/Recipes#combining-datasets" target="_blank" rel="noopener">Beispiele zur Anwendung von cross()&lt;/a>.
Außerdem gibt es eine
&lt;a href="https://www.bits.vib.be/index.php/software-overview/openrefine" target="_blank" rel="noopener">OpenRefine-Erweiterung für cross()&lt;/a>
um die Funktion über Dialoge in der Oberfläche von OpenRefine zu verwenden.&lt;/p>
&lt;p>Wir verwenden die Funktion &lt;code>cross()&lt;/code> ohne Erweiterung. Dafür erstellen wir für die drei Datensätze jeweils ein Projekt.&lt;/p>
&lt;ol>
&lt;li>Projekt &amp;ldquo;Bundesländer&amp;rdquo; aus &lt;code>bundeslaender.csv&lt;/code>&lt;/li>
&lt;li>Projekt &amp;ldquo;Bundesländer Motto&amp;rdquo; aus &lt;code>bundeslaender-motto.csv&lt;/code>&lt;/li>
&lt;li>Projekt &amp;ldquo;Bundesländer Hauptstadt&amp;rdquo; aus &lt;code>bundeslaender-hauptstadt.csv&lt;/code>&lt;/li>
&lt;/ol>
&lt;div class="alert alert-info">
&lt;div>
Wir verwenden absichtlich Umlaute und Leerzeichen im Projektnamen, um zu testen, ob OpenRefine beim Auflösen mit &lt;code>cross()&lt;/code> damit klarkommt!
&lt;/div>
&lt;/div>
&lt;h4 id="zusammenführen-via-id">Zusammenführen via ID&lt;/h4>
&lt;p>Idealerweise haben wir eine eindeutige ID-Spalte, um die Projekte miteinander abzugleichen.
Mit &lt;code>cross()&lt;/code> können wir über die ID-Spalte Daten aus einem anderen OpenRefine-Projekt nachladen.
Das funktioniert aber nur, wenn die IDs eindeutig sind.&lt;/p>
&lt;h5 id="nachladen-des-mottos">Nachladen des Mottos&lt;/h5>
&lt;p>Zum Nachladen des Mottos der Bundesländer gehen wir im &amp;ldquo;Bundesländer&amp;rdquo;-Projekt über das Spaltenmenü
&amp;ldquo;ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">cell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cross&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Bundesländer Motto&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;ID&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Mottotext&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dabei ist &amp;ldquo;Bundesländer Motto&amp;rdquo; der Name des Projektes aus dem wir die Daten holen wollen,
und &amp;ldquo;ID&amp;rdquo; die ID-Spalte im Projekt &amp;ldquo;Bundesländer Motto&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-spalten-hinzufügen-dialogs-mit-cross-für-den-mottotext-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für den Mottotext in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-1_hu8d6c0de36e7c11eb9e61089c401f8c9e_20478_0d2a60105870bc4d5e6d1f15a6ecd3ff.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-1_hu8d6c0de36e7c11eb9e61089c401f8c9e_20478_ee94f02329049b7f118eb1ad7acd41ed.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-1_hu8d6c0de36e7c11eb9e61089c401f8c9e_20478_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-1_hu8d6c0de36e7c11eb9e61089c401f8c9e_20478_0d2a60105870bc4d5e6d1f15a6ecd3ff.webp"
width="758"
height="537"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für den Mottotext in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Wie in Abbildung 7 gezeigt, werden die Daten (also der Mottotext) aus dem anderen Projekt nachgeladen.
Es haben nicht alle Bundesländer einen Mottotext hinterlegt, was den Abgleich nicht weiter stört.&lt;/p>
&lt;h5 id="nachladen-der-hauptstadt">Nachladen der Hauptstadt&lt;/h5>
&lt;p>Zum Nachladen der Hauptstadt der Bundesländer gehen wir im &amp;ldquo;Bundesländer&amp;rdquo;-Projekt über das Spaltenmenü
&amp;ldquo;ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">cell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cross&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Bundesländer Hauptstadt&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;ID&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Hauptstadt&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dabei ist &amp;ldquo;Bundesländer Hauptstadt&amp;rdquo; der Name des Projektes aus dem wir die Daten holen wollen,
und &amp;ldquo;ID&amp;rdquo; die ID-Spalte im Projekt &amp;ldquo;Bundesländer Hauptstadt&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-spalten-hinzufügen-dialogs-mit-cross-für-die-hauptstadt-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für die Hauptstadt in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-1_hu7b7640fd7f81d9ef7172d608638c0551_21900_60af84c29669edd40e4bd0e8a97c0b0c.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-1_hu7b7640fd7f81d9ef7172d608638c0551_21900_02cea76db379ba61cec116047373dad4.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-1_hu7b7640fd7f81d9ef7172d608638c0551_21900_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-1_hu7b7640fd7f81d9ef7172d608638c0551_21900_60af84c29669edd40e4bd0e8a97c0b0c.webp"
width="760"
height="537"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für die Hauptstadt in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Wie in Abbildung 8 gezeigt, werden die Daten (hier die Hauptstadt) aus dem anderen Projekt nachgeladen.
Es haben alle Bundesländer eine Hauptstadt, so dass der Abgleich hier für jeden Eintrag ein Ergebnis produziert.&lt;/p>
&lt;p>Außerdem ist zu erwähnen, dass sich OpenRefine hier auch nicht daran stört, dass die ID-Spalte bei uns im Projekt &amp;ldquo;Bundesländer&amp;rdquo; als Zahl, im Projekt &amp;ldquo;Bundesländer Motto&amp;rdquo; jedoch als Typ Text gespeichert ist.&lt;/p>
&lt;h4 id="zusammenführen-via-werte">Zusammenführen via Werte&lt;/h4>
&lt;p>Es ist nicht immer eine eindeutige ID-Spalte vorhanden. Das kommt zum Beispiel vor, wenn die Daten aus verschiedenen Projekten stammen.
Man kann auch ID-Spalten improvisieren, was aber nicht immer zum gewünschten Ergebnis führt.
Wir werden den Abgleich mit &lt;code>cross()&lt;/code> diesmal über die Spalte &amp;ldquo;Bundesland&amp;rdquo; durchführen.&lt;/p>
&lt;h5 id="nachladen-des-mottos-1">Nachladen des Mottos&lt;/h5>
&lt;p>Zum Nachladen des Mottos der Bundesländer gehen wir im &amp;ldquo;Bundesländer&amp;rdquo;-Projekt diesmal über das Spaltenmenü
&amp;ldquo;&lt;strong>Bundesland&lt;/strong>&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">cell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cross&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Bundesländer Motto&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Bundesland&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Mottotext&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wie in Abbildung 9 zu sehen ist, hat der Abgleich zwischen diesen beiden Projekten kein Problem, da die Bundesländer hier einheitlich geschrieben sind.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-spalten-hinzufügen-dialogs-mit-cross-für-den-mottotext-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für den Mottotext in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-2_hu6697b78a45b788c719d01c8a114442f9_24083_d0669a6f0087e5eea3f45d6c37792cd2.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-2_hu6697b78a45b788c719d01c8a114442f9_24083_5f781075b76ac04fe415c7507939cead.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-2_hu6697b78a45b788c719d01c8a114442f9_24083_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-motto-2_hu6697b78a45b788c719d01c8a114442f9_24083_d0669a6f0087e5eea3f45d6c37792cd2.webp"
width="760"
height="505"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für den Mottotext in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h5 id="nachladen-der-hauptstadt-1">Nachladen der Hauptstadt&lt;/h5>
&lt;p>Zum Nachladen der Hauptstädte der Bundesländer gehen wir im &amp;ldquo;Bundesländer&amp;rdquo;-Projekt diesmal über das Spaltenmenü
&amp;ldquo;&lt;strong>Bundesland&lt;/strong>&amp;ldquo;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden den folgenden GREL Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">cell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cross&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Bundesländer Hauptstadt&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Bundesland&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Hauptstadt&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wie in Abbildung 10 zu sehen ist, hat der Abgleich hier Probleme, da die Bundesländer teilweise unterschiedlich geschrieben sind.
Es fehlen Ergänzungen wie &amp;ldquo;Freistaat&amp;rdquo;. Daher können die Daten für diese Bundesländer nicht nachgeladen werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-spalten-hinzufügen-dialogs-mit-cross-für-die-hauptstadt-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für die Hauptstadt in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-2_hu4c75d7fba194ae1d4237304cd6172606_24268_a132f64f5f87419fa9c7732f38156bd3.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-2_hu4c75d7fba194ae1d4237304cd6172606_24268_f7b3d12e0daab7746eb26507b37ab9d0.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-2_hu4c75d7fba194ae1d4237304cd6172606_24268_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-dialog-cross-hauptstadt-2_hu4c75d7fba194ae1d4237304cd6172606_24268_a132f64f5f87419fa9c7732f38156bd3.webp"
width="760"
height="473"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Spalten hinzufügen Dialogs mit cross() für die Hauptstadt in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h4 id="ergebnis">Ergebnis&lt;/h4>
&lt;figure id="figure-bildschirmfoto-von-openrefine-mit-den-bundesländern-und-den-zusätzlichen-spalten-aus-anderen-projekten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine mit den Bundesländern und den zusätzlichen Spalten aus anderen Projekten." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-2_hu80e7646e9d78f4fe605d75de5ca9f324_25607_e877a2011489f5239b704e1e440398a0.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-2_hu80e7646e9d78f4fe605d75de5ca9f324_25607_4d9aabd79641cebb0a830ebcd68f03dc.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-2_hu80e7646e9d78f4fe605d75de5ca9f324_25607_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-2_hu80e7646e9d78f4fe605d75de5ca9f324_25607_e877a2011489f5239b704e1e440398a0.webp"
width="760"
height="363"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine mit den Bundesländern und den zusätzlichen Spalten aus anderen Projekten.
&lt;/figcaption>&lt;/figure>
&lt;p>Der Abgleich mit &lt;code>cross()&lt;/code> innerhalb von OpenRefine funktioniert recht einfach, solange es eine Spalte mit eindeutigen Werten gibt.
Der Abgleich stört sich auch nicht an Sonderzeichen, Leerzeichen oder fehlenden Werten.&lt;/p>
&lt;p>Problematisch wird es, wenn die Werte der Spalten, die abgeglichen werden, nicht komplett übereinstimmen.
Diese sind in Abbildung 11 farblich hervorgehoben. In solchen Fällen empfiehlt sich das im nächsten Abschnitt besprochene lokale Reconciling.&lt;/p>
&lt;h3 id="zusammenführen-mit-lokalem-reconciling">Zusammenführen mit lokalem Reconciling&lt;/h3>
&lt;p>Wir hatten in
&lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-09-fuenf-dinge-die-wir-an-openrefine-moegen/">Fünf Dinge, die wir an OpenRefine mögen&lt;/a>
schon die Architektur von OpenRefine gelobt, da diese so gestaltet ist, dass OpenRefine auch mit anderen APIs kommunizieren kann.
Besonders unterstützt ist dabei das &lt;a href="https://reconciliation-api.github.io/specs/latest/" target="_blank" rel="noopener">Reconciliation Service API Protokoll&lt;/a>. Damit können Daten in einem OpenRefine-Projekt nicht nur gegen &lt;a href="https://docs.openrefine.org/manual/wikibase/overview" target="_blank" rel="noopener">Wikidata&lt;/a> oder die &lt;a href="https://lobid.org/gnd/reconcile" target="_blank" rel="noopener">GND&lt;/a> abgeglichen werden, sondern mit Werkzeugen wie &lt;a href="https://github.com/gitonthescene/csv-reconcile" target="_blank" rel="noopener">csv-reconcile&lt;/a> auch mit lokalen CSV-Dateien.&lt;/p>
&lt;div class="mermaid">---
title: OpenRefine Setup
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph server[fas:fa-server Server]
server_or[fas:fa-gem OpenRefine]
server_api[fas:fa-code Reconciliation Service API]
end
subgraph laptop[fas:fa-laptop Laptop]
browser[far:fa-window-maximize Browser]
laptop_or[fas:fa-gem OpenRefine]
laptop_api[fas:fa-code Reconciliation Service API]
end
browser -.-> laptop_or &amp; server_or
laptop_or -.-> laptop_api &amp; server_api
server_or -.-> server_api
&lt;/div>
&lt;p>Für die Verwendung von csv-reconcile benötigt man &lt;a href="https://www.python.org/downloads/" target="_blank" rel="noopener">Python&lt;/a> auf seinem System.
Ist Python vorhanden, dann kann csv-reconcile einfach via Shell (PowerShell, Git Bash, &amp;hellip;) installiert werden.
Wir erstellen dafür erst eine virtuelle Umgebung in unserem Arbeitsordner, um csv-reconcile ausschließlich dort zu installieren.&lt;/p>
&lt;p>Der Arbeitsordner ist der Ordner, in dem wir unsere CSV-Dateien liegen haben, mit denen wir hier arbeiten.&lt;/p>
&lt;p>Die virtuelle Umgebung für Python ermöglicht es uns, Python Bibliotheken nur für dieses Projekt zu installieren,
so dass sie nicht mit Bibliotheken oder Python Versionen in anderen Projekten in Konflikt kommen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">python&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">venv&lt;/span> &lt;span class="n">venv&lt;/span> &lt;span class="c"># virtuelle Umgebung erstellen&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="p">.\&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">Scripts&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">activate&lt;/span> &lt;span class="c"># virtuelle Umgebung aktivieren (Windows!)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">pip&lt;/span> &lt;span class="n">install&lt;/span> &lt;span class="nb">csv-reconcile&lt;/span> &lt;span class="c"># csv-reconcile in virtuelle Umgebung installieren&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Da csv-reconcile in Version 0.3.0 den Vorschaudienst optional anbietet und keine automatische Erkennung von Encoding und Trennzeichen in CSV-Dateien hat, erstellen wir in unserem Arbeitsordner zusätzlich eine Datei &lt;code>config.py&lt;/code> mit dem folgenden Inhalt.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">CSVKWARGS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s1">&amp;#39;delimiter&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;,&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;quotechar&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;&amp;#34;&amp;#39;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CSVENCODING&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;UTF-8&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">MANIFEST&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;preview&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://localhost:5000/preview/{{id}}&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;width&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">400&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;height&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">300&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anschließend können wir mit aktivierter virtueller Umgebung in unserem Arbeitsordner den lokalen Reconciling Service für die &amp;ldquo;Bundesländer Motto&amp;rdquo; CSV-Datei initiieren und starten.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">&amp;gt;&lt;/span> &lt;span class="nb">csv-reconcile&lt;/span> &lt;span class="n">init&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-config&lt;/span> &lt;span class="n">config&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">py&lt;/span> &lt;span class="nb">bundeslaender-motto&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">csv&lt;/span> &lt;span class="n">ID&lt;/span> &lt;span class="n">Bundesland&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">&amp;gt;&lt;/span> &lt;span class="nb">csv-reconcile&lt;/span> &lt;span class="n">serve&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wenn wir mit dieser Datei fertig sind, können wir den lokalen Reconciling Service für die &amp;ldquo;Bundesländer Hauptstadt&amp;rdquo; CSV-Datei initiieren und starten.&lt;/p>
&lt;p>Ob die virtuelle Umgebung aktiv ist, sieht man an der Ergänzung &lt;code>(venv)&lt;/code> in der Shell.
Ansonnsten lässt sie sich mit &lt;code>.\venv\Scripts\activate&lt;/code> wieder aktivieren.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">&amp;gt;&lt;/span> &lt;span class="nb">csv-reconcile&lt;/span> &lt;span class="n">init&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-config&lt;/span> &lt;span class="n">config&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">py&lt;/span> &lt;span class="nb">bundeslaender-hauptstadt&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">csv&lt;/span> &lt;span class="n">ID&lt;/span> &lt;span class="n">Bundesland&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">&amp;gt;&lt;/span> &lt;span class="nb">csv-reconcile&lt;/span> &lt;span class="n">serve&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-note">
&lt;div>
Wir könnten die beiden lokalen Reconciling Services auch parallel laufen lassen, indem wir sie in unterschiedliche Ordner schieben und wie unter
&lt;a href="https://github.com/gitonthescene/csv-reconcile#common-configuration" target="_blank" rel="noopener">csv-reconcile: Common configuration&lt;/a>
beschrieben über die Variable &lt;code>SERVER_NAME&lt;/code> in der &lt;code>config.py&lt;/code> jeweils einen anderen Port setzen.
&lt;/div>
&lt;/div>
&lt;p>In OpenRefine fügen wir den lokalen Reconciliation Service hinzu, indem wir in einem Projekt über ein beliebiges
&amp;ldquo;Spaltenmenü&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo; aufrufen und dort via &amp;ldquo;Add Standard Service&amp;hellip;&amp;rdquo;
die Adresse &lt;code>http://localhost:5000/reconcile&lt;/code> eingeben.
Der Port 5000 muss entsprechend angepasst werden, wenn er in der &lt;code>config.py&lt;/code> geändert wurde.&lt;/p>
&lt;p>Siehe auch die &lt;a href="https://docs.openrefine.org/manual/reconciling#getting-started" target="_blank" rel="noopener">OpenRefine-Dokumentation zu Reconciling: Getting started&lt;/a>.&lt;/p>
&lt;h4 id="zusammenführen-via-id-1">Zusammenführen via ID&lt;/h4>
&lt;p>Idealerweise haben wir eine eindeutige ID-Spalte, um die Projekte miteinander abzugleichen.
Dann ist der lokale Reconciliation Service fast schon etwas zu mächtig,
und wird von uns eher eingesetzt, wenn wir es vermeiden wollen,
zu viele OpenRefine-Projekte zu jonglieren.&lt;/p>
&lt;h5 id="nachladen-des-mottos-2">Nachladen des Mottos&lt;/h5>
&lt;p>Wir haben den lokalen Reconciling Service für das &amp;ldquo;Bundesländer Motto&amp;rdquo;-Projekt, wie im oberen Abschnitt beschrieben, am laufen.&lt;/p>
&lt;p>Zum Nachladen des Mottos der Bundesländer gehen wir im &amp;ldquo;Bundesländer&amp;rdquo;-Projekt über das Spaltenmenü
&amp;ldquo;ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Use values as identifiers&amp;rdquo;
und wählen unseren CSV Reconciliation Service aus.&lt;/p>
&lt;p>Die IDs werden nun alle zu Links. Wie im Maus-Hover in Abbildung 12 sehen wir, dass nicht alle IDs aufgelöst werden, sondern manchmal eine &amp;ldquo;Nicht gefunden&amp;rdquo; Meldung angezeigt wird.
Zur Erinnerung: es gibt nicht für alle Bundesländer ein Motto in unseren Daten!&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-maus-hover-not-found-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Maus-Hover &amp;#39;Not Found&amp;#39; in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-1_hu39c718e5b27e6e52ff7ac1c81fff5d86_15469_f8f093dccbd7b2a8850142009bb6489e.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-1_hu39c718e5b27e6e52ff7ac1c81fff5d86_15469_b3a651b1ac2fd52b17ddff702eb9bddc.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-1_hu39c718e5b27e6e52ff7ac1c81fff5d86_15469_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-1_hu39c718e5b27e6e52ff7ac1c81fff5d86_15469_f8f093dccbd7b2a8850142009bb6489e.webp"
width="454"
height="394"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Maus-Hover &amp;lsquo;Not Found&amp;rsquo; in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Den Mottotext können wir über
&amp;ldquo;ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add columns from reconciled values&amp;hellip;&amp;rdquo;
nachladen.
Wie in Abbildung 13 zu sehen ist, kann der Dienst auch mit nicht auflösbaren IDs umgehen und ignoriert diese einfach.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-reconciliation-dialogs-mit-dem-mottotext-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Reconciliation Dialogs mit dem Mottotext in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-2_hu8fbb82745c3be04cdb0e0c8fcbb4f230_18678_dd0eb9816e0f13c6bc8e21f81c61c1aa.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-2_hu8fbb82745c3be04cdb0e0c8fcbb4f230_18678_129cf3167d621935f4e2c6611f91fbf3.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-2_hu8fbb82745c3be04cdb0e0c8fcbb4f230_18678_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-2_hu8fbb82745c3be04cdb0e0c8fcbb4f230_18678_dd0eb9816e0f13c6bc8e21f81c61c1aa.webp"
width="760"
height="561"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Reconciliation Dialogs mit dem Mottotext in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h5 id="nachladen-der-hauptstadt-2">Nachladen der Hauptstadt&lt;/h5>
&lt;p>Wir haben den lokalen Reconciling Service für das &amp;ldquo;Bundesländer Hauptstadt&amp;rdquo;-Projekt, wie im oberen Abschnitt beschrieben, am laufen.&lt;/p>
&lt;p>Zum Nachladen der Hauptstädte der Bundesländer gehen wir wieder im &amp;ldquo;Bundesländer&amp;rdquo;-Projekt über das Spaltenmenü
&amp;ldquo;ID&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Use values as identifiers&amp;rdquo;
und wählen unseren CSV Reconciliation Service aus.&lt;/p>
&lt;p>Die IDs werden nun alle wieder zu Links. Bei diesem Abgleich können alle IDs aufgelöst werden und wir sehen wie in Abbildung 14 überall Maus-Hover mit den entsprechenden Werten des gematchten Eintrags in der CSV-Datei.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-maus-hover-mit-csv-werten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Maus-Hover mit CSV Werten in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-1_hu179a3c97bcee3c78ae52c69b1b89ffc0_9947_4b3ea587ba4655d167225c20f6e3dbd5.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-1_hu179a3c97bcee3c78ae52c69b1b89ffc0_9947_2af901b6da235bf730c1790b1d781bc9.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-1_hu179a3c97bcee3c78ae52c69b1b89ffc0_9947_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-1_hu179a3c97bcee3c78ae52c69b1b89ffc0_9947_4b3ea587ba4655d167225c20f6e3dbd5.webp"
width="452"
height="360"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Maus-Hover mit CSV Werten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h4 id="zusammenführen-via-werte-1">Zusammenführen via Werte&lt;/h4>
&lt;p>Es ist nicht immer eine eindeutige ID-Spalte vorhanden.
In so einem Fall spielt der lokale Reconciliation Service seine Stärke aus,
da wir mit ihm auch &amp;ldquo;ungenaue&amp;rdquo; Werte finden und matchen können.&lt;/p>
&lt;h5 id="nachladen-des-mottos-3">Nachladen des Mottos&lt;/h5>
&lt;p>Wir haben den lokalen Reconciling Service für das &amp;ldquo;Bundesländer Motto&amp;rdquo;-Projekt, wie im oberen Abschnitt beschrieben, am laufen.&lt;/p>
&lt;p>Zum Nachladen der Mottos der Bundesländer über die Wertespalte gehen wir zu
&amp;ldquo;Bundesland&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo;
und wählen den &amp;ldquo;CSV Reconciling Service&amp;rdquo; aus.&lt;/p>
&lt;p>Wie in Abbildung 15 markiert, ist das automatische Matching etwas zu großzügig, so dass Bundesländer gematcht werden, weil sie zum Beispiel beide den Begriff &amp;ldquo;Freistaat&amp;rdquo; im Namen haben. Das kann manuell und bei größeren Datenmengen mit der Unterstützung von Facets auf den Konfidenzwerten (Wert wie gut das Matching passt) nachgearbeitet werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-ergebnis-des-automatischen-reconciling-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Ergebnis des automatischen Reconciling in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-3_hufaaadccb8b483f740a96e0e3e4446f9e_40846_ad0dc4da1e4daaaf27e3c0cfe4bc5541.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-3_hufaaadccb8b483f740a96e0e3e4446f9e_40846_726a2272f08749e7f5c6207a6c9f6f34.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-3_hufaaadccb8b483f740a96e0e3e4446f9e_40846_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-3_hufaaadccb8b483f740a96e0e3e4446f9e_40846_ad0dc4da1e4daaaf27e3c0cfe4bc5541.webp"
width="527"
height="640"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Ergebnis des automatischen Reconciling in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Den Mottotext können wir dann wieder über
&amp;ldquo;Bundesland&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add columns from reconciled values&amp;hellip;&amp;rdquo;
nachladen.
Wie in Abbildung 16 zu sehen ist, kann der Dienst auch in diesem Fall mit nicht auflösbaren IDs umgehen und ignoriert diese einfach.&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-reconciliation-dialogs-mit-dem-mottotext-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Reconciliation Dialogs mit dem Mottotext in OpenRefine." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-4_hua1c00797d48b58235eee6dfe3065f9bd_25066_bda04180895739bc24eb0236691f4c66.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-4_hua1c00797d48b58235eee6dfe3065f9bd_25066_b8e80e344cc0bd1f5426a6a31ce7ef3c.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-4_hua1c00797d48b58235eee6dfe3065f9bd_25066_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-motto-4_hua1c00797d48b58235eee6dfe3065f9bd_25066_bda04180895739bc24eb0236691f4c66.webp"
width="760"
height="555"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Reconciliation Dialogs mit dem Mottotext in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h5 id="nachladen-der-hauptstadt-3">Nachladen der Hauptstadt&lt;/h5>
&lt;p>Wir haben den lokalen Reconciling Service für das &amp;ldquo;Bundesländer Hauptstadt&amp;rdquo;-Projekt, wie im oberen Abschnitt beschrieben, am laufen.&lt;/p>
&lt;p>Zum Nachladen der Hauptstädte der Bundesländer über die Wertespalte gehen wir zu
&amp;ldquo;Bundesland&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo;
und wählen den &amp;ldquo;CSV Reconciliation Service&amp;rdquo; aus.&lt;/p>
&lt;p>Da wir in diesem Datensatz passende Einträge für alle Bundesländer haben, funktioniert das Matching, wie in Abbildung 17 zu sehen ist, recht gut, obwohl die Bundesländer teilweise anders geschrieben sind.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-oberfläche-von-openrefine-mit-den-reconciliation-ergebnissen-für-die-bundesländer">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Oberfläche von OpenRefine mit den Reconciliation Ergebnissen für die Bundesländer." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-2_hu4c933afed31667bc96f7b0214c9301a9_28800_fc3c3332f7db8636609b779c541fe682.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-2_hu4c933afed31667bc96f7b0214c9301a9_28800_39b10a95abf5152d45e2c4c10f882a39.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-2_hu4c933afed31667bc96f7b0214c9301a9_28800_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-csv-reconcile-hauptstadt-2_hu4c933afed31667bc96f7b0214c9301a9_28800_fc3c3332f7db8636609b779c541fe682.webp"
width="311"
height="608"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Oberfläche von OpenRefine mit den Reconciliation Ergebnissen für die Bundesländer.
&lt;/figcaption>&lt;/figure>
&lt;h4 id="ergebnis-1">Ergebnis&lt;/h4>
&lt;p>Der Abgleich mit dem lokalen Reconciling Service hat initial einen höherne Aufwand,
da sowohl Python auf dem System als auch der CSV Reconciling Service in OpenRefine eingerichtet werden müssen.
Dann ist das Verfahren jedoch deutlich flexibler als das Zusammenführen mit &lt;code>cross()&lt;/code>,
da darüber sowohl ein exaktes ID Matching und Nachladen von Spalten durchgeführt werden kann,
als auch ein so genanntes Fuzzy-Matching, bei dem die Werte in den Spalten nicht exakt übereinstimmen.&lt;/p>
&lt;p>In Abbildung 18 sind nochmal alle nachgeladenen Spalten abgebildet, wobei&lt;/p>
&lt;ol>
&lt;li>via &lt;code>cross()&lt;/code> auf der ID-Spalte&lt;/li>
&lt;li>via &lt;code>cross()&lt;/code> auf der Werte-Spalte (Namen Bundesland)&lt;/li>
&lt;li>via lokalem Reconciling Service auf der ID-Spalte&lt;/li>
&lt;li>via lokalem Reconciling Service auf der Werte-Spalte (Namen Bundesland)&lt;/li>
&lt;/ol>
&lt;p>nachgeladen wurde.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-openrefine-mit-den-bundesländern-und-den-zusätzlichen-spalten-aus-anderen-projekten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von OpenRefine mit den Bundesländern und den zusätzlichen Spalten aus anderen Projekten." srcset="
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-3_huc3da5552be0ef16b9ee88e54332fa22a_26618_194dc0b3625ba75ea1a731c7431780d2.webp 400w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-3_huc3da5552be0ef16b9ee88e54332fa22a_26618_ed5d312a4e0a6be6d76c570357b24a80.webp 760w,
/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-3_huc3da5552be0ef16b9ee88e54332fa22a_26618_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-12-gemeinsam-an-openrefine-projekten-arbeiten/screenshot-openrefine-bundeslaender-3_huc3da5552be0ef16b9ee88e54332fa22a_26618_194dc0b3625ba75ea1a731c7431780d2.webp"
width="760"
height="220"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von OpenRefine mit den Bundesländern und den zusätzlichen Spalten aus anderen Projekten.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="ausblick-auf-weitere-methoden">Ausblick auf weitere Methoden&lt;/h2>
&lt;p>Für das Zusammenführen von Datensätzen mit OpenRefine gibt es noch weitere Möglichkeiten, die sich aktuell in der Planung und Entwicklung befinden.&lt;/p>
&lt;p>Zum einen gibt es &lt;a href="%28https://github.com/OpenRefine/OpenRefine/issues/2003%29">Überlegungen&lt;/a>
für Projekte in OpenRefine automatisch einen Reconciliation Service zu erstellen,
so dass analog zu &lt;code>cross()&lt;/code> direkt innerhalb von OpenRefine ein Reconciling gegen andere Projekte durchgeführt werden kann.
Also Reconciling innerhalb von OpenRefine ohne separaten lokalen Reconciling Service.&lt;/p>
&lt;p>Zum anderen gibt es mit &lt;a href="https://datasette.io/" target="_blank" rel="noopener">Datasette&lt;/a>
ein komplettes Ökosystem um &lt;a href="https://datasette.io/tools" target="_blank" rel="noopener">Daten in SQLite einzulesen&lt;/a>
und anschließend via &lt;a href="https://datasette.io/plugins" target="_blank" rel="noopener">unterschiedlicher APIs&lt;/a> zur Verfügung zu stellen.
Es wird gerade auch ein &lt;a href="https://github.com/drkane/datasette-reconcile" target="_blank" rel="noopener">Reconciliation Plugin für Datasette&lt;/a> entwickelt.&lt;/p>
&lt;p>Gibt es in Arbeitsgruppen Datensätze, die intern oder extern veröffentlicht und auch für Reconciliation genutzt werden sollen, dann lohnt sich ein Blick auf dieses Werkzeug.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>OpenRefine bietet mit seiner Architektur das Potential zukünftig kollaboratives Arbeiten zu ermöglichen.
Bis dahin können wir uns selbst helfen und mit wenig Extraaufwand Aufgaben aufteilen und die Ergebnisse wieder zusammenführen.
Mit der &lt;code>cross()&lt;/code> Funktion können wir direkt Daten aus anderen OpenRefine-Projekten über ID-Spalten übernehmen.
Mit einem lokalem Reconciling Service können wir auch Daten aus unterschiedlichen Projekten verbinden.&lt;/p>
&lt;p>Bisher klappt das beschriebene Vorgehen im FDMLab ganz gut und wir beobachten weiterhin gespannt die Entwicklung sowohl von OpenRefine,
als auch von anderen Werkzeugen wie csv-reconcile und Datasette, die es hervorragend ergänzen.&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Die Mottotexte wurden aus &lt;a href="https://www.wikidata.org/" target="_blank" rel="noopener">Wikidata&lt;/a> geladen und sind daher genauso (un)vollständig, wie die Daten dort.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Findbuchdaten mit OpenRefine wiederverwenden</title><link>https://fdmlab.landesarchiv-bw.de/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/</link><pubDate>Tue, 24 Aug 2021 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/</guid><description>&lt;p>In diesem Artikel behandeln wir die Frage, wie wir schon aufbereitete Daten mit OpenRefine wiederverwenden können.&lt;/p>
&lt;p>Wir haben schon einen &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/">Findbuch Index mit OpenRefine aufbereitet&lt;/a>.
wenn wir nun den Prokuratoren Index von &amp;ldquo;&lt;em>Band 57: Akten des Reichskammergerichts im Staatsarchiv Sigmaringen - Inventar des Bestands R 7. Bearb. von Raimund J. Weber. Kohlhammer 2004&lt;/em>&amp;rdquo; bearbeiten wollen, dann wäre zu erwarten, dass wir das Projekt nachnutzen können.&lt;/p>
&lt;p>Dies ist bedingt möglich. Zum einen können wir die Operationen aus der letzten Findbuchaufbereitung wiederverwenden.
Zum anderen können wir die Prokuratoren mit den Prokuratoren aus dem letzten Projekt abgleichen.&lt;/p>
&lt;p>Um es vorweg zu nehmen: es hat sich gezeigt, dass wir nur einen Teil der Operationen und Prokuratoren übernehmen können.
Aber gerade bei den Operationen ist das eine ziemliche Zeitersparnis.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir benötigen drei Dateien (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/rkg-57/akten-rkg-band-57-prokuratoren.txt" target="_blank">
&lt;i class="fas fa-file-alt pr-1 fa-fw">&lt;/i>Index Prokuratoren Akten RKG Band 57&lt;/a>
&lt;blockquote>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/rkg-57/akten-rkg-band-57-openrefine-prokuratoren.json" target="_blank">
&lt;i class="fas fa-file-archive pr-1 fa-fw">&lt;/i>Index Prokuratoren Akten RKG Band 57 als OpenRefine Arbeitsschritte&lt;/a>
&lt;blockquote>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/rkg-57/akten-rkg-band-57-wertheim-prokuratoren.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Prokuratoren Akten RKG Band 57 - Wertheim als CSV&lt;/a>
&lt;p>Wir möchten explizit dazu einladen diese Dateien zu nutzen, um die einzelnen Schritte in OpenRefine selbst auszuprobieren und damit zu experimentieren.&lt;/p>
&lt;h2 id="operationen-übertragen">Operationen übertragen&lt;/h2>
&lt;p>Mit OpenRefine ist es möglich, die durchgeführten Operationen eines Projektes zu exportieren und in einem anderen Projekt zu importieren.
Beschrieben ist das im &lt;a href="https://docs.openrefine.org/manual/running#reusing-operations" target="_blank" rel="noopener">OpenRefine Manual&lt;/a>.&lt;/p>
&lt;p>Zuerst erstellen wir das Projekt in OpenRefine mit der Datei &lt;code>akten-rkg-band-57-prokuratoren.txt&lt;/code> als Grundlage.
Die Einstellungen sind in Abbildung 1 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-ansicht-zum-erstellen-neuer-projekte-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Ansicht zum Erstellen neuer Projekte in OpenRefine." srcset="
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-create-project_huffa3598330b71b2bc1ce4a2c5104db49_82035_a379f7001843141103fbf5d108508dcc.webp 400w,
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-create-project_huffa3598330b71b2bc1ce4a2c5104db49_82035_98558c818e5edd40a414a8f0f169fb3d.webp 760w,
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-create-project_huffa3598330b71b2bc1ce4a2c5104db49_82035_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-create-project_huffa3598330b71b2bc1ce4a2c5104db49_82035_a379f7001843141103fbf5d108508dcc.webp"
width="760"
height="335"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Ansicht zum Erstellen neuer Projekte in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Mit der Schaltfläche &amp;ldquo;Extract&amp;hellip;&amp;rdquo; bei &amp;ldquo;Undo/Redo&amp;rdquo; (siehe Abbildung 2) können wir die Operationen aus einem Projekt exportieren und mit der Schaltfläche &amp;ldquo;Apply..&amp;rdquo; anwenden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-schaltfläche-zum-anwenden-von-exportieren-operationen-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Schaltfläche zum Anwenden von exportieren Operationen in OpenRefine." srcset="
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-apply-history_hu97e08a0ed45663f2db56bc6d326fe481_11384_b26bc7192540f6fb481f61bd203cc177.webp 400w,
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-apply-history_hu97e08a0ed45663f2db56bc6d326fe481_11384_fb0e24d71b56a427a414088450873dde.webp 760w,
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-apply-history_hu97e08a0ed45663f2db56bc6d326fe481_11384_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-apply-history_hu97e08a0ed45663f2db56bc6d326fe481_11384_b26bc7192540f6fb481f61bd203cc177.webp"
width="404"
height="124"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Schaltfläche zum Anwenden von exportieren Operationen in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Nach Klicken der Schaltfläche &amp;ldquo;Apply..&amp;rdquo; können wir die exportierten Operationen aus &lt;code>akten-rkg-band-57-openrefine-prokuratoren.json&lt;/code> wie in Abbildung 3 gezeigt einfügen und mit &amp;ldquo;Perform Operations&amp;rdquo; die Operationen auf dem aktuellen Projekt anwenden.&lt;/p>
&lt;figure id="figure-dialog-zum-anwenden-von-exportieren-operationen-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Dialog zum Anwenden von exportieren Operationen in OpenRefine." srcset="
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-dialog-history_hufea20d8a60dc05561e0381ca4d811726_30143_4372b6b75c032c3ab06937c00f8f67e0.webp 400w,
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-dialog-history_hufea20d8a60dc05561e0381ca4d811726_30143_8fa74f20ca26e887000648417dff0f7b.webp 760w,
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-dialog-history_hufea20d8a60dc05561e0381ca4d811726_30143_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-dialog-history_hufea20d8a60dc05561e0381ca4d811726_30143_4372b6b75c032c3ab06937c00f8f67e0.webp"
width="760"
height="572"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Dialog zum Anwenden von exportieren Operationen in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Bei unserem ersten Versuch haben wir festgestellt, dass die Operationen von unserem &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/">letzten Artikel&lt;/a> nicht direkt auf diesen Index anwendbar sind.
Beim Anwenden von Operationen aus einem anderen Projekt sind einige Dinge zu beachten.&lt;/p>
&lt;ol>
&lt;li>Die &lt;code>.json&lt;/code> Datei sollte mit einem Quelltexteditor wie (unter Windows) der Editor App, &lt;a href="https://notepad-plus-plus.org/" target="_blank" rel="noopener">Notepad++&lt;/a> oder &lt;a href="https://code.visualstudio.com/" target="_blank" rel="noopener">Visual Studio Code&lt;/a> geöffnet (und bearbeitet) werden.&lt;/li>
&lt;li>Die Spaltennamen in den beiden Projekten müssen die gleichen Namen haben.&lt;/li>
&lt;li>Manuelle Editieroperationen und Filteroperationen werden nicht mit übertragen.&lt;/li>
&lt;/ol>
&lt;p>In unserem konkreten Fall gab es zusätzlich die folgenden Probleme&lt;/p>
&lt;ul>
&lt;li>Die Extraktion der Seitenzahlen funktioniert nicht, da die Kopfzeilen sich unterscheiden.&lt;/li>
&lt;li>Das zweispaltige Layout hat statt 4 einen Minimalabstand von 3 Leerzeichen.&lt;/li>
&lt;li>Es gibt Zeilenumbrüche bei dem Namen der Prokuratoren und bei den Verweisen.&lt;/li>
&lt;li>Die Anpassungen für das &amp;ldquo;reconciling&amp;rdquo; lassen sich nicht übertragen.&lt;/li>
&lt;/ul>
&lt;p>In der Datei &lt;code>akten-rkg-band-57-openrefine-prokuratoren.json&lt;/code> haben wir die Operationen entsprechend bereinigt und angepasst, so dass sie direkt angewendet werden können. In Abbildung 4 ist das Ergebnis der Anwendung zu sehen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-daten-nach-der-anwendung-der-operationen-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Daten nach der Anwendung der Operationen in OpenRefine." srcset="
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-view-after-history_hub588ecfdf40463365e3d01a1e0691329_166566_6814b68d0eb6f679068063d0552ada2f.webp 400w,
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-view-after-history_hub588ecfdf40463365e3d01a1e0691329_166566_3a263ad6ace05aa5eea1c05c25d690aa.webp 760w,
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-view-after-history_hub588ecfdf40463365e3d01a1e0691329_166566_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-view-after-history_hub588ecfdf40463365e3d01a1e0691329_166566_6814b68d0eb6f679068063d0552ada2f.webp"
width="760"
height="369"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Daten nach der Anwendung der Operationen in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Bei &amp;ldquo;Albrecht von Lauterbach&amp;rdquo; ist eine andere Formatierung verwendet worden, die wir manuell nachkorrigiert haben.
Dafür sind wir in der &amp;ldquo;History&amp;rdquo; der Operationen zurück zu Schritt 33 gegangen.
Dann haben wir die fehlerhaften Einträge manuell via &amp;ldquo;inline editing&amp;rdquo; korrigiert.
Anschließend haben wir die (ehemaligen) Operationen 34 und 35 erneut via &amp;ldquo;Apply&amp;hellip;&amp;rdquo; angewendet.
Die (ehemaligen) Operationen 34 und 35 haben wir hier direkt zum Kopieren in den Artikel eingefügt:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;op&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;core/column-addition&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;engineConfig&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;facets&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;mode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;row-based&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;baseColumnName&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Nachname&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;expression&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;join ([coalesce(cells[&amp;#39;Nachname&amp;#39;].value,&amp;#39;&amp;#39;),coalesce(cells[&amp;#39;Vorname&amp;#39;].value,&amp;#39;&amp;#39;)],&amp;#39;, &amp;#39;)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;onError&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;keep-original&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;newColumnName&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Name&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;columnInsertIndex&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Create column Name at index 1 based on column Nachname using expression join ([coalesce(cells[&amp;#39;Nachname&amp;#39;].value,&amp;#39;&amp;#39;),coalesce(cells[&amp;#39;Vorname&amp;#39;].value,&amp;#39;&amp;#39;)],&amp;#39;, &amp;#39;)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;op&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;core/column-move&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;columnName&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Name&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;index&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Move column Name to position 0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="zwischenfazit">Zwischenfazit&lt;/h3>
&lt;p>Die Übertragung von Verkettungen von Operationen, wie zum Beispiel das Auflösen eines zweispaltigen Layouts, ist praktisch und spart dem versierten Benutzer einiges an Zeit. Durch die automatisch generierten Beschreibungstexte für die Operationen ist es jedoch nicht leicht, die entsprechenden Blöcke von Operationen auch zu identifizieren.&lt;/p>
&lt;h2 id="abgleich-mit-lokaler-csv-datei">Abgleich mit lokaler CSV Datei&lt;/h2>
&lt;p>Mit der Datei &lt;code>akten-rkg-band-57-wertheim-prokuratoren.csv&lt;/code> besitzen wir eine (kleine) lokale Datenbank mit bereits aufbereiteten Prokuratoren.
Diese können wir zum Abgleich mit unseren aufbereiteten Daten in OpenRefine verwenden.
Dafür gibt es Werkzeuge, die eine CSV Datei als &amp;ldquo;Reconciliation Service&amp;rdquo; zur Verfügung stellen.&lt;/p>
&lt;h3 id="abgleich-mit-reconcile-csv-clojure">Abgleich mit reconcile-csv (Clojure)&lt;/h3>
&lt;p>Das Projekt &lt;a href="http://okfnlabs.org/reconcile-csv/" target="_blank" rel="noopener">reconcile-csv&lt;/a> basiert auf &lt;a href="https://clojure.org/" target="_blank" rel="noopener">Clojure&lt;/a> und lässt sich daher direkt mit der gleichen Java Version ausführen, mit der wir auch OpenRefine verwenden.
Dafür erstellen wir im Ordner mit der &lt;code>openrefine.exe&lt;/code> einen Ordner &lt;code>services&lt;/code> und kopieren die heruntergeladene &lt;code>reconcile-csv-0.1.2.jar&lt;/code> hinein.&lt;/p>
&lt;p>In dem Ordner öffnen wir anschließend eine PowerShell und führen mit der Java Version von OpenRefine die &lt;code>.jar&lt;/code> Datei aus.
Das CSV Reconciliation Service benötigt drei Parameter:&lt;/p>
&lt;ol>
&lt;li>Der Pfad zu der CSV Datei.&lt;/li>
&lt;li>Der Name der Spalte mit der abgeglichen werden soll.&lt;/li>
&lt;li>Der Name der Spalte mit einem eindeutigen Wert (ID) für jede Zeile. &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">.\&lt;/span>&lt;span class="n">server&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">target&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">jre&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">java&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">exe&lt;/span> &lt;span class="n">-jar&lt;/span> &lt;span class="p">.\&lt;/span>&lt;span class="n">services&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="nb">reconcile-csv&lt;/span>&lt;span class="p">-&lt;/span>&lt;span class="mf">0.1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">jar&lt;/span> &lt;span class="p">.\&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="nb">akten-rkg&lt;/span>&lt;span class="o">-band&lt;/span>&lt;span class="p">-&lt;/span>&lt;span class="mf">57&lt;/span>&lt;span class="n">-wertheim-prokuratoren&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">csv&lt;/span> &lt;span class="n">Name&lt;/span> &lt;span class="n">Nr&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Mit &amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo; können wir auf der Spalte Name den &amp;ldquo;Reconciliation&amp;rdquo; Vorgang starten und dort die Adresse &lt;code>http://localhost:8000/reconcile&lt;/code> als &amp;ldquo;Reconciliation Service&amp;rdquo; hinzufügen.&lt;/p>
&lt;p>Wie in Abbildung 5 gezeigt, gibt es für die einzelnen Ergebnisvorschläge auch eine Vorschau Funktion, in der die Inhalte der Tabellenzeile zum besseren Abgleich angezeigt werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-vom-abgleich-mit-reconcile-csv-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto vom Abgleich mit &amp;#39;reconcile-csv&amp;#39; in OpenRefine." srcset="
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-reconcile-dialog_hu34d6fa633cf59b7f58586ffcb0989db1_81588_5dabc4222d5b07f8bd9ce3745efb82f9.webp 400w,
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-reconcile-dialog_hu34d6fa633cf59b7f58586ffcb0989db1_81588_9bb9395b3167fcab6b0f8776402bed8c.webp 760w,
/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-reconcile-dialog_hu34d6fa633cf59b7f58586ffcb0989db1_81588_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-08-findbuch-daten-mit-openrefine-wiederverwenden/openrefine-reconcile-dialog_hu34d6fa633cf59b7f58586ffcb0989db1_81588_5dabc4222d5b07f8bd9ce3745efb82f9.webp"
width="760"
height="334"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto vom Abgleich mit &amp;lsquo;reconcile-csv&amp;rsquo; in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Wir konnten mit dem lokalen Abgleich 28 Prokuratoren aus unserer Liste finden.&lt;/p>
&lt;p>An dieser Stelle würden wir gerne weitere Daten aus der CSV Datei laden, wie es von dem von &lt;a href="https://docs.openrefine.org/manual/reconciling#fetching-more-data" target="_blank" rel="noopener">OpenRefine unterstützen Data Extension API&lt;/a> angeboten wird.
Leider wird diese Funktionalität in diesem Service nicht unterstützt.
Da das Projekt Stand August 2021 seit 2015 nicht mehr weiterentwickelt wurde, ist damit auch nicht zu rechnen.&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>&lt;/p>
&lt;h3 id="abgleich-mit-csv-reconcile-python">Abgleich mit csv-reconcile (Python)&lt;/h3>
&lt;p>Ein neueres Projekt zum Abgleich mit lokalen CSV Dateien ist &lt;a href="https://github.com/gitonthescene/csv-reconcile" target="_blank" rel="noopener">csv-reconcile&lt;/a>, welches auf &lt;a href="https://www.python.org/" target="_blank" rel="noopener">Python&lt;/a> basiert und sich aktiv in der Entwicklung befindet.&lt;/p>
&lt;p>Wie wir schon im Artikel &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-08-ner-mit-openrefine-und-spacy/">Named Entity Recognition mit OpenRefine und spaCy&lt;/a> festgestellt haben, ist die Verwendung von Python Frameworks mit OpenRefine aufwendiger, da wir dafür zusätzlich eine aktuelle Python Installation benötigen.&lt;/p>
&lt;p>Haben wir lokal Python installiert, dann können wir mit PowerShell im gleichen &lt;code>services&lt;/code> Ordner wie im letzten Abschnitt
eine virtuelle Python Umgebung anlegen (1),
diese virtuelle Umgebung aktivieren (2),
das Paket &lt;code>csv-reconcile&lt;/code> mit pip installieren (3),
und den &amp;ldquo;CSV Reconciliation Service&amp;rdquo; starten (4).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">python&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">venv&lt;/span> &lt;span class="n">venv&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.\&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">Scripts&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">activate&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pip&lt;/span> &lt;span class="n">install&lt;/span> &lt;span class="nb">csv-reconcile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">csv-reconcile&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-init-db&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-config&lt;/span> &lt;span class="n">config&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">py&lt;/span> &lt;span class="p">..\&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="nb">akten-rkg&lt;/span>&lt;span class="o">-band&lt;/span>&lt;span class="p">-&lt;/span>&lt;span class="mf">57&lt;/span>&lt;span class="n">-wertheim-prokuratoren&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">csv&lt;/span> &lt;span class="n">Nr&lt;/span> &lt;span class="n">Name&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Leider konnte unsere CSV Datei auf Grund ihres Formates und Kodierung nicht auf Anhieb richtig geladen werden, so dass wir zusätzlich eine Konfigurationsdatei &lt;code>config.py&lt;/code> mit dem folgenden Inhalt im Ordner &lt;code>services&lt;/code> hinterlegt haben.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">CSVKWARGS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s1">&amp;#39;delimiter&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;,&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;quotechar&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;&amp;#34;&amp;#39;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CSVENCODING&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;UTF-8&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Der &amp;ldquo;CSV Reconciliation Service&amp;rdquo; ist anschließend unter &lt;code>http://localhost:5000/reconcile&lt;/code> erreichbar.&lt;/p>
&lt;p>Das Python Projekt ist deutlich flexibler und ausführlicher zu konfigurieren, als das ältere Clojure Projekt.
Es unterstützt auch die &amp;ldquo;Data Extension API&amp;rdquo;, so dass wir nach dem Abgleich weitere Spalten aus der CSV Datei nachladen können.
&lt;del>Leider fehlt noch eine Vorschau, so dass kein visueller Abgleich zum Beispiel mit den Wirkdaten der Prokuratoren möglich ist.&lt;/del>
Ab &lt;a href="https://github.com/gitonthescene/csv-reconcile/releases/tag/v0.3.0" target="_blank" rel="noopener">Version 0.3.0&lt;/a> gibt es eine optionale Vorschau Funktion.&lt;/p>
&lt;h2 id="abgleich-mit-der-gnd">Abgleich mit der GND&lt;/h2>
&lt;p>Nachdem wir etwa 10 Prozent der Prokuratoren mit unseren lokalen Daten abgleichen konnten, können wir nun den Rest direkt mit der Gemeinsamen Normdatei (GND) abgleichen.
Darauf sind wir in &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/">Findbuch Index mit OpenRefine aufbereiten&lt;/a> genauer eingegangen und werden das daher hier nicht weiter vertiefen.&lt;/p>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;div class="mermaid">---
title: Prozess
config:
look: handDrawn
theme: neutral
---
flowchart LR
text[fas:fa-file-alt Text]
code[fas:fa-code Code]
index[fas:fa-file-csv Index]
data[fas:fa-table Table]
partially[fas:fa-tasks Parts]
gnd[fas:fa-database GND]
semantic[fas:fa-project-diagram Graph]
text --> data --> partially --> semantic
code --> data
index --> partially
gnd --> semantic
&lt;/div>
&lt;p>Die Möglichkeit &lt;code>json&lt;/code> Schnippsel mit Verkettungen von Operationen für komplexe Aufgaben zu importieren gefällt uns, und wir werden diese Methode gegebenenfalls öfter verwenden.&lt;/p>
&lt;p>Für den komfortablen Abgleich mit einer lokalen CSV Datei fehlte den beiden getesteten Bibliotheken noch Funktionalität.&lt;/p>
&lt;p>Das auf Clojure basierende reconcile-csv lässt sich ohne großen Mehraufwand verwenden und bietet eine hilfreiche Vorschau Funktion.
Ohne eine Unterstützung der &amp;ldquo;Data Extension API&amp;rdquo; ist es für unsere Anwendungsfälle aber nur beschränkt nutzbar.&lt;/p>
&lt;p>Das auf Python basierende csv-reconcile benötigt eine lokale Python Installation und bietet noch keine Vorschau Funktion, ohne die sich der Datenabgleich teilweise mühsam gestaltet.&lt;/p>
&lt;p>Die Möglichkeit eigene Datenbanken in Form von CSV Dateien zu nutzen, oder wie im Falle der Indizes zu den Akten des Reichskammergerichts schrittweise aufzubauen, ist jedoch vorhanden und hat das Potential von großer Arbeitserleichterung.&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Da wir bei der Bearbeitung des Prokuratoren Index der Akten in Wertheim nicht alle Prokuratoren mit einer GND-ID verknüpfen konnten,
haben wir den Daten eine Spalte Nr mit der &amp;ldquo;GREL expression&amp;rdquo; &lt;code>row.index + 1&lt;/code> hinzugefügt.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>Eine Möglichkeit das &amp;ldquo;Data Extension Problem&amp;rdquo; zu umgehen, ist aus den abgeglichenen Daten eine neue Spalte mit der &amp;ldquo;GREL expression&amp;rdquo; &lt;code>cell.recon.match.id&lt;/code> zu erzeugen und die beiden Dateien anschließend mit einem anderen Werkzeug zusammenzuführen. Eine weitere Möglichkeit besteht darin, die andere CSV Datei in OpenRefine als Projekt zu laden und den Abgleich mit der Funktion &lt;a href="https://docs.openrefine.org/manual/grelfunctions#crosscell-s-projectname-s-columnname" target="_blank" rel="noopener">cross&lt;/a> durchzuführen.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Named Entity Recognition mit OpenRefine und spaCy</title><link>https://fdmlab.landesarchiv-bw.de/post/2021-08-ner-mit-openrefine-und-spacy/</link><pubDate>Tue, 10 Aug 2021 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/post/2021-08-ner-mit-openrefine-und-spacy/</guid><description>&lt;p>In diesem Artikel beschreiben wir unsere Versuche mit OpenRefine ein &amp;ldquo;Named Entity Recognition&amp;rdquo; mit spaCy durchzuführen, um die Entities anschließend mit der Gemeinsamen Normdatei (GND) abzugleichen.&lt;/p>
&lt;p>OpenRefine kann &lt;a href="https://docs.openrefine.org/manual/jythonclojure#jython" target="_blank" rel="noopener">Python Code ausführen&lt;/a>.
Dann sollte es doch auch möglich sein, damit eine &amp;ldquo;Named Entity Recognition&amp;rdquo; mit dem auf Python basierten Framework &lt;a href="https://spacy.io" target="_blank" rel="noopener">spaCy&lt;/a> durchzuführen.
⚠️ Leider hat es sich gezeigt, dass sich die Umsetzung technischer gestaltet als erwartet.&lt;/p>
&lt;p>Da wir uns &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-06-der-fdmlab-blog/">vornahmen auch negative Erfahrungen zu berichten&lt;/a> gehen wir wie folgt vor:&lt;/p>
&lt;ol>
&lt;li>Wir beschreiben, wie wir uns die Umsetzung vorgestellt hätten.&lt;/li>
&lt;li>Wir erklären, weshalb das nicht funktioniert.&lt;/li>
&lt;li>Wir zeigen eine flexible, dafür technisch aufwendigere Lösung.&lt;/li>
&lt;/ol>
&lt;h2 id="versuch-spacy-in-openrefine-ausführen">Versuch: spaCy in OpenRefine ausführen&lt;/h2>
&lt;p>OpenRefine bringt mit &lt;a href="https://www.jython.org/" target="_blank" rel="noopener">Jython&lt;/a> eine Java Implementierung für &lt;a href="https://www.python.org/" target="_blank" rel="noopener">Python&lt;/a> mit.
Theoretisch ist es also möglich das Python Framework spaCy als Python Paket zu installieren und direkt in OpenRefine auszuführen.&lt;/p>
&lt;p>Unser gedachtes Vorgehen: wir nehmen an, dass wir auf einem Windows System sind.
Dort gehen wir mit dem Dateiexplorer in den OpenRefine Ordner mit integrierter Java Umgebung und öffnen dort eine PowerShell.
Dann aktivieren wir mit Jython den Python Paketmanager pip (Zeile 1), installieren spaCy (Zeile 2) und laden ein deutsches Sprachmodell (Zeile 3).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">.\&lt;/span>&lt;span class="n">server&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">target&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">jre&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">java&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">exe&lt;/span> &lt;span class="n">-jar&lt;/span> &lt;span class="p">.\&lt;/span>&lt;span class="n">webapp&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">extensions&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">jython&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">module&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="nb">MOD-INF&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">lib&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="nb">jython-standalone&lt;/span>&lt;span class="p">-&lt;/span>&lt;span class="mf">2.7&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">jar&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">ensurepip&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.\&lt;/span>&lt;span class="n">server&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">target&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">jre&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">java&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">exe&lt;/span> &lt;span class="n">-jar&lt;/span> &lt;span class="p">.\&lt;/span>&lt;span class="n">webapp&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">extensions&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">jython&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">module&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="nb">MOD-INF&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">lib&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="nb">jython-standalone&lt;/span>&lt;span class="p">-&lt;/span>&lt;span class="mf">2.7&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">jar&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">pip&lt;/span> &lt;span class="n">install&lt;/span> &lt;span class="n">spacy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.\&lt;/span>&lt;span class="n">server&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">target&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">jre&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">java&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">exe&lt;/span> &lt;span class="n">-jar&lt;/span> &lt;span class="p">.\&lt;/span>&lt;span class="n">webapp&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">extensions&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">jython&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">module&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="nb">MOD-INF&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">lib&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="nb">jython-standalone&lt;/span>&lt;span class="p">-&lt;/span>&lt;span class="mf">2.7&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">jar&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">spacy&lt;/span> &lt;span class="n">download&lt;/span> &lt;span class="n">de_core_news_sm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Hätte das funktioniert, könnten wir nun im &amp;ldquo;expression&amp;rdquo; Editor zum Beispiel beim Hinzufügen oder Transformieren von Spalten von GREL auf Jython umstellen und mit folgendem Code ein &amp;ldquo;Named Entity Recognition&amp;rdquo; mit spaCy auf den Inhalten durchführen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">spacy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">nlp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">spacy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;de_core_news_sm&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">doc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">nlp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ent&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;||&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">ent&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">label_&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">ent&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">doc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ents&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>🚫 Leider funktioniert die Installation von spaCy in Jython via pip nicht.&lt;/p>
&lt;h3 id="technische-hintergründe">Technische Hintergründe&lt;/h3>
&lt;p>Jython implementiert aktuell Python in Version &lt;strong>2.7&lt;/strong>.
Seit Januar 2020 wird Python in Version &lt;strong>2&lt;/strong> jedoch nicht mehr weiterentwickelt und auch nicht mehr mit Bugfixes versorgt (Status &lt;em>end-of-life&lt;/em>).
Die aktuelle Version von Python ist Version &lt;strong>3.9&lt;/strong>.&lt;/p>
&lt;p>Entsprechend sind Bibliotheken in aktueller Version häufig auch nur noch mit Unterstützung für Python &lt;strong>3&lt;/strong> zu finden.
Eine Neuentwicklung von Jython um Python in Version &lt;strong>3&lt;/strong> zu unterstützen, oder basierend auf neuer Technologie wie &lt;a href="https://www.graalvm.org/" target="_blank" rel="noopener">GraalVM&lt;/a> nutzbar zu machen, ist nach wie vor in Planung/Umsetzung (siehe &lt;a href="https://www.jython.org/jython-3-roadmap" target="_blank" rel="noopener">Python 3 Roadmap&lt;/a>).&lt;/p>
&lt;p>Aber auch ältere Versionen von Bibliotheken mit Unterstützung für Python &lt;strong>2&lt;/strong> sind nicht &lt;em>einfach&lt;/em> via pip zu installieren.
Das liegt daran, dass Jython auf Java basiert, viele Python Bibliotheken unter der Haube jedoch Abhängigkeiten zur Programmiersprache C haben.&lt;/p>
&lt;h2 id="alternative-spacy-separat-ausführen">Alternative: spaCy separat ausführen&lt;/h2>
&lt;p>Wenn wir spaCy nicht in OpenRefine zum Laufen bekommen, dann können wir es stattdessen separat als Webservice betreiben.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
In &lt;a href="https://programminghistorian.org/en/lessons/fetch-and-parse-data-with-openrefine#post-request" target="_blank" rel="noopener">&amp;ldquo;Fetching and Parsing Data from the Web with OpenRefine&amp;rdquo;&lt;/a> wird gezeigt, wie mit OpenRefine das &lt;a href="http://text-processing.com/" target="_blank" rel="noopener">Text Processing API&lt;/a> verwendet werden kann. Das Projekt unterstützt aktuell Englisch, Holländisch, Portugiesisch und Spanisch. Ähnliche Freemium Angebote gibt es auch mit deutschen Sprachmodellen.
&lt;/div>
&lt;/div>
&lt;p>Anstatt einen externen Dienst zu bemühen, wollen wir den Dienst lokal laufen lassen.
Dafür packen wir &lt;a href="https://spacy.io" target="_blank" rel="noopener">spaCy&lt;/a> mit &lt;a href="https://fastapi.tiangolo.com/" target="_blank" rel="noopener">FastAPI&lt;/a> in ein API und verwenden &lt;a href="https://www.uvicorn.org/" target="_blank" rel="noopener">Uvicorn&lt;/a> als Server.&lt;/p>
&lt;h3 id="python-39-installieren">Python 3.9 installieren&lt;/h3>
&lt;p>Python 3.9 kann in Form einer ausführbaren Datei (&lt;code>.exe&lt;/code>) von &lt;a href="https://www.python.org/downloads/" target="_blank" rel="noopener">Python Downloads&lt;/a> heruntergeladen und lokal installiert werden.&lt;/p>
&lt;h3 id="virtuelle-umgebung-aufsetzen">Virtuelle Umgebung aufsetzen&lt;/h3>
&lt;p>Wir erstellen einen Ordner &lt;code>ner-service&lt;/code>. In dem Ordner starten wir eine PowerShell.
Dann erstellen wir mit Python eine so genannte virtuelle Umgebung (Zeile 1). &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>
Die virtuelle Umgebung aktivieren wir anschließend (Zeile 2), installieren die benötigten Programme (Zeile 3) und laden das Sprachmodell mit spaCy herunter (Zeile 4).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">python&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">venv&lt;/span> &lt;span class="n">venv&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.\&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">Scripts&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">activate&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pip&lt;/span> &lt;span class="n">install&lt;/span> &lt;span class="n">fastapi&lt;/span> &lt;span class="nb">python-multipart&lt;/span> &lt;span class="n">spacy&lt;/span> &lt;span class="n">uvicorn&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">python&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">spacy&lt;/span> &lt;span class="n">download&lt;/span> &lt;span class="n">de_core_news_sm&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="ner-service-erstellen">NER Service erstellen&lt;/h3>
&lt;p>Den folgenden Python Code speichern wir in dem Ordner &lt;code>ner-service&lt;/code> in der Datei &lt;code>simple-ner-service.py&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">spacy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">uvicorn&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">fastapi&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">FastAPI&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Form&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">app&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">FastAPI&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">nlp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">spacy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;de_core_news_sm&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@app.post&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;/ner&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">ner&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Form&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">...&lt;/span>&lt;span class="p">)):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">doc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">nlp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">[{&lt;/span>&lt;span class="s2">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">ent&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;label&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">ent&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">label_&lt;/span>&lt;span class="p">}&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">ent&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">doc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ents&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">uvicorn&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;simple-ner-service:app&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">host&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;127.0.0.1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">port&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5000&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Mit aktivierter virtueller Umgebung können wir den Server mit der PowerShell aus dem Ordner &lt;code>ner-service&lt;/code> heraus starten:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">.\&lt;/span>&lt;span class="n">venv&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">Scripts&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">activate&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">python&lt;/span> &lt;span class="p">.\&lt;/span>&lt;span class="nb">simple-ner&lt;/span>&lt;span class="n">-service&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">py&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="ner-service-in-openrefine-nutzen">NER Service in OpenRefine nutzen&lt;/h3>
&lt;p>In OpenRefine schicken wir im &amp;ldquo;expression&amp;rdquo; Editor den Inhalt einer Zelle (&lt;code>value&lt;/code>) mit Jython an den &lt;code>ner-service&lt;/code> unter &lt;code>http://localhost:5000/ner&lt;/code> und geben das Ergebnis im &lt;code>JSON&lt;/code> Format zurück.
Dabei haben wir auf die Kodierung (&amp;ldquo;encoding&amp;rdquo;) zu achten, da Python &lt;strong>2&lt;/strong> standardmäßig nicht mit UTF-8 arbeitet.
Ein Problem, das in englischsprachigen Anleitungen häufig nicht relevant ist und daher ignoriert wird.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="nn">urllib&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="nn">urllib2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;http://localhost:5000/ner&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">request_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urlencode&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">value&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;utf-8&amp;#39;&lt;/span>&lt;span class="p">)})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib2&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urlopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">request_data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dumps&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">ensure_ascii&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die Vorschau des &amp;ldquo;expression&amp;rdquo; Editors in OpenRefine zeigt die ersten Ergebnisse.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
OpenRefine ermöglicht es &lt;a href="https://docs.openrefine.org/manual/columnediting#add-column-by-fetching-urls" target="_blank" rel="noopener">Spalten basierend auf URLs hinzuzufügen&lt;/a>.
Dabei werden so genannte &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET" target="_blank" rel="noopener">GET-Requests&lt;/a> ausgeführt, die von der Zeichenbeschränkung für URLs betroffen sind. Daher ist es empfehlenswert Texte via &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" target="_blank" rel="noopener">POST-Requests&lt;/a> zu versenden, weshalb wir die Anfrage mit Python und &lt;a href="https://docs.python.org/2/library/urllib2.html" target="_blank" rel="noopener">urllib2&lt;/a> ausführen.
&lt;/div>
&lt;/div>
&lt;h3 id="zusammenfassung-und-erweiterung">Zusammenfassung und Erweiterung&lt;/h3>
&lt;p>Mit etwa 15 Zeilen Python Code haben wir die Daten aus OpenRefine heraus mit einen (lokalen) Service verknüpft, der aufbauend auf der neuesten Technologie eine &amp;ldquo;Named Entity Recognition&amp;rdquo; durchführen kann.&lt;/p>
&lt;p>Dabei ist der Ansatz so generisch, dass er auf ähnliche Anwendungen übertragen werden kann.
Daher haben wir den minimalen Ansatz noch optimiert, dokumentiert und als &lt;a href="https://gist.github.com/b2m/6e2697ce182548a98320e4b7b7b885b6" target="_blank" rel="noopener">GitHub Gist&lt;/a> zur Verfügung gestellt.&lt;/p>
&lt;script type="application/javascript" src="https://gist.github.com/b2m/6e2697ce182548a98320e4b7b7b885b6.js?file=ner-service.py">&lt;/script>
&lt;h2 id="ner-mit-openrefine-und-spacy">NER mit OpenRefine und spaCy&lt;/h2>
&lt;div class="mermaid">---
title: Prozess
config:
look: handDrawn
theme: neutral
---
flowchart LR
text[fas:fa-file-alt Text]
spacy[fab:fa-python spaCy]
data[fas:fa-list-alt Entities]
gnd[fas:fa-database GND]
semantic[fas:fa-project-diagram Graph]
text --> data --> semantic
spacy --> data
gnd --> semantic
&lt;/div>
&lt;p>Mit dem funktionierenden NER Service können wir nun unserer ursprünglichen Idee nachgehen und ein &amp;ldquo;Named Entity Recognition&amp;rdquo; mit spaCy durchführen und die &amp;ldquo;Entities&amp;rdquo; anschließend mit der Gemeinsamen Normdatei (GND) abgleichen.&lt;/p>
&lt;h3 id="ner-service-starten">NER Service starten&lt;/h3>
&lt;p>Zuerst starten wir unseren NER Service. Dafür benötigen wir - wie im oberen Abschnitt beschrieben - Python 3 und eine virtuelle Umgebung mit &lt;a href="https://spacy.io" target="_blank" rel="noopener">spaCy&lt;/a>, &lt;a href="https://fastapi.tiangolo.com/" target="_blank" rel="noopener">FastAPI&lt;/a> und &lt;a href="https://www.uvicorn.org/" target="_blank" rel="noopener">Uvicorn&lt;/a>. Dort starten wir die Datei &lt;code>ner-service.py&lt;/code> aus dem &lt;a href="https://gist.github.com/b2m/6e2697ce182548a98320e4b7b7b885b6" target="_blank" rel="noopener">GitHub Gist&lt;/a>.&lt;/p>
&lt;p>Der NER Service ist nach dem Start unter &lt;code>http://localhost:5000&lt;/code> zu erreichen und kann wie in Abbildung 1 in einer interaktiven Dokumentation auch gleich getestet werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-interaktiven-api-dokumentation-des-ner-service">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der interaktiven API Dokumentation des NER Service." srcset="
/post/2021-08-ner-mit-openrefine-und-spacy/screenshot-ner-service-docs_hu4ade3a9214cede4be608667f96e8b843_41672_4c2ef6b72a5d5fe04f909cf4d6a26d50.webp 400w,
/post/2021-08-ner-mit-openrefine-und-spacy/screenshot-ner-service-docs_hu4ade3a9214cede4be608667f96e8b843_41672_b328450ad0047b3d5b85e9b5d61ee5ed.webp 760w,
/post/2021-08-ner-mit-openrefine-und-spacy/screenshot-ner-service-docs_hu4ade3a9214cede4be608667f96e8b843_41672_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-08-ner-mit-openrefine-und-spacy/screenshot-ner-service-docs_hu4ade3a9214cede4be608667f96e8b843_41672_4c2ef6b72a5d5fe04f909cf4d6a26d50.webp"
width="760"
height="395"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der interaktiven API Dokumentation des NER Service.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="openrefine-projekt-erstellen">OpenRefine Projekt erstellen&lt;/h3>
&lt;blockquote>
&lt;p>💾 Für OpenRefine haben wir einige Textschnippsel aus Wikipedia zusammengesucht (&lt;a href="https://creativecommons.org/licenses/by-sa/3.0/" target="_blank" rel="noopener">CC-BY-SA-3.0&lt;/a>) und bieten diese mit Quellangabe unter gleichen Lizenzbedingungen in einer JSON Datei zum Download an (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/wikipedia-schnippsel.json" target="_blank">
&lt;i class="fas fa-file-code pr-1 fa-fw">&lt;/i>Wikipedia Textschnippsel als JSON&lt;/a>
.
&lt;p>Mit der JSON Datei erzeugen wir wie in Abbildung 2 ein neues Projekt in OpenRefine.&lt;/p>
&lt;figure id="figure-bildschirmfoto-zur-erstellung-des-projektes-mit-einer-json-datei-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto zur Erstellung des Projektes mit einer JSON Datei in OpenRefine." srcset="
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-view-load-json_huf3aa10d5fab2c08f73be6bfb9c273572_91615_25eb405b39e843bbc51cce95d4a74656.webp 400w,
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-view-load-json_huf3aa10d5fab2c08f73be6bfb9c273572_91615_15276d06678ffdbe1f56d82949f26e6a.webp 760w,
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-view-load-json_huf3aa10d5fab2c08f73be6bfb9c273572_91615_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-view-load-json_huf3aa10d5fab2c08f73be6bfb9c273572_91615_25eb405b39e843bbc51cce95d4a74656.webp"
width="760"
height="333"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto zur Erstellung des Projektes mit einer JSON Datei in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Anschließend benennen wir die Spalten zur Übersichtlichkeit in Quelle und Text um.&lt;/p>
&lt;h3 id="ner-auf-text-durchführen">NER auf Text durchführen&lt;/h3>
&lt;p>Um eine &amp;ldquo;Named Entity Recognition&amp;rdquo; durchzuführen, erzeugen wir eine neue Spalte NER basierend auf der Spalte Text und verwenden wie in Abbildung 3 eine Jython Expression.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="nn">urllib&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="nn">urllib2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;http://localhost:5000/ner&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">request_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dumps&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s1">&amp;#39;text&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">value&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;utf-8&amp;#39;&lt;/span>&lt;span class="p">)})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">request&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib2&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Request&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">request_data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s1">&amp;#39;Content-Type&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;application/json&amp;#39;&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib2&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urlopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">request&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dumps&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">ensure_ascii&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="alert alert-note">
&lt;div>
Wir haben die &amp;ldquo;expression&amp;rdquo; im Vergleich zu unserem Test abgeändert, da wir bei der Überarbeitung des NER Service von &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" target="_blank" rel="noopener">form-urlencoded&lt;/a> zu JSON wechselten.
&lt;/div>
&lt;/div>
&lt;figure id="figure-bildschirmfoto-mit-dialog-zur-durchführung-von-ner-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit Dialog zur Durchführung von NER in OpenRefine." srcset="
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-ner_hu8c3f9cecb80f8b2fc346b845d3ab90c4_41020_6e9d33a7a7552ad5eff1877604ba307c.webp 400w,
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-ner_hu8c3f9cecb80f8b2fc346b845d3ab90c4_41020_ef3f1dfcd7eead17b58b2bb8d350aab5.webp 760w,
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-ner_hu8c3f9cecb80f8b2fc346b845d3ab90c4_41020_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-ner_hu8c3f9cecb80f8b2fc346b845d3ab90c4_41020_6e9d33a7a7552ad5eff1877604ba307c.webp"
width="712"
height="522"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit Dialog zur Durchführung von NER in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="informationen-aus-json-extrahieren">Informationen aus JSON extrahieren&lt;/h3>
&lt;p>Um die Informationen aus dem JSON formatierten Text zu extrahieren, verwenden wir die Werkzeuge von GREL.
Dafür erzeugen wir wie in Abbildung 4 eine neue Spalte Entity aus der Spalte NER mit einer&amp;quot;expression&amp;quot;.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">text&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;||&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-bildschirmfoto-mit-dialog-zur-erzeugung-einer-neuen-spalte-mit-dem-entity-text-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit Dialog zur Erzeugung einer neuen Spalte mit dem Entity Text in OpenRefine." srcset="
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-entity_hu1cfead628cf246b3e50a14ae654a9f50_32816_9845c0443a4df6c1c71d23010e958e0d.webp 400w,
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-entity_hu1cfead628cf246b3e50a14ae654a9f50_32816_274bbd2271eb24d822ffaf6e1de6fe9c.webp 760w,
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-entity_hu1cfead628cf246b3e50a14ae654a9f50_32816_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-entity_hu1cfead628cf246b3e50a14ae654a9f50_32816_9845c0443a4df6c1c71d23010e958e0d.webp"
width="717"
height="525"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit Dialog zur Erzeugung einer neuen Spalte mit dem Entity Text in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Für den Typ der Entities erzeugen wir wie in Abbildung 5 eine neue Spalte Label aus der Spalte NER mit einer &amp;ldquo;expression&amp;rdquo;.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">parseJson&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">label&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;||&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;figure id="figure-bildschirmfoto-mit-dialog-zur-erzeugung-einer-neuen-spalte-mit-dem-entity-label-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit Dialog zur Erzeugung einer neuen Spalte mit dem Entity Label in OpenRefine." srcset="
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-label_hu875e316715c66aa0a53b32733dd872be_29536_2bfed72345b70944758211ccef514127.webp 400w,
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-label_hu875e316715c66aa0a53b32733dd872be_29536_16e29ecdfd845314e1686d81875fc5ff.webp 760w,
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-label_hu875e316715c66aa0a53b32733dd872be_29536_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-label_hu875e316715c66aa0a53b32733dd872be_29536_2bfed72345b70944758211ccef514127.webp"
width="716"
height="527"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit Dialog zur Erzeugung einer neuen Spalte mit dem Entity Label in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Wir haben nun mehrere Werte in einer Zelle, weshalb wir diese wie in Abbildung 6 mit &amp;ldquo;Entity&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit Cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split multi-valued cells&amp;hellip;&amp;rdquo; und &amp;ldquo;Label&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit Cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split multi-valued cells&amp;hellip;&amp;rdquo; an der Trennsequenz &lt;code>||&lt;/code> auftrennen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-mit-dialog-zur-aufteilung-der-entities-in-mehrere-zeilen-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto mit Dialog zur Aufteilung der Entities in mehrere Zeilen in OpenRefine." srcset="
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-split_hu654a038295f31ea0122a9cf7c050f24f_16130_b0553baeff46521690a0bf363eeeaf02.webp 400w,
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-split_hu654a038295f31ea0122a9cf7c050f24f_16130_84b0c040b7648800a50d24fba37b6050.webp 760w,
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-split_hu654a038295f31ea0122a9cf7c050f24f_16130_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-dialog-split_hu654a038295f31ea0122a9cf7c050f24f_16130_b0553baeff46521690a0bf363eeeaf02.webp"
width="599"
height="383"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto mit Dialog zur Aufteilung der Entities in mehrere Zeilen in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="daten-mit-gnd-abgleichen">Daten mit GND abgleichen&lt;/h3>
&lt;p>Nun haben wir die gefundenen Entities in einzelnen Zeilen und können sie nach Belieben bearbeiten, löschen oder mit externen Diensten abgleichen.
Dafür verwenden wir den &lt;a href="https://lobid.org/gnd/reconcile" target="_blank" rel="noopener">GND Reconciliation Service von lobid&lt;/a>. Mit &amp;ldquo;Entity&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo; starten wir den Abgleichsvorgang.
Siehe auch &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/">Findbuch Index mit OpenRefine aufbereiten&lt;/a> für Details zum Datenabgleich von Daten in OpenRefine mit der Gemeinsamen Normdatei (GND).
In Abbildung 7 haben wir einen Screenshot der Daten, nachdem die Entities mit der GND abgeglichen und mit der GND-ID angereichert wurden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-zugeordneten-entities-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der zugeordneten Entities in OpenRefine." srcset="
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-view-ner-cleaned_hu985a1b73348435cf4675cba90d8ff620_97872_55ffd92c73d733d588078f3d91c8060c.webp 400w,
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-view-ner-cleaned_hu985a1b73348435cf4675cba90d8ff620_97872_0903d881b03356976567224863c84137.webp 760w,
/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-view-ner-cleaned_hu985a1b73348435cf4675cba90d8ff620_97872_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-08-ner-mit-openrefine-und-spacy/openrefine-view-ner-cleaned_hu985a1b73348435cf4675cba90d8ff620_97872_55ffd92c73d733d588078f3d91c8060c.webp"
width="760"
height="381"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der zugeordneten Entities in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>In diesem Beitrag haben wir eine Möglichkeit gezeigt, wie generell mit OpenRefine Daten an einen lokalen Service übergeben und verarbeitet werden können.
Das haben wir genutzt um ein &amp;ldquo;Named Entity Recognition&amp;rdquo; mit spaCy durchzuführen.&lt;/p>
&lt;p>Wir hätten uns gewünscht, dass die Integration von Python Frameworks in OpenRefine direkter und weniger technisch zu bewerkstelligen wäre.
Andererseits haben wir mit &lt;a href="https://fastapi.tiangolo.com/" target="_blank" rel="noopener">FastAPI&lt;/a> eine Framework getestet, mit dem unkompliziert Dienste zur Verfügung gestellt werden können.&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Eine virtuelle Umgebung ermöglicht es uns, die für dieses Projekt benötigten Abhängigkeiten direkt in den Ordner zu installieren, und bei Bedarf das komplette Projekt mit allen Abhängigkeiten wieder aufzuräumen.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Findbuch Index mit OpenRefine aufbereiten</title><link>https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/</link><pubDate>Tue, 27 Jul 2021 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/</guid><description>&lt;p>In diesem Tutorial arbeiten wir mit OpenRefine und der Gemeinsamen Normdatei (GND) den Prokuratoren Index eines Findbuchs zu Akten des Reichskammergerichts auf.&lt;/p>
&lt;p>Wir haben bereits beschrieben, wie wir die &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/">Einträge eines Findbuchs mit OpenRefine für den Datenbankimport aufbereiten&lt;/a>.
In diesem Beitrag geht es um die Aufarbeitung eines Indices von Findbüchern.
Wir beginnen mit dem Index der Prokuratoren.
Andere Indices folgen gegebenenfalls in weiteren Artikeln.&lt;/p>
&lt;h2 id="generelles-vorgehen">Generelles Vorgehen&lt;/h2>
&lt;p>Zur Übersichtlichkeit verwenden wir wieder das Findbuch &amp;ldquo;&lt;em>Akten des Reichskammergerichts im Staatsarchiv Wertheim - Inventar des Bestands R J 10&lt;/em>&amp;rdquo; aus dem Anhang von &amp;ldquo;&lt;em>Band 57: Akten des Reichskammergerichts im Staatsarchiv Sigmaringen - Inventar des Bestands R 7. Bearb. von Raimund J. Weber. Kohlhammer 2004&lt;/em>&amp;rdquo; mit 20 verzeichneten Archivalien.&lt;/p>
&lt;p>Die Findbücher zu den Akten des Reichskammergerichts enthalten verschiedene Indices.
Wir behandeln in diesem Tutorial den Index der Prokuratoren.&lt;/p>
&lt;figure id="figure-erste-seite-des-index-der-prokuratoren-im-findbuch-zu-bestand-r-j-10">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Erste Seite des Index der Prokuratoren im Findbuch zu Bestand R J 10." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/akten-rkg-band-57-wertheim-prokuratoren_hu597bc5995f23edb684e3f54eb4fc75ac_48878_65e2d36b450100349ac92bbb15a17fad.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/akten-rkg-band-57-wertheim-prokuratoren_hu597bc5995f23edb684e3f54eb4fc75ac_48878_5b1a2859b02cf3bae777fdfe54e40e26.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/akten-rkg-band-57-wertheim-prokuratoren_hu597bc5995f23edb684e3f54eb4fc75ac_48878_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/akten-rkg-band-57-wertheim-prokuratoren_hu597bc5995f23edb684e3f54eb4fc75ac_48878_65e2d36b450100349ac92bbb15a17fad.webp"
width="491"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Erste Seite des Index der Prokuratoren im Findbuch zu Bestand R J 10.
&lt;/figcaption>&lt;/figure>
&lt;p>Wie in Abbildung 1 zu sehen, handelt es sich bei dem Index um ein mehrspaltiges Layout, was das Einlesen in OpenRefine verkompliziert.
Zu den einzelnen Prokuratoren finden wir eine Zuordnung von Jahren auf die Findbuchnummer(n) der verzeichneten Archivalie(n).&lt;/p>
&lt;p>Zur Aufarbeitung des Index gehen wir wie folgt vor:&lt;/p>
&lt;ol>
&lt;li>Index aus Findbuch extrahieren&lt;/li>
&lt;li>Spalten zusammenführen&lt;/li>
&lt;li>Informationen zu Prokuratoren zusammenführen&lt;/li>
&lt;li>Abgleich mit der Gemeinsamen Normdatei (GND)&lt;/li>
&lt;li>Umwandlung in internes Deskriptorenformat&lt;/li>
&lt;/ol>
&lt;p>Dabei werden wir die einzelnen Schritte in OpenRefine nicht so detailliert beschrieben,
wie in unserem &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/">letzten Tutorial&lt;/a>.
Bei Bedarf, können Details zu einzelnen Schritten dort noch einmal nachgelesen werden.&lt;/p>
&lt;h2 id="1-index-aus-findbuch-extrahieren">1. Index aus Findbuch extrahieren&lt;/h2>
&lt;p>Auch bei den Indices empfiehlt es sich schon diverse Vorarbeiten im Text selbst durchzuführen.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir stellen die aufgeräumte Datei zur Verfügung (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/rkg-57/akten-rkg-band-57-wertheim-prokuratoren.txt" target="_blank">
&lt;i class="fas fa-file-alt pr-1 fa-fw">&lt;/i>Index Prokuratoren Akten RKG Band 57 - Wertheim&lt;/a>
.
&lt;p>Wir möchten explizit dazu einladen diese Datei zu nutzen, um die einzelnen Schritte in OpenRefine selbst auszuprobieren und damit zu experimentieren.&lt;/p>
&lt;h2 id="2-spalten-zusammenführen">2. Spalten zusammenführen&lt;/h2>
&lt;p>Wie in unserem &lt;a href="%28/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/%29">letzten Tutorial&lt;/a> erstellen wir mit OpenRefine ein neues Projekt mit &amp;ldquo;Create Project&amp;rdquo; und laden die heruntergeladene Datei als Text.&lt;/p>
&lt;p>Um das zweispaltige Layout in ein einspaltiges Layout zu überführen, gehen wir wie in Abbildung 2 schematisch dargestellt vor:&lt;/p>
&lt;ol>
&lt;li>Die Spalte &amp;ldquo;Column 1&amp;rdquo; benennen wir in Original um.&lt;/li>
&lt;li>Wir erstellen &amp;ldquo;records&amp;rdquo; aus den einzelnen Seiten.&lt;/li>
&lt;li>Wir trennen die Spalten zeilenweise auf.&lt;/li>
&lt;li>Wir fassen die &amp;ldquo;records&amp;rdquo; in einer Zeile zusammen.&lt;/li>
&lt;li>Wir fügen die Spalten wieder zusammen.&lt;/li>
&lt;li>Wir trennen die einzelnen Zeilen wieder auf.&lt;/li>
&lt;/ol>
&lt;figure id="figure-strategie-zur-zusammenführung-der-zwei-spalten-in-mehreren-schritten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Strategie zur Zusammenführung der zwei Spalten in mehreren Schritten." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/spalten-strategie_huac24e46954a78881c0c12bf53bbc59f8_128861_b0ab3ae4678151f8adfbd700719ae521.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/spalten-strategie_huac24e46954a78881c0c12bf53bbc59f8_128861_8ee95a4ca4c044075125a283d62d3ae2.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/spalten-strategie_huac24e46954a78881c0c12bf53bbc59f8_128861_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/spalten-strategie_huac24e46954a78881c0c12bf53bbc59f8_128861_b0ab3ae4678151f8adfbd700719ae521.webp"
width="760"
height="698"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Strategie zur Zusammenführung der zwei Spalten in mehreren Schritten.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="1-spalte-in-original-umbennen">1 Spalte in Original umbennen&lt;/h3>
&lt;p>Die Umbenennung der Spalte Column 1 in Original funktioniert über &amp;ldquo;Column 1&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Rename this column&amp;rdquo;.&lt;/p>
&lt;p>Der geladene Datensatz sieht ansclhießend wie in Abbildung 3 aus.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-geladenen-daten-ohne-bearbeitung-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der geladenen Daten ohne Bearbeitung in OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-original_hu2ba9a6aa0a914fbc6b8a73a50f93f70b_45924_6c4a32aeb7c334f22b91c1fcf1f42b9a.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-original_hu2ba9a6aa0a914fbc6b8a73a50f93f70b_45924_de0729515253ae4be322eb4ed4792921.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-original_hu2ba9a6aa0a914fbc6b8a73a50f93f70b_45924_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-original_hu2ba9a6aa0a914fbc6b8a73a50f93f70b_45924_6c4a32aeb7c334f22b91c1fcf1f42b9a.webp"
width="417"
height="623"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der geladenen Daten ohne Bearbeitung in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="2-seiten-als-records">2 Seiten als records&lt;/h3>
&lt;p>Um die einzelnen Seiten als &amp;ldquo;records&amp;rdquo; zu markieren, erstellen wir eine neue Spalte Seite via
&amp;ldquo;Original&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;
und verwenden die folgende &amp;ldquo;expression&amp;rdquo; um die Seitennummer auszulesen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">match&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/.(\d+)\s+Anhang/&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die Seite 519 tragen wir bei der Indexüberschrift &amp;ldquo;4. Prokuratoren&amp;rdquo; von Hand ein.
Die leeren Zeilen löschen wir über das &amp;ldquo;Blank row Facet&amp;rdquo;, das wir über &amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Facet by blank (null or empty string)&amp;rdquo; aktivieren.&lt;/p>
&lt;p>Die Spalte Seite verschieben wir anschließend an die erste Position, um pro Seite ein &amp;ldquo;record&amp;rdquo; zu haben.
Die nach Seiten organisierten &amp;ldquo;records&amp;rdquo; sehen anschließend wie in Abbildung 4 aus.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-seiten-als-records-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von Seiten als &amp;#39;records&amp;#39; in OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-page_huae02a450bdafa3ae6103af45075ec205_47396_a0e501f0defa4c3b63fa4ef57baafdf9.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-page_huae02a450bdafa3ae6103af45075ec205_47396_f4d30a2c3d656941e59915e614587b54.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-page_huae02a450bdafa3ae6103af45075ec205_47396_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-page_huae02a450bdafa3ae6103af45075ec205_47396_a0e501f0defa4c3b63fa4ef57baafdf9.webp"
width="485"
height="626"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von Seiten als &amp;lsquo;records&amp;rsquo; in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="3-spalten-zeilenweise-auftrennen">3 Spalten zeilenweise auftrennen&lt;/h3>
&lt;p>Um die Spalten aufzuteilen, gibt es wie in Abbildung 5 gezeigt mehrere Möglichkeiten.
Es ist möglich ein Trennzeichen anzugeben, einen regulären Ausdruck zum Trennen zu verwenden, oder eine feste Spaltenbreite zu definieren.&lt;/p>
&lt;figure id="figure-dialog-zum-aufteilen-von-spalten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Dialog zum Aufteilen von Spalten in OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-split-columns_huc8717d9a9e80e4438e3151322f96bd62_16428_56099391c518f4ce8d97477bc0e48391.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-split-columns_huc8717d9a9e80e4438e3151322f96bd62_16428_a73d8e04cd2f9402b81e8bdc964c54f3.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-split-columns_huc8717d9a9e80e4438e3151322f96bd62_16428_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-split-columns_huc8717d9a9e80e4438e3151322f96bd62_16428_56099391c518f4ce8d97477bc0e48391.webp"
width="602"
height="320"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Dialog zum Aufteilen von Spalten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Bei diesem Findbuch funktioniert die Auftrennung nach einer festen Spaltenbreite nicht, da zum Beispiel die linke Spalte auf Seite 519 größer ist als die linke Spalte auf Seite 520.
Also trennen wir an einer Folge von vier oder mehr Leerzeichen auf &lt;code>\s{4,}&lt;/code>.
Das hat den Nachteil, dass wir die Einrückungen in der zweiten Spalte verlieren.
Dies stört uns bei diesem Index nicht.&lt;/p>
&lt;p>Das Ergebnis ist in Abbildung 6 gezeigt.
Anschließend können wir mit &amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Trim leading and trailing whitespace&amp;rdquo; alle unnötigen Leerzeichen in den Spalten entfernen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-aufgeteilten-spalten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der aufgeteilten Spalten in OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-columns-separated_hu94e444ee27a95ea2c3b9fb9bbc095f17_48267_09d0753ef4861260c093db9e5ddc5513.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-columns-separated_hu94e444ee27a95ea2c3b9fb9bbc095f17_48267_64d5fbb0a824c839fdaac5d2597662f2.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-columns-separated_hu94e444ee27a95ea2c3b9fb9bbc095f17_48267_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-columns-separated_hu94e444ee27a95ea2c3b9fb9bbc095f17_48267_09d0753ef4861260c093db9e5ddc5513.webp"
width="486"
height="622"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der aufgeteilten Spalten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="4-records-in-einer-zeile-zusammenfassen">4 Records in einer Zeile zusammenfassen&lt;/h3>
&lt;p>Um die Zeilen pro &amp;ldquo;record&amp;rdquo; zusammenzufassen, verwenden wir &amp;ldquo;Original 1&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit Cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Join multi-valued cells&amp;hellip;&amp;rdquo; mit der Trennsequzent &lt;code>-:::-&lt;/code> und verfahren bei Spalte Original 2 ebenso.
Das Ergebnis ist in Abbildung 7 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-zusammengeführen-zeilen-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der zusammengeführen Zeilen in OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-combine-rows_hue6af434e59adde981e531e3241be8714_37739_b13f5ce68eceddf748a276ad7ffc55a2.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-combine-rows_hue6af434e59adde981e531e3241be8714_37739_aec968ad586e71d4b98229f933159e7d.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-combine-rows_hue6af434e59adde981e531e3241be8714_37739_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-combine-rows_hue6af434e59adde981e531e3241be8714_37739_b13f5ce68eceddf748a276ad7ffc55a2.webp"
width="760"
height="90"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der zusammengeführen Zeilen in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="5-spalten-zusammenführen">5 Spalten zusammenführen&lt;/h3>
&lt;p>Die Spalten Original 1 und 2 werden über &amp;ldquo;Original 1&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Join columns&amp;hellip;&amp;rdquo; wieder in der Spalte Original zusammengeführt.
Die Einstellungen sind in Abbildung 8 abgebildet.&lt;/p>
&lt;figure id="figure-dialog-zum-zusammenführen-der-spalten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Dialog zum Zusammenführen der Spalten in OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-join-columns_hueaf9c441b3f82f5fb28bfb42466915b2_23310_d29e3bf56b195ba43e412deec5f7f2d1.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-join-columns_hueaf9c441b3f82f5fb28bfb42466915b2_23310_e03b2e749eff89a53ef193a801bcca97.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-join-columns_hueaf9c441b3f82f5fb28bfb42466915b2_23310_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-join-columns_hueaf9c441b3f82f5fb28bfb42466915b2_23310_d29e3bf56b195ba43e412deec5f7f2d1.webp"
width="760"
height="436"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Dialog zum Zusammenführen der Spalten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Das Ergebnis ist in Abbildung 9 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-zusammengeführten-spalten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der zusammengeführten Spalten in OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-combine-columns_hue77fcfc52bdf2921ba6d7c053e933957_36587_1001698c14e2e14fada1b5b3c271f4b6.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-combine-columns_hue77fcfc52bdf2921ba6d7c053e933957_36587_50c3b83504ad23b774cd54e7d7f03bd0.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-combine-columns_hue77fcfc52bdf2921ba6d7c053e933957_36587_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-combine-columns_hue77fcfc52bdf2921ba6d7c053e933957_36587_1001698c14e2e14fada1b5b3c271f4b6.webp"
width="760"
height="91"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der zusammengeführten Spalten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="6-zeilen-auftrennen">6 Zeilen auftrennen&lt;/h3>
&lt;p>Um die einzelnen Zeilen wieder aufzutrennen, verwenden wir &amp;ldquo;Original&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit Cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split multi-valued cells&amp;hellip;&amp;rdquo; mit der Trennsequenz &lt;code>-:::-&lt;/code>, wie im Dialog in Abbildung 10 abgebildet.&lt;/p>
&lt;figure id="figure-dialog-zum-auftrennen-der-zeilen-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Dialog zum Auftrennen der Zeilen in OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-split-rows_hufacaa21fef3d1c9115f4f306f0dce00d_16327_572a5f30105cee4a0447a486521408d1.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-split-rows_hufacaa21fef3d1c9115f4f306f0dce00d_16327_833623c8faed1a45a74b834d3ed65749.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-split-rows_hufacaa21fef3d1c9115f4f306f0dce00d_16327_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-split-rows_hufacaa21fef3d1c9115f4f306f0dce00d_16327_572a5f30105cee4a0447a486521408d1.webp"
width="603"
height="387"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Dialog zum Auftrennen der Zeilen in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Das Ergebnis ist in Abbildung 11 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-aufgetrennten-zeilen-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der aufgetrennten Zeilen in OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-split-rows_hu8c6958d10e75822edc14971c48ff1f9b_34445_524485a2c51fbcfcfc5fd9d7fd9e8a40.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-split-rows_hu8c6958d10e75822edc14971c48ff1f9b_34445_6c30b673755eb4143cb36dd9b7467139.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-split-rows_hu8c6958d10e75822edc14971c48ff1f9b_34445_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-split-rows_hu8c6958d10e75822edc14971c48ff1f9b_34445_524485a2c51fbcfcfc5fd9d7fd9e8a40.webp"
width="328"
height="624"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der aufgetrennten Zeilen in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Anschließend können wir alle Zeilen mit Seitennummern entfernen und die Spalte Seite löschen.
Dafür ein &amp;ldquo;Text Facet&amp;rdquo; auf der Spalte Seite erstellen und die entsprechenden Zeilen auswählen und löschen.&lt;/p>
&lt;h2 id="3-informationen-zu-prokuratoren-zusammenführen">3. Informationen zu Prokuratoren zusammenführen&lt;/h2>
&lt;p>Wir haben in den vorangegangenen Schritten das zweispaltige Layout in ein einspaltiges Layout überführt und wollen nun für jeden Prokurator ein &amp;ldquo;record&amp;rdquo; erzeugen.
Dafür trennen wir die Zeilen in einzelne Spalten für Name, (Wirkungs-)Jahre und Verweise auf.
Anschließend transformieren wir die einzelnen Spalten, um zum Beispiel die Jahre und Verweise zusammenzufassen.&lt;/p>
&lt;h3 id="informationen-auftrennen">Informationen auftrennen&lt;/h3>
&lt;h4 id="spalte-name">Spalte Name&lt;/h4>
&lt;p>Wir erzeugen von der Spalte Original aus eine neue Spalte Name mit einer &amp;ldquo;expression&amp;rdquo;.
Dafür suchen wir mit dem regulären Ausdruck &lt;code>[A-Z].+&lt;/code> nach Zeilen, die mit einem Großbuchstaben beginnen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">match&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/([A-Z].+)/&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="spalte-jahre">Spalte Jahre&lt;/h4>
&lt;p>Wir erzeugen von der Spalte Original aus eine neue Spalte Jahre mit einer &amp;ldquo;expression&amp;rdquo;.
Dafür suchen wir mit dem regulären Ausdruck &lt;code>(\d{4}):.+&lt;/code> nach Zeilen, die mit vier Zahlen gefolgt von einem Doppelpunkt beginnen.
Davon extrahieren wir die vier Zahlen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">match&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/(\d{4}):.+/&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="spalte-verweise">Spalte Verweise&lt;/h4>
&lt;p>Wir erzeugen von der Spalte Original aus eine neue Spalte Verweise mit einer &amp;ldquo;expression&amp;rdquo;.
Dafür suchen wir mit dem regulären Ausdruck &lt;code>\d{4}:(.+)&lt;/code> nach Zeilen, die mit vier Zahlen gefolgt von einem Doppelpunkt beginnen.
Davon extrahieren wir alles nach dem Doppelpunkt.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">match&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\d{4}:(.+)/&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="spalten-umformatieren">Spalten umformatieren&lt;/h3>
&lt;p>Die Spalte Original benötigen wir nicht mehr und können sie löschen.
Wir verschieben anschließend die Spalte Name an den Anfang, da sie die &amp;ldquo;records&amp;rdquo; definiert.&lt;/p>
&lt;p>Das Ergebnis ist in Abbildung 12 gezeigt.
Anschließend formatieren wir die einzelnen Spalten.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-extrahierten-spalten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der extrahierten Spalten in OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-extracted_huf24f13b4eaa5b1b44d55a59148a18e6d_42704_e8c9f8d35d276175f17893548835d6f2.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-extracted_huf24f13b4eaa5b1b44d55a59148a18e6d_42704_01db1bb85ab1b6387ea6edd89738a44b.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-extracted_huf24f13b4eaa5b1b44d55a59148a18e6d_42704_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-extracted_huf24f13b4eaa5b1b44d55a59148a18e6d_42704_e8c9f8d35d276175f17893548835d6f2.webp"
width="410"
height="623"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der extrahierten Spalten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h4 id="spalte-jahre-1">Spalte Jahre&lt;/h4>
&lt;p>Die Jahre im Beispiel &lt;code>1797, 1767, 1770, 1801&lt;/code> wollen wir als Zeitraum im Format &lt;code>1767 - 1801&lt;/code> zusammenfassen.
Dafür führen wir die Zeilen der Spalte Jahre via &amp;ldquo;Jahre&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit Cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Join multi-valued cells&amp;hellip;&amp;rdquo; mit der Trennsequenz &lt;code>,\s+&lt;/code> zusammen.&lt;/p>
&lt;p>Die Spalte Jahre transfomieren wir anschließend via &amp;ldquo;Jahre&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;.
Dafür bestimmen wir das Minimum und das Maximum in der Liste der Zahlen.
Leider gibt es in GREL keine Funktion, die das auf einer Liste (technisch &lt;a href="https://docs.openrefine.org/manual/grelfunctions#array-functions" target="_blank" rel="noopener">Array&lt;/a>) für uns übernehmen kann. Daher gehen wir wie folgt vor:&lt;/p>
&lt;ol>
&lt;li>Wir erzeugen eine Liste &lt;code>years&lt;/code>, indem wir mit &lt;code>split()&lt;/code> an der Sequenz &lt;code>,\s+&lt;/code> trennen.&lt;/li>
&lt;li>Die einzelnen Jahre &lt;code>year&lt;/code> wandeln wir in einer &lt;code>forEach&lt;/code> Schleife mit &lt;code>toNumber()&lt;/code> in Zahlen um, da sie sonst &amp;ldquo;fehlerhaft&amp;rdquo; sortiert werden (&lt;code>&amp;quot;1, 10, 11, 2, 20, ...&amp;quot;&lt;/code>).&lt;/li>
&lt;li>Wir sortieren die Liste &lt;code>years&lt;/code> mit &lt;code>sort()&lt;/code>.&lt;/li>
&lt;li>Hat die Liste &lt;code>years&lt;/code> nur ein Jahr, dann wandeln wir es mit &lt;code>toString()&lt;/code> in Text um.&lt;/li>
&lt;li>Hat die Liste &lt;code>years&lt;/code> mehrere Elemente, nehmen wir das erste (Minimum) und das letzte Element (Maximum). Durch die Verbindung über &lt;code>-&lt;/code> wird automatisch ein Text erzeugt.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/,\s+/&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">year&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">year&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toNumber&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">sort&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">years&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">years&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">length&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">years&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">years&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34; - &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">years&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="spalte-verweise-1">Spalte Verweise&lt;/h4>
&lt;p>Die Verweise führen wir ebenfalls via &amp;ldquo;Verweise&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit Cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Join multi-valued cells&amp;hellip;&amp;rdquo; mit der Trennsequenz &lt;code>,\s+&lt;/code> zusammen.&lt;/p>
&lt;p>Die Spalte Verweise transfomieren wir anschließend via &amp;ldquo;Verweise&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;.
Bei den Verweisen haben wir mehrere Probleme:&lt;/p>
&lt;ol>
&lt;li>Teilweise werden sie als Bereiche &lt;code>8-10&lt;/code> angegeben, die wir in &lt;code>8, 9, 10&lt;/code> überführen wollen.&lt;/li>
&lt;li>Es werden zwei verschiedene Bindestriche verwendet, die optisch gleich aussehen.&lt;/li>
&lt;li>Wir können Duplikate bei den Verweisen haben.&lt;/li>
&lt;li>Die Reihenfolge kann durcheinander sein.&lt;/li>
&lt;/ol>
&lt;p>Die &amp;ldquo;expression&amp;rdquo; um diese Probleme zu behandeln, ist daher komplex.
Hier eine Erklärung des Vorgehens:&lt;/p>
&lt;ol>
&lt;li>Wir trennen die Verweise mit dem regulären Ausdruck &lt;code>,\s+&lt;/code> in eine Liste (technisch Array).&lt;/li>
&lt;li>Jeden der Verweise &lt;code>v&lt;/code> in der Liste trennen wir anschließend mit dem regulären Ausdruck &lt;code>–|\-&lt;/code> (unterschiedliche Bindestriche) und nennen das Ergebnis &lt;code>v2&lt;/code>.&lt;/li>
&lt;li>Wenn der Verweis &lt;code>v2&lt;/code> mehrere Elemente hat (es also ein Bereich mit Bindestrich war), dann erzeugen wir mit &lt;a href="https://docs.openrefine.org/manual/grel#forrangen-from-n-to-n-step-v-e" target="_blank" rel="noopener">forRange&lt;/a> eine Zahlenliste über diesem Bereich, und verbinden die Zahlen mit &lt;code>join(&amp;quot;,&amp;quot;)&lt;/code> zu einem Text.&lt;/li>
&lt;li>Jetzt haben die Bereiche und die einzelnen Verweise das gleiche Format. Also verbinden wir sie ebenfalls mit &lt;code>join(&amp;quot;,&amp;quot;)&lt;/code>.&lt;/li>
&lt;li>Den verbundenen Text trennen wir anschließend wieder mit &lt;code>,&lt;/code> in eine Liste mit einzelnen Verweisen und wandeln die einzelnen Verweise &lt;code>v&lt;/code> mit &lt;code>toNumber()&lt;/code> in Zahlen um.&lt;/li>
&lt;li>Da wir nun eine Liste mit Zahlen haben, können wir mit &lt;code>uniques()&lt;/code> die doppelten Verweise entfernen und sie mit &lt;code>sort()&lt;/code> sortieren.&lt;/li>
&lt;li>Die bereinigte Liste wandeln wir mit &lt;code>join(&amp;quot;, &amp;quot;)&lt;/code> anschließend wieder in einen Text um.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/,\s+/&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/–|\-/&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v2&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">length&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">forRange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">v2&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">toNumber&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="nx">v2&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">toNumber&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">i&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">i&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v2&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;,&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/,/&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">v&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toNumber&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nx">uniques&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nx">sort&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;, &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="spalte-name-1">Spalte Name&lt;/h4>
&lt;p>Diese Spalte bearbeiten wir als letzte, da wir ansonsten die &amp;ldquo;record&amp;rdquo; Struktur verloren hätten.
Die &amp;ldquo;record&amp;rdquo; Struktur haben wir in den vorherigen Schritten benötigt, um die Jahre und Verweise in einer Zeile zusammenzufassen.&lt;/p>
&lt;p>Wir wollen die Spalte Name in Vorname, Nachname und Titel trennen.
Das erleichtert uns das Überführen in andere Formate zum Beispiel für den Abgleich mit der GND oder das Umwandeln in ein Deskriptorenformat.
Dafür trennen wir die Spalte Name via &amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit Cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Split into several columns&amp;hellip;&amp;rdquo; in drei Spalten am Trennzeichen &lt;code>,&lt;/code> auf und lassen sie auch gleich entfernen.
Die entsprechenden Einstellungen sind in Abbildung 13 gezeigt.&lt;/p>
&lt;figure id="figure-dialog-zum-aufsplitten-von-spalten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Dialog zum Aufsplitten von Spalten in OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-split-column-name_hu894663371f90b460a688eefaf20992fa_15393_a6180ff96d4f3374acfdc708b3abc96e.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-split-column-name_hu894663371f90b460a688eefaf20992fa_15393_d3017a1ee830c862c8bab71926fc3b92.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-split-column-name_hu894663371f90b460a688eefaf20992fa_15393_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-split-column-name_hu894663371f90b460a688eefaf20992fa_15393_a6180ff96d4f3374acfdc708b3abc96e.webp"
width="593"
height="317"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Dialog zum Aufsplitten von Spalten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Die Daten sind nun sauber aufgetrennt und können zur weiteren Verarbeitung verwendet werden.
Das Ergebnis ist in Abbildung 14 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-aufgeräumten-spalten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der aufgeräumten Spalten in OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-cleaned_hu463aff085d4174e8170a431698eacc5c_83868_4ff6b55f5b5ba19b5d9bfd1f305bb17a.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-cleaned_hu463aff085d4174e8170a431698eacc5c_83868_f8a707d7346a0e0e0f872a9ae41b7d2f.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-cleaned_hu463aff085d4174e8170a431698eacc5c_83868_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-cleaned_hu463aff085d4174e8170a431698eacc5c_83868_4ff6b55f5b5ba19b5d9bfd1f305bb17a.webp"
width="433"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der aufgeräumten Spalten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="4-abgleich-mit-der-gemeinsamen-normdatei">4. Abgleich mit der Gemeinsamen Normdatei&lt;/h2>
&lt;div class="mermaid">---
title: Abgleich mit GND
config:
look: handDrawn
theme: neutral
---
flowchart LR
text[fas:fa-file-alt Text]
data[fas:fa-table Table]
gnd[fas:fa-database GND]
semantic[fas:fa-project-diagram Graph]
text --> data --> semantic
gnd --> semantic
&lt;/div>
&lt;p>Als Bonus gleichen wir die Prokuratoren mit der Gemeinsamen Normdatei (GND) ab.
Der Vorgang wird in OpenRefine &lt;a href="https://docs.openrefine.org/manual/reconciling" target="_blank" rel="noopener">Reconciling&lt;/a> genannt.
Dafür verwenden wir den &lt;a href="https://lobid.org/gnd/reconcile" target="_blank" rel="noopener">GND Reconciliation Service von lobid&lt;/a>.
Die Verwendung ist in einem &lt;a href="https://blog.lobid.org/2018/08/27/openrefine.html" target="_blank" rel="noopener">lobid Blogeintrag&lt;/a> ausführlich erklärt.&lt;/p>
&lt;p>Bei uns hat sich das folgende Vorgehen bewährt.&lt;/p>
&lt;p>Zuerst erzeugen wir via &amp;ldquo;Nachname&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Join columns&amp;hellip;&amp;rdquo; eine neue Spalte Name, wo wir die Namensstruktur &amp;ldquo;Nachname, Vorname&amp;rdquo; der GND übernehmen. &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>
Anschließend können wir via &amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Reconcile&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Start reconciling&amp;rdquo; den Vorgang starten.&lt;/p>
&lt;p>Falls noch nicht geschehen, den &amp;ldquo;lobid gnd service&amp;rdquo; via &amp;ldquo;Add Standard Service&amp;hellip;&amp;rdquo; mit der URL &lt;code>https://lobid.org/gnd/reconcile&lt;/code> hinzufügen und auswählen.&lt;/p>
&lt;p>Die entsprechenden Einstellungen für den Abgleichvorgang sind in Abbildung 15 abgebildet.
Wir fügen den Titel als separate Spalte hinzu, da wir dadurch bessere Ergebnisse erzielen konnten.
Leider können wir die (Wirkungs-)Jahre nicht berücksichtigen, da es keine kleiner/größer Operation für den &amp;ldquo;Reconciliation Service&amp;rdquo; gibt.&lt;/p>
&lt;figure id="figure-dialog-zum-abgleich-der-daten-mit-dem-lobid-gnd-service">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Dialog zum Abgleich der Daten mit dem &amp;#39;lobid gnd service&amp;#39;." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-reconciling_hu65f1cead5469c2f390a184a0aa06890a_31389_6fe0942761dbfe137f3afb91b3b90f91.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-reconciling_hu65f1cead5469c2f390a184a0aa06890a_31389_52b33c06393eb5fcc169f76fb4bcee6f.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-reconciling_hu65f1cead5469c2f390a184a0aa06890a_31389_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-reconciling_hu65f1cead5469c2f390a184a0aa06890a_31389_6fe0942761dbfe137f3afb91b3b90f91.webp"
width="760"
height="508"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Dialog zum Abgleich der Daten mit dem &amp;rsquo;lobid gnd service'.
&lt;/figcaption>&lt;/figure>
&lt;div class="alert alert-warning">
&lt;div>
Beim &amp;ldquo;reconciling&amp;rdquo; werden die Inhalte der ausgewählten Spalten an einen Webservice übertragen!
Sollte das nicht gewünscht sein, ist es auch möglich einen &lt;a href="https://docs.openrefine.org/manual/reconciling#sources" target="_blank" rel="noopener">lokalen &amp;ldquo;reconciliation services&amp;rdquo; einzurichten&lt;/a>.
&lt;/div>
&lt;/div>
&lt;p>Das Ergebnis ist in Abbildung 16 gezeigt.
Jetzt können mit einer Mischung aus Heuristik (zum Beispiel alle Treffer mit Übereinstimmung von mehr als 95 % automatisch übernehmen) und manueller Prüfung die einzelnen Personen verknüpft werden.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-abzugleichenden-daten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der abzugleichenden Daten in OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-reconciling_hu793d3893f9916509064db87505e42eac_60998_2d92aa2f705b1d471c46593b3451f1cb.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-reconciling_hu793d3893f9916509064db87505e42eac_60998_906788d58e206443d83af025a5b42261.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-reconciling_hu793d3893f9916509064db87505e42eac_60998_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-reconciling_hu793d3893f9916509064db87505e42eac_60998_2d92aa2f705b1d471c46593b3451f1cb.webp"
width="760"
height="674"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der abzugleichenden Daten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Anschließend wollen wir die GND-ID als zusätzliche Spalte in unserem Datensatz haben.
Das funktioniert über &amp;ldquo;Name&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add columns from reconciled values&amp;hellip;&amp;rdquo;, wo wir die GND-ID wie in dem in Abbildung 17 dargestellten Dialog auswählen können.&lt;/p>
&lt;figure id="figure-dialog-zum-auswählen-zusätzlicher-spalten-von-abgeglichenen-daten">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Dialog zum Auswählen zusätzlicher Spalten von abgeglichenen Daten." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-add-reconciled-values_hud22c0c49ded872e458cd53d27161c8bc_42820_d83127f15f475b64d5e1f8fbf97918bf.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-add-reconciled-values_hud22c0c49ded872e458cd53d27161c8bc_42820_338758e2eb8cc7252e2400a01c6ffc57.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-add-reconciled-values_hud22c0c49ded872e458cd53d27161c8bc_42820_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-dialog-add-reconciled-values_hud22c0c49ded872e458cd53d27161c8bc_42820_d83127f15f475b64d5e1f8fbf97918bf.webp"
width="760"
height="562"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Dialog zum Auswählen zusätzlicher Spalten von abgeglichenen Daten.
&lt;/figcaption>&lt;/figure>
&lt;p>Wir konnten 18 der 37 Prokuratoren aus unserem Datensatz in der GND identifizieren und verknüpfen.
Das Ergebnis ist in Abbildung 18 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-abgeglichenen-daten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der abgeglichenen Daten in OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-reconciling-finished_hu69702fd179a6954bc1dbe11caa8f1ddd_84094_fe3a14533460e500c4e185162eede35b.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-reconciling-finished_hu69702fd179a6954bc1dbe11caa8f1ddd_84094_7576ed1a9417270918eb1447b1e3f13d.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-reconciling-finished_hu69702fd179a6954bc1dbe11caa8f1ddd_84094_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-reconciling-finished_hu69702fd179a6954bc1dbe11caa8f1ddd_84094_fe3a14533460e500c4e185162eede35b.webp"
width="760"
height="527"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der abgeglichenen Daten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="5-umwandlung-in-deskriptorenformat">5. Umwandlung in Deskriptorenformat&lt;/h2>
&lt;p>Aus den einzelnen Datenbestandteilen können wir nun einen Deskriptor für unser AFIS zusammensetzen.
Dafür gehen wir zu einer beliebigen Spalte, um von dort aus mit einer &amp;ldquo;expression&amp;rdquo; eine neue Spalte Deskriptor im Format &lt;code>Nachname, Vorname Titel; Prokurator am Reichskammergericht {Wirkungsjahre} | {Optionale GND-ID}&lt;/code> zu erzeugen. &lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Nachname&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;, &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Vorname&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Titel&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;; Prokurator am Reichskammergericht &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Jahre&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isNonBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;GND-Nummer&amp;#34;&lt;/span>&lt;span class="p">]),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34; | &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;GND-Nummer&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das Endergebnis ist in Abbildung 19 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-umgewandelten-und-abgeglichenen-daten-mit-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der umgewandelten und abgeglichenen Daten mit OpenRefine." srcset="
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-finished_hu29bcaf6f7a4df5698297eae91e3ec768_92027_5450e0a3e5e5dbca8bc688f9c2d566d4.webp 400w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-finished_hu29bcaf6f7a4df5698297eae91e3ec768_92027_de83b705a2b7158d2ffab4062fb2ed45.webp 760w,
/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-finished_hu29bcaf6f7a4df5698297eae91e3ec768_92027_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuch-index-mit-openrefine-aufbereiten/openrefine-view-finished_hu29bcaf6f7a4df5698297eae91e3ec768_92027_5450e0a3e5e5dbca8bc688f9c2d566d4.webp"
width="760"
height="452"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der umgewandelten und abgeglichenen Daten mit OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;blockquote>
&lt;p>💾 Die einzelnen Arbeitsschritte im OpenRefine Format:&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/rkg-57/akten-rkg-band-57-wertheim-openrefine-prokuratoren.json" target="_blank">
&lt;i class="fas fa-file-archive pr-1 fa-fw">&lt;/i>Index Prokuratoren Akten RKG Band 57 - Wertheim als OpenRefine Arbeitsschritte&lt;/a>
.
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Wir haben mit OpenRefine den Prokuratoren Index eines Findbuchs zu Akten des Reichskammergerichts aus einem zweispaltigen Layout in ein einspaltiges Layout überführt, den Datensatz aufbereitet und die einzelnen Prokuratoren mit der GND abgeglichen.&lt;/p>
&lt;p>Die Operationen zum Aufräumen der Daten (Jahre und Verweise) waren diesmal komplex, lassen sich jedoch auf ähnliche Probleme übertragen.&lt;/p>
&lt;p>Es bleibt die Erkenntnis, dass der Abgleich von Personen mit dem &amp;ldquo;Reconciliation Service&amp;rdquo; von lobid deutlich komfortabler wäre, wenn es möglich wäre eine zeitliche Einschränkung der Lebens- und Wirkungsdaten vorzunehmen. &lt;sup id="fnref:3">&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref">3&lt;/a>&lt;/sup>&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Die Zuordnung der Daten erfolgt über den &amp;ldquo;Reconciliation Service&amp;rdquo;. Manche verwenden Verfahren, bei denen eine Übereinstimmung im Format relevant ist und zu besseren Ergebnissen führt. Andere verwenden Verfahren, bei denen die Reihenfolge der Suchbegriffe komplett ignoriert wird.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>Uns ist gegen Ende aufgefallen, dass wir noch überflüssige Leerzeichen in den einzelnen Spalten haben. Anstatt sie im Deskriptor mit &lt;code>trim()&lt;/code> zu entfernen, wäre es sinnvoller gewesen sie vorher mit &amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Trim leading and trailing whitespace&amp;rdquo; zu entfernen.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:3">
&lt;p>&lt;strong>Update April 2022&lt;/strong>: Durch ein Update in dem lobid GND API für OpenRefine kann nun eine zeitliche Einschränkung beim Reconciliation vorgenommen werden. Details dazu finden sich unter &lt;a href="https://github.com/hbz/lobid-gnd/issues/304" target="_blank" rel="noopener">Using range query parameter via OpenRefine Reconciliation&lt;/a> auf GitHub und unter &lt;a href="https://fdmlab.landesarchiv-bw.de/workshop/openrefine-fortgeschrittene/15-erweiterter-gnd-abgleich-mit-lobid/">Erweiterter GND Abgleich mit lobid&lt;/a> auf unserem Blog.&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Findbücher mit OpenRefine in Datenbank übernehmen</title><link>https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/</link><pubDate>Tue, 20 Jul 2021 00:00:00 +0000</pubDate><guid>https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/</guid><description>&lt;p>In diesem ausführlichen Tutorial wandeln wir mit OpenRefine ein Findbuch zu Akten des Reichskammergerichts in ein AFIS kompatibles Importformat um.
Hierbei setzen wir gezielt einfache und verständliche Techniken ein.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
Dieses Tutorial ist so geschrieben, dass die einzelnen Schritte direkt in einer eigenen OpenRefine Umgebung nachvollzogen werden können.
Die benötigten Dateien stehen im Laufe des Tutorials als 💾 Download zur Verfügung.
&lt;/div>
&lt;/div>
&lt;h2 id="findbuchdigitalisierung">Findbuchdigitalisierung&lt;/h2>
&lt;p>Wir haben im FDMLab unterschiedliche Findbücher digitalisiert und in unser AFIS überführt.
Teilweise existierten die Findbücher als Word-Dateien, teilweise als PDF und teilweise ausschließlich als analoge Bücher.
Über unseren &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-06-wie-wir-gedruckte-findbuecher-in-unsere-datenbank-bekommen/">Workflow beim Digitalisieren von Findbüchern&lt;/a>
und über die &lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-07-analoge-findbuecher-in-db-uebernehmen/">Bedeutung von regulären Ausdrücken bei der Textextraktion&lt;/a>
haben wir schon berichtet.&lt;/p>
&lt;p>Um einen hohen Automatisierungsgrad zu erreichen, haben wir Technologien wie
&lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-06-wie-wir-docker-einsetzen/">Docker&lt;/a>,
&lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-08-warum-wir-jupyter-lieben/">Jupyter NoteBooks&lt;/a>,
&lt;a href="https://fdmlab.landesarchiv-bw.de/post/2021-08-weshalb-wir-python-nutzen/">Python&lt;/a>,
&lt;a href="https://github.com/flairNLP/flair/" target="_blank" rel="noopener">flairNLP&lt;/a> und &lt;a href="https://spacy.io/" target="_blank" rel="noopener">spaCy&lt;/a> eingesetzt.&lt;/p>
&lt;p>Das ist sinnvoll, wenn - wie im Fall der Findbücher zu den Akten des Reichskammergerichts - mehrere Findbücher mit ähnlicher Struktur existieren.
Die Beherrschung dieser Technologien setzt jedoch technische Grundkenntnisse voraus, deren Aneignung recht zeitintensiv ist.&lt;/p>
&lt;p>Daher stellen wir mit OpenRefine eine Möglichkeit vor, wie Findbücher semimanuell für den Import in Datenbanksysteme vorbereitet werden können.
Hierbei setzen wir explizit &lt;strong>mehr&lt;/strong> auf nachvollziehbare Schritte und &lt;em>weniger&lt;/em> auf automatisierte, universell wiederverwendbare Code-Schnipsel.&lt;/p>
&lt;h2 id="generelles-vorgehen">Generelles Vorgehen&lt;/h2>
&lt;p>In diesem Tutorial extrahieren wir das Findbuch &amp;ldquo;&lt;em>Akten des Reichskammergerichts im Staatsarchiv Wertheim - Inventar des Bestands R J 10&lt;/em>&amp;rdquo; aus dem Anhang von &amp;ldquo;&lt;em>Band 57: Akten des Reichskammergerichts im Staatsarchiv Sigmaringen - Inventar des Bestands R 7. Bearb. von Raimund J. Weber. Kohlhammer 2004&lt;/em>&amp;rdquo;. Hierbei handelt es sich um 20 Findbucheinträge. Dies ist eine übersichtliche Anzahl für ein Tutorial. Wir haben die Techniken auch mit einem größeren Findbuch mit ca. 400 Einträgen getestet.&lt;/p>
&lt;p>Exemplarisch ist der erste Eintrag des Findbuchs in Abbildung 1 gezeigt.
Jeder Findbucheintrag ist in die folgenden acht nummerierten Abschnitte eingeteilt: (1) Bestellsignatur und Laufzeit, (2) Kläger, (3) Beklagter, (4) Prokuratoren, (5) Prozessart und Streitgegenstand, (6) Vorinstanzen, (7) Darinvermerk, (8) weitere Angaben. Einige dieser Abschnitte sind optional.
Bei dem ersten Eintrag fehlt zum Beispiel der Abschnitt 6 mit den Vorinstanzen.&lt;/p>
&lt;figure id="figure-erster-eintrag-aus-dem-findbuch-inventar-von-r-j-10">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Erster Eintrag aus dem Findbuch Inventar von R J 10" srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/akten-rkg-band-57-wertheim-eintrag-01_hu3631d528038460c9540c3f22ba74a969_39007_207f7c9d40605f80b8bf04b0213e95aa.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/akten-rkg-band-57-wertheim-eintrag-01_hu3631d528038460c9540c3f22ba74a969_39007_3d0e7c6af020298fccfebd1db4d33c14.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/akten-rkg-band-57-wertheim-eintrag-01_hu3631d528038460c9540c3f22ba74a969_39007_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/akten-rkg-band-57-wertheim-eintrag-01_hu3631d528038460c9540c3f22ba74a969_39007_207f7c9d40605f80b8bf04b0213e95aa.webp"
width="610"
height="467"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Erster Eintrag aus dem Findbuch Inventar von R J 10
&lt;/figcaption>&lt;/figure>
&lt;p>Die einzelnen Abschnitte enthalten teilweise zusammenhängende Informationsbestandteile (Beklagte, Prokuratoren, Vorinstanzen, &amp;hellip;).
Teilweise enthalten sie jedoch auch mehrere Informationsbestandteile, wie zum Beispiel im ersten Abschnitt.&lt;/p>
&lt;blockquote>
&lt;div class="entities" style="line-height: 2.5; direction: ltr">1 &lt;mark class="entity" style="background: #b3e2cd; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"> 1 &lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem">Nr&lt;/span> &lt;/mark> ( &lt;mark class="entity" style="background: #f4cae4; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"> C 2145 &lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem">Altsignatur&lt;/span> &lt;/mark> ) &lt;mark class="entity" style="background: #e6f5c9; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"> 1597 – 1600 &lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem">Laufzeit&lt;/span> &lt;/mark> &lt;br> Vorsignatur: &lt;mark class="entity" style="background: #cbd5e8; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"> R Rep. 9 Nr. 230 &lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem">Vorsignatur&lt;/span> &lt;/mark> &lt;/div>
&lt;/blockquote>
&lt;p>Wir gehen bei der Extraktion in mehreren Schritten vor:&lt;/p>
&lt;ol>
&lt;li>Einträge des Inventars aus Findbuch extrahieren&lt;/li>
&lt;li>Einträge in Abschnitte aufteilen&lt;/li>
&lt;li>Einzelne Informationsbestandteile aus Abschnitten in Tabelle extrahieren&lt;/li>
&lt;li>Einzelne Informationsbestandteile aus Tabelle auf Datenbankschema übertragen&lt;/li>
&lt;/ol>
&lt;div class="mermaid">---
title: Datenextraktion Mapping
config:
look: handDrawn
theme: neutral
---
flowchart LR
subgraph findbuch[fas:fa-font Findbuch]
intro[Einführung]
Inventar
Index
end
subgraph abschnitte[far:fa-list-alt Abschnitte]
a1[Abschnitt 1]
a2[Abschnitt 2]
a3[Abschnitt 3]
a4[Abschnitt 4]
a5[Abschnitt 5]
a6[Abschnitt 6]
a7[Abschnitt 7]
a8[Abschnitt 8]
end
subgraph data[fas:fa-table Daten]
nr[Nr]
Altsignatur
Vorsignatur
Laufzeit
Klaeger[Kläger]
Beklagte
Prokuratoren
Prozessart
Gegenstand
Vorinstanzen
Darin
Umfang
Stapelhoehe[Stapelhöhe]
Hinweise
end
subgraph db[fas:fa-database Datenbank]
Titel
Bestellsignatur
Vorsignatur1[Vorsignatur 1]
Vorsignatur2[Vorsignatur 2]
Entstehungszeitraum[Entstehungszeitraum]
EntstehungszeitraumA[Entstehungszeitraum, Anm.]
db_Beklagte[Beklagte]
Bemerkung
db_Gegenstand[Gegenstand]
Enthaelt[Enthält]
db_Umfang[Umfang]
end
Inventar --> abschnitte
a1 --> nr &amp; Laufzeit &amp; Altsignatur &amp; Vorsignatur
a2 --> Klaeger
a3 --> Beklagte
a4 --> Prokuratoren
a5 --> Gegenstand &amp; Prozessart
a6 --> Vorinstanzen
a7 --> Darin
a8 --> Umfang &amp; Stapelhoehe &amp; Hinweise
Klaeger --> Titel
nr --> Bestellsignatur
Altsignatur --> Vorsignatur1
Vorsignatur --> Vorsignatur2
Laufzeit --> Entstehungszeitraum &amp; EntstehungszeitraumA
Beklagte --> db_Beklagte
Vorinstanzen &amp; Hinweise--> Bemerkung
Prozessart --> db_Gegenstand
Prokuratoren &amp; Gegenstand &amp; Darin--> Enthaelt
Umfang &amp; Stapelhoehe --> db_Umfang
&lt;/div>
&lt;p>&lt;strong>Zur Vollständigkeit&lt;/strong>: In anderen Findbüchern zu den Akten des Reichskammergerichtes im Landesarchiv BW gibt es noch weitere Informationen,
wie zum Beispiel eine separate Bestellsignatur, Schadensbeschreibungen, Literaturhinweise, Hinweise auf Abgabe der Akten an andere Institutionen, &amp;hellip;
Außerdem gibt es in unserem Erfassungsschema noch weitere Felder, die für alle Findbucheinträge mit einem festen Wert vorbelegt wurden.&lt;/p>
&lt;p>Diese Spezialbehandlungen ignorieren wir für dieses Tutorial.&lt;/p>
&lt;h3 id="technische-voraussetzungen">Technische Voraussetzungen&lt;/h3>
&lt;h4 id="openrefine">OpenRefine&lt;/h4>
&lt;p>Bei &lt;a href="https://openrefine.org/" target="_blank" rel="noopener">OpenRefine&lt;/a> handelt es sich um ein Excel ähnliches Werkzeug im Browser,
mit dem Daten in andere Formate überführt werden können.
Details zur Funktionsweise gibt es in der &lt;a href="https://docs.openrefine.org/" target="_blank" rel="noopener">Dokumentation von OpenRefine&lt;/a>
und in den &lt;a href="https://www.youtube.com/watch?v=B70J_H_zAWM&amp;amp;list=PL737054C67FCC0741" target="_blank" rel="noopener">Erklärvideos zu OpenRefine&lt;/a>.&lt;/p>
&lt;p>Wir verwenden das &lt;a href="https://openrefine.org/download.html" target="_blank" rel="noopener">Windows kit with embedded Java&lt;/a>,
mit dem wir ohne Administrationsrechte oder separater Java-Installation direkt loslegen können.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
Auch wenn die Arbeit mit OpenRefine im Browser stattfindet, so liegen die Daten trotzdem lokal auf der eigenen Festplatte.
Eine Datenübertragung findet dann statt, wenn zum Beispiel ein so genanntes
&lt;a href="https://docs.openrefine.org/manual/reconciling" target="_blank" rel="noopener">Reconciling&lt;/a> durchgeführt wird,
bei dem die Daten mit einem Dienst im Web abgeglichen werden.
&lt;/div>
&lt;/div>
&lt;h4 id="reguläre-ausdrücke">Reguläre Ausdrücke&lt;/h4>
&lt;figure id="figure-perl-problemshttpsxkcdcom1171-von-randall-munroe-unter-cc-by-nc-lizenzhttpcreativecommonsorglicensesby-nc25">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="[Perl Problems](https://xkcd.com/1171/) von Randall Munroe unter [CC BY-NC Lizenz](http://creativecommons.org/licenses/by-nc/2.5/)." srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/perl_problems_hu0e0484462f33f916343aead87d9b7933_20532_8fdf08fae82e8346817146df2a00337b.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/perl_problems_hu0e0484462f33f916343aead87d9b7933_20532_df861a877b6fd6a5993e9f6618d9596b.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/perl_problems_hu0e0484462f33f916343aead87d9b7933_20532_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/perl_problems_hu0e0484462f33f916343aead87d9b7933_20532_8fdf08fae82e8346817146df2a00337b.webp"
width="548"
height="205"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
&lt;a href="https://xkcd.com/1171/" target="_blank" rel="noopener">Perl Problems&lt;/a> von Randall Munroe unter &lt;a href="http://creativecommons.org/licenses/by-nc/2.5/" target="_blank" rel="noopener">CC BY-NC Lizenz&lt;/a>.
&lt;/figcaption>&lt;/figure>
&lt;p>Bei Memes zu &lt;a href="https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck" target="_blank" rel="noopener">regulären Ausdrücken&lt;/a> wird wie in Abbildung 2 häufig der Eindruck erweckt,
dass sie mehr Probleme erzeugen als sie tatsächlich lösen. Richtig dosiert sind sie jedoch ein hilfreiches Werkzeug bei der Datenextraktion.&lt;/p>
&lt;p>Zum Entwickeln, Testen und Verstehen von regulären Ausdrücken, nutzen wir &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a> (Alternative: &lt;a href="https://regexr.com/" target="_blank" rel="noopener">RegExr&lt;/a>).
Hier bekommen wir wie in Abbildung 3 visuelles Feedback, auf welche Textzeilen unsere regulären Ausdrücke passen und was die einzelnen Bestandteile bedeuten.&lt;/p>
&lt;figure id="figure-bildschirmfoto-von-regex101httpsregex101com-mit-art-ecmascript-einem-regulären-ausdruck-zur-extraktion-der-altsignatur-in-der-mitte-oben-mehreren-beispielen-direkt-darunter-und-hilfreichen-informationen-auf-der-rechten-seite">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto von [RegEx101](https://regex101.com/) mit Art *ECMAScript*, einem regulären Ausdruck zur Extraktion der **Altsignatur** in der Mitte oben, mehreren Beispielen direkt darunter und hilfreichen Informationen auf der rechten Seite." srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/regex101_hu03be89b75292a0eb807ee2f1e55d3728_80009_5450a57a227a11af8062f7f9afe0ef8a.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/regex101_hu03be89b75292a0eb807ee2f1e55d3728_80009_7c368174fbd9183de9db61b29f1ee75f.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/regex101_hu03be89b75292a0eb807ee2f1e55d3728_80009_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/regex101_hu03be89b75292a0eb807ee2f1e55d3728_80009_5450a57a227a11af8062f7f9afe0ef8a.webp"
width="760"
height="421"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto von &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a> mit Art &lt;em>ECMAScript&lt;/em>, einem regulären Ausdruck zur Extraktion der &lt;strong>Altsignatur&lt;/strong> in der Mitte oben, mehreren Beispielen direkt darunter und hilfreichen Informationen auf der rechten Seite.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="1-inventar-aus-findbuch-extrahieren">1. Inventar aus Findbuch extrahieren&lt;/h2>
&lt;p>OpenRefine ist für die Arbeit mit tabellenartigen Strukturen ausgelegt, weshalb es mühsam ist große Texte darin zu formatieren, bzw. längere Abschnitte zu löschen.
Daher empfiehlt es sich einige Vorbereitungen zu erledigen, &lt;strong>bevor&lt;/strong> die Daten in OpenRefine geladen werden.
Dazu gehört es zum Beispiel das Inventar in einer separaten Datei zu speichern und Abbildungen zu entfernen.
Außerdem sollten im Vorfeld ggf. Layout- und OCR-Fehler korrigiert werden.
Darauf gehen wir in einem separaten Artikel ein.&lt;/p>
&lt;p>In diesem Tutorial betrachten wir den Fall, dass wir auf Basis der originalen Word- oder PDF-Vorlage direkt eine &amp;ldquo;ordentliche&amp;rdquo; Textdatei erstellen können.&lt;/p>
&lt;blockquote>
&lt;p>💾 Wir stellen die aufgeräumte Datei zur Verfügung (Rechtsklick und &amp;ldquo;Ziel speichern unter&amp;hellip;&amp;rdquo;):&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/rkg-57/akten-rkg-band-57-wertheim.txt" target="_blank">
&lt;i class="fas fa-file-alt pr-1 fa-fw">&lt;/i>Inventar Akten RKG Band 57 - Wertheim&lt;/a>
.
&lt;p>Wir möchten explizit dazu einladen diese Datei zu nutzen, um die einzelnen Schritte in OpenRefine selbst auszuprobieren und damit zu experimentieren.&lt;/p>
&lt;h2 id="2-einträge-in-abschnitte-aufteilen">2. Einträge in Abschnitte aufteilen&lt;/h2>
&lt;h3 id="findbuch-laden">Findbuch laden&lt;/h3>
&lt;p>Nachdem wir OpenRefine gestartet haben, öffnet sich die Bedienoberfläche im Webbrowser auf &lt;a href="http://localhost:3333" target="_blank" rel="noopener">http://localhost:3333&lt;/a> automatisch.&lt;/p>
&lt;p>Die Sprache der Oberfläche lässt sich auf Deutsch einstellen, wir bleiben jedoch bei Englisch.
Das macht es uns einfacher die einzelnen Bedienelemente und Funktionen mit der Dokumentation abzugleichen bzw. via Google Lösungen für Fragestellungen zu finden.&lt;/p>
&lt;p>Wie in Abbildung 4 gezeigt, laden wir unter &amp;ldquo;Create Project&amp;rdquo; die Textdatei aus dem letzten Abschnitt mit dem Inventar des Findbuchs in OpenRefine.&lt;/p>
&lt;figure id="figure-bildschirmfoto-vom-projekt-erstellen-formular-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto vom Projekt Erstellen Formular in OpenRefine." srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-create-upload_hu12aab4d4757489fe8aa35bcf1061e7e7_27489_21a9f972ac1c8761ef7f10ce29009702.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-create-upload_hu12aab4d4757489fe8aa35bcf1061e7e7_27489_b65c02055023271202e2f8b02ae88886.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-create-upload_hu12aab4d4757489fe8aa35bcf1061e7e7_27489_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-create-upload_hu12aab4d4757489fe8aa35bcf1061e7e7_27489_21a9f972ac1c8761ef7f10ce29009702.webp"
width="760"
height="179"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto vom Projekt Erstellen Formular in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Bei uns hat OpenRefine direkt die passenden Einstellungen für die Datei geladen.
Wir haben lediglich den Projektnamen angepasst und Schlagworte (Tags) vergeben. Um das neue Projekt zu erstellen, klicken Sie rechts oben auf den Button &amp;ldquo;Create Project&amp;rdquo;.
Manchmal möchte OpenRefine davon überzeugt werden, dass wir wirklich eine Textdatei ohne jegliche Tabellenstrukur laden möchten.
Dafür wie in Abbildung 5 unter &amp;ldquo;Parse data as&amp;rdquo; den Punkt &amp;ldquo;Line-based text files&amp;rdquo; auswählen.&lt;/p>
&lt;figure id="figure-bildschirmfoto-vom-projekt-einstellungsformular-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto vom Projekt Einstellungsformular in OpenRefine." srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-create-settings_hud6e820b847deb165664e93c6831065b6_96205_f5012a0df3e28a705937901c27b46555.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-create-settings_hud6e820b847deb165664e93c6831065b6_96205_1f422eb078de0819cc8a16461b95c73f.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-create-settings_hud6e820b847deb165664e93c6831065b6_96205_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-create-settings_hud6e820b847deb165664e93c6831065b6_96205_f5012a0df3e28a705937901c27b46555.webp"
width="760"
height="370"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto vom Projekt Einstellungsformular in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Wir haben für uns festgestellt, dass es einfacher ist initial die leeren Zeilen mitzuladen und später zu entfernen.
So helfen die leeren Zeilen zum Beispiel bei der visuellen Separierung der einzelnen Findbucheinträge.&lt;/p>
&lt;h3 id="vorbereitungen-in-openrefine">Vorbereitungen in OpenRefine&lt;/h3>
&lt;p>In OpenRefine haben wir nun jede einzelne Textzeile als &amp;ldquo;row&amp;rdquo;.
Um einen besseren Überblick zu haben benennen wir die (einzige) Spalte in &amp;ldquo;Original&amp;rdquo; um und stellen die Anzeige auf &amp;ldquo;50 rows&amp;rdquo; um.
Zum Umbenennen verwenden wir das Menüsymbol
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i> neben der Spaltenüberschrift und gehen in das Untermenü &amp;ldquo;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Rename this column&amp;rdquo;.&lt;/p>
&lt;p>Anschließend wollen wir die Kopfzeilen der ursprünglichen Seiten entfernen.
Diese sehen wie folgt aus (bei den Pfeilen handelt es sich um eine Repräsentation des Unicode Zeichens &lt;code>U+000C&lt;/code> für einen Seitenumbruch):&lt;/p>
&lt;pre>
&amp;#129145;486 Anhang
&amp;#129145; Inventar 487
&lt;/pre>
&lt;p>Um diese Zeilen zu entfernen klicken wir auf das Menü-Symbol
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i> in der Spalte Original und wählen den &amp;ldquo;Textfilter&amp;rdquo;.
Dort aktivieren wir das Auswahlkästchen
&lt;i class="far fa-check-square pr-1 fa-fw">&lt;/i> bei &amp;ldquo;regular expression&amp;rdquo; (siehe Abbildung 6).&lt;/p>
&lt;p>Durch ausprobieren entweder mit &lt;a href="https://regex101.com/" target="_blank" rel="noopener">RegEx101&lt;/a> oder direkt in dem Feld finden wir heraus, dass der reguläre Ausdruck &lt;code>\d\s+Anhang&lt;/code> (Zahl, viele Trennzeichen und das Wort Anhang) alle Zeilen filtert, die wir für die Filterung auf die ursprünglich &amp;ldquo;linken Seiten&amp;rdquo; benötigen.
Ein etwas aufwendigerer regulärer Ausdruck wäre &lt;code>\d{3,}\s{4,}Anhang$&lt;/code> (drei oder mehr Zahlen, vier oder mehr Leerzeichen und das Wort &amp;ldquo;Anhang&amp;rdquo; am Ende der Zeile).&lt;/p>
&lt;figure id="figure-bildschirmfoto-vom-textfilter-für-kopfzeilen-linker-seiten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto vom Textfilter für Kopfzeilen linker Seiten in OpenRefine." srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-textfilter_hu5f1c2d706604f78d6a33cb46fdb586e2_32553_6c4dee2f7f5fdeabfcb424d39d296f0b.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-textfilter_hu5f1c2d706604f78d6a33cb46fdb586e2_32553_bfdd0a751b634d44299a3fc9f5f9e8b8.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-textfilter_hu5f1c2d706604f78d6a33cb46fdb586e2_32553_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-textfilter_hu5f1c2d706604f78d6a33cb46fdb586e2_32553_6c4dee2f7f5fdeabfcb424d39d296f0b.webp"
width="669"
height="313"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto vom Textfilter für Kopfzeilen linker Seiten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Über das Menü-Symbol
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i> neben der Spalte &amp;ldquo;All&amp;rdquo; können wir diese Zeilen im Untermenü &amp;ldquo;Edit rows&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Remove matching rows&amp;rdquo; entfernen.&lt;/p>
&lt;p>Die Kopfzeilen für die ursprünglich rechten Seiten können via &lt;code>Inventar\s+\d&lt;/code> bzw. &lt;code>Inventar\s{4,}\d{3,}$&lt;/code> identifiziert und entfernt werden.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
In diesem Findbuch hätten wir auch lediglich nach &amp;ldquo;Anhang&amp;rdquo; und &amp;ldquo;Inventar&amp;rdquo; suchen können um die einzelnen Zeilen zu identifizieren.
Teilweise werden diese Wörter aber auch in den Texten der Findbucheinträge verwendet und wir wollten daher gleich den generischen Ansatz vorstellen.
&lt;/div>
&lt;/div>
&lt;p>Über das Schließen-Symbol
&lt;i class="far fa-window-close pr-1 fa-fw">&lt;/i> am Textfilter kommen wir zur ursprünglichen Ansicht zurück.&lt;/p>
&lt;h3 id="findbuchnummer-extrahieren">Findbuchnummer extrahieren&lt;/h3>
&lt;h4 id="neue-spalte-anlegen">Neue Spalte anlegen&lt;/h4>
&lt;p>Als erstes Feld extrahieren wir die Findbuchnummer aus den Textzeilen.
Dafür verwenden wir &amp;ldquo;Original&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;p>Wir verwenden die von &lt;a href="https://docs.openrefine.org/manual/expressions" target="_blank" rel="noopener">GREL&lt;/a> unterstützten regulären Ausdrücke.
Um die Findbuchnummer zu extrahieren, verwenden wir &lt;a href="https://docs.openrefine.org/manual/grelfunctions#matchs-p" target="_blank" rel="noopener">match&lt;/a> auf jeder Zeile (&lt;code>value&lt;/code>, siehe Abbildung 7).&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-dialogs-zum-hinzufügen-der-spalte-nr-für-die-findbuchnummer-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Dialogs zum Hinzufügen der Spalte Nr für die Findbuchnummer in OpenRefine." srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-column-nr_huc6724e6eb74bd78c5eb8b5eaebc05e1f_30407_24107f127b76a96344497a4395e3824c.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-column-nr_huc6724e6eb74bd78c5eb8b5eaebc05e1f_30407_40d27736e51cc14cde62687e17078521.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-column-nr_huc6724e6eb74bd78c5eb8b5eaebc05e1f_30407_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-column-nr_huc6724e6eb74bd78c5eb8b5eaebc05e1f_30407_24107f127b76a96344497a4395e3824c.webp"
width="722"
height="528"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Dialogs zum Hinzufügen der Spalte Nr für die Findbuchnummer in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Die verwendete &amp;ldquo;Expression&amp;rdquo; filtert Zeilen, die mit 1 und mehreren Leerzeichen beginnen und extrahiert alles direkt nach den Leerzeichen, was &lt;strong>keine&lt;/strong> Klammer ist.
Das anschließende &lt;code>.+&lt;/code> benötigen wir, da der reguläre Ausdruck bei &lt;a href="https://docs.openrefine.org/manual/grelfunctions#matchs-p" target="_blank" rel="noopener">match&lt;/a>, anders als bei &lt;a href="https://docs.openrefine.org/manual/grelfunctions#finds-sub-or-p" target="_blank" rel="noopener">find&lt;/a>, auf die komplette Zeile passen muss.
Von der Liste (technisch &lt;a href="https://docs.openrefine.org/manual/grelfunctions#array-functions" target="_blank" rel="noopener">Array&lt;/a>) der möglichen Ergebnisse wählen wir das erste Ergebnis via &lt;code>[0]&lt;/code> und entfernen überflüssige Leerzeichen mit &lt;a href="https://docs.openrefine.org/manual/grelfunctions#trims" target="_blank" rel="noopener">trim&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">match&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/1\s+([^(]+).+/&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="unterschied-zwischen-rows-und-records">Unterschied zwischen rows und records&lt;/h4>
&lt;p>Die Spalte Nr verschieben wir anschließend ganz an den Anfang via &amp;ldquo;Nr&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Move column to beginning&amp;rdquo;.
Das hat zur Folge, dass wir nun zwischen &amp;ldquo;rows&amp;rdquo; und &amp;ldquo;records&amp;rdquo; hin- und herwechseln können.
OpenRefine gruppiert die Zeilen anhand der Merkmale in der ersten Spalte in so genannte &amp;ldquo;records&amp;rdquo;.&lt;/p>
&lt;p>Anstatt der erwarteten 20 Findbucheinträge haben wir jedoch 71?&lt;/p>
&lt;p>Also überprüfen wir, ob bei der Extraktion der Findbuchnummern etwas schief gelaufen ist.&lt;/p>
&lt;h4 id="extraktion-überprüfen">Extraktion überprüfen&lt;/h4>
&lt;p>Um die Extraktion zu überprüfen ohne uns durch alle Seiten zu klicken, verwenden wir ein &amp;ldquo;&lt;a href="https://docs.openrefine.org/manual/facets" target="_blank" rel="noopener">Facet&lt;/a>&amp;rdquo; um die entsprechenden Zeilen zu filtern.
Dafür verwenden wir &amp;ldquo;Nr&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Text facet&amp;rdquo;.
In dem &amp;ldquo;Facet&amp;rdquo; wählen wir &amp;ldquo;blank&amp;rdquo; und invertieren die Auswahl oben im &amp;ldquo;Facet&amp;rdquo; über &amp;ldquo;invert&amp;rdquo; (siehe ABbildung 8).&lt;/p>
&lt;figure id="figure-bildschirmfoto-des-facet-für-die-spalte-nr-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto des Facet für die Spalte Nr in OpenRefine." srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-column-nr-facet_hu3d63954ff3ca2a9fcf1a63fe26ca4812_65934_f5a207d0ae0053e08324b2087ef5959d.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-column-nr-facet_hu3d63954ff3ca2a9fcf1a63fe26ca4812_65934_c13859750640dcd9d68fd1cbcbad9fac.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-column-nr-facet_hu3d63954ff3ca2a9fcf1a63fe26ca4812_65934_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-column-nr-facet_hu3d63954ff3ca2a9fcf1a63fe26ca4812_65934_f5a207d0ae0053e08324b2087ef5959d.webp"
width="760"
height="561"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto des Facet für die Spalte Nr in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Die Extraktion scheint funktioniert zu haben. Beim genaueren Betrachten der &amp;ldquo;records&amp;rdquo; fällt jedoch auf, dass Leerzeilen ebenfalls als &amp;ldquo;records&amp;rdquo; gezählt werden.&lt;/p>
&lt;h4 id="leerzeilen-entfernen">Leerzeilen entfernen&lt;/h4>
&lt;p>Es ist also an der Zeit die Leerzeilen zu entfernen. Dafür wechseln wir wieder in die Ansicht &amp;ldquo;rows&amp;rdquo; und erstellen ein &amp;ldquo;Facet&amp;rdquo; via
&amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Facet by blank (null or empty string)&amp;rdquo;.
Im &amp;ldquo;Facet&amp;rdquo; wählen wir anschließend &amp;ldquo;true&amp;rdquo; und löschen die ausgewählten Zeilen via &amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit rows&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Remove matching rows&amp;rdquo;.&lt;/p>
&lt;p>Wenn wir das &amp;ldquo;Facet&amp;rdquo; wieder schließen und nun in die &amp;ldquo;records&amp;rdquo; Ansicht wechseln, haben wir genau 20 Einträge.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
Hier sollte sich spätestens das Bedürfnis melden diesen Zwischenstand speichern zu wollen.
Das ist nicht notwendig, da OpenRefine alle Schritte (die Veränderungen einführen) speichert und unter &amp;ldquo;&lt;a href="https://docs.openrefine.org/manual/running#history-undoredo" target="_blank" rel="noopener">Undo/Redo&lt;/a>&amp;rdquo; zur Verfügung stellt.
&lt;/div>
&lt;/div>
&lt;h3 id="abschnittnummer-extrahieren">Abschnittnummer extrahieren&lt;/h3>
&lt;p>Die Abschnittnummer benötigen wir zwar nicht für unsere Datenbank, sie hilft uns aber die einzelnen Abschnitte mit OpenRefine zu gruppieren und zu bearbeiten.&lt;/p>
&lt;p>Analog zur Extraktion der Findbuch Nummer fügen wir eine neue Spalte Abschnitt hinzu (&amp;ldquo;Original&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;) und verwenden die folgende &amp;ldquo;Expression&amp;rdquo;:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">match&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/([1-8])\s\s.+/&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Diese Expression filtert Zeilen, die einer Zahl zwischen 1 und 8 gefolgt von zwei Leerzeichen beginnen, und extrahiert anschließend die Zahl.&lt;/p>
&lt;p>Die neue Spalte verschieben wir anschließend an den Anfang (&amp;ldquo;Abschnitt&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Move column to beginning&amp;rdquo;) und kontrollieren die extrahierten Bestandteile (&amp;ldquo;Abschnitt&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Facet&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Text facet&amp;rdquo;). Das &amp;ldquo;Facet&amp;rdquo; auf den Abschnittsnummern lassen wir stehen, da wir es später noch benötigen werden.&lt;/p>
&lt;h4 id="zeilen-der-abschnitte-zusammenfassen">Zeilen der Abschnitte zusammenfassen&lt;/h4>
&lt;p>Das Verschieben der Spalte Abschnitt an den Anfang sorgt dafür, dass jeder Abschnitt nun einen eigenen &amp;ldquo;record&amp;rdquo; darstellt.&lt;/p>
&lt;p>Das ist von daher von Vorteil, da wir alle Zeilen eines &amp;ldquo;records&amp;rdquo; in eine Zeile zusammenfassen können.
Dafür verwenden wir &amp;ldquo;Original&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Join multi-valued cells&amp;hellip;&amp;rdquo;
und geben &lt;code>-:::-&lt;/code> als Trennsequenz (&amp;ldquo;separator&amp;rdquo;) an. Diese Zeichenfolge verwenden wir, da wir sie anschließend mit einem Zeilenumbruch &lt;code>\n&lt;/code> ersetzen wollen.
Ein direktes Verbinden von Zellen mit einem Zeilenumbruch geht in der aktuellen Version (3.5.1) nicht.&lt;/p>
&lt;p>Via &amp;ldquo;Original&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo; ersetzen wir unsere spezifische Trennsequenz anschließend durch einen Zeilenumbruch.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;-:::-&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wie in Abbildung 9 gezeigt, haben wir nun gleich viele Zeilen (&amp;ldquo;rows&amp;rdquo;) wie &amp;ldquo;records&amp;rdquo;.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-zwei-extrahierten-spalten-abschnitt-und-nr-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der zwei extrahierten Spalten Abschnitt und Nr in OpenRefine." srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-column-abschnitt_huca81e1c249d03303b5315c7869e4d391_61337_4b2ea7a1d2edf4a3ed1175dd1baf5f99.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-column-abschnitt_huca81e1c249d03303b5315c7869e4d391_61337_fe1cfe181a367997e1bfa0edf1e8d4df.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-column-abschnitt_huca81e1c249d03303b5315c7869e4d391_61337_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-column-abschnitt_huca81e1c249d03303b5315c7869e4d391_61337_4b2ea7a1d2edf4a3ed1175dd1baf5f99.webp"
width="760"
height="437"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der zwei extrahierten Spalten Abschnitt und Nr in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h2 id="3-findbuch-inventar-in-tabelle-umwandeln">3. Findbuch Inventar in Tabelle umwandeln&lt;/h2>
&lt;p>Nun können wir den Text Abschnitt für Abschnitt in ein tabellenartiges Format überführen.
Das Vorgehen ist prinzipiell immer gleich:&lt;/p>
&lt;ol>
&lt;li>Mit einer &amp;ldquo;Expression&amp;rdquo; eine neue Spalte basierend auf der Spalte Original hinzufügen.&lt;/li>
&lt;li>Eventuell Zeilenumbrüche in der neuen Spalte entfernen.&lt;/li>
&lt;/ol>
&lt;h3 id="abschnitt-1-nr-altsignatur-vorsignatur-laufzeit">Abschnitt 1 (Nr, Altsignatur, Vorsignatur, Laufzeit)&lt;/h3>
&lt;p>In dem &amp;ldquo;Facet&amp;rdquo; für den Abschnitt wählen wir den Abschnitt 1.&lt;/p>
&lt;p>Die Spalte Nr&amp;quot; haben wir bereits in einem der vorbereitenden Schritte extrahiert.
Es folgen die Expressions für die restlichen drei Angaben, die sich noch in Abschnitt 1 befinden, nämlich Altsignatur, Vorsignatur und Laufzeit.
Hinzugefügt wird mit &amp;ldquo;Original&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Add column based on this column&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;blockquote>
&lt;div class="entities" style="line-height: 2.5; direction: ltr">1 &lt;mark class="entity" style="background: #b3e2cd; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"> 1 &lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem">Nr&lt;/span> &lt;/mark> ( &lt;mark class="entity" style="background: #f4cae4; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"> C 2145 &lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem">Altsignatur&lt;/span> &lt;/mark> ) &lt;mark class="entity" style="background: #e6f5c9; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"> 1597 – 1600 &lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem">Laufzeit&lt;/span> &lt;/mark> &lt;br> Vorsignatur: &lt;mark class="entity" style="background: #cbd5e8; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"> R Rep. 9 Nr. 230 &lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem">Vorsignatur&lt;/span> &lt;/mark> &lt;/div>
&lt;/blockquote>
&lt;h4 id="altsignatur">Altsignatur&lt;/h4>
&lt;p>Die Altsignatur steht in Klammern direkt nach der Findbuchnummer.
Anstatt mit &lt;code>match&lt;/code> einen regulären Ausdruck für die komplette Zeile zu definieren, verwenden wir nun &lt;code>find&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/(?&amp;lt;=\().+?(?=\))/&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wir suchen eine beliebige Folge von Zeichen, die zwischen zwei Klammern steht. Dafür nutzen wir so genannte &amp;ldquo;Look-around assertions&amp;rdquo;.
Anschließend wählen wir das erste Ergebnis aus und entfernen vorsichtshalber noch Leerzeichen am Anfang und am Ende.&lt;/p>
&lt;p>Alternativ können wir die Klammern auch mit in den regulären Ausdruck aufnehmen und anschließend mit &lt;a href="https://docs.openrefine.org/manual/grelfunctions#substrings-n-from-n-to-optional" target="_blank" rel="noopener">substring&lt;/a> entfernen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\([^)]+\)/&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">substring&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="vorsignatur">Vorsignatur&lt;/h4>
&lt;p>Die Vorsignatur steht direkt hinter dem Text &amp;ldquo;Vorsignatur:&amp;rdquo;.
Dafür können wir eine &amp;ldquo;positive look-behind assertion&amp;rdquo; verwenden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/(?&amp;lt;=Vorsignatur:).+/&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Alternativ kann auch hier der Text &amp;ldquo;Vorsignatur:&amp;rdquo; mit in den regulären Ausdruck aufgenommen und anschließend mit &lt;a href="https://docs.openrefine.org/manual/grelfunctions#replaces-s-or-p-find-s-replace" target="_blank" rel="noopener">replace&lt;/a> entfernt werden.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/Vorsignatur: .+/&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Vorsignatur:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Das setzt jedoch voraus, dass der Text &amp;ldquo;Vorsignatur:&amp;rdquo; auch einheitlich geschrieben wurde.
Die Variante mit der &amp;ldquo;positive look-behind assertion&amp;rdquo; kann bei unterschiedlichen Schreibweisen einfacher angepasst werden.&lt;/p>
&lt;h4 id="laufzeit">Laufzeit&lt;/h4>
&lt;p>Die Laufzeit steht mit Abstand hinter der eingeklammerten Altsignatur.
Also können wir hier als &amp;ldquo;positive look-behind&amp;rdquo; nach einer schließenden Klammer, gefolgt von mehreren Leerzeichen suchen, und alle folgenden Zeichen als Laufzeit extrahieren.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/(?&amp;lt;=\)\s{4}).+/&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Alternativ können wir auch hier die Klammer mit in den regulären Ausdruck aufnehmen und sie anschließend entfernen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\)\s{4,}.+/&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">substring&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="abschnitt-2-kläger">Abschnitt 2 (Kläger)&lt;/h3>
&lt;p>Wir wechseln mit dem &amp;ldquo;Facet&amp;rdquo; zu Abschnitt 2 und übernehmen hier den kompletten Inhalt, den wir anschließend bearbeiten.
Wir entfernen die Abschnittnummer am Anfang und das Trennzeichen &lt;code>. /.&lt;/code> zwischen Käger und Beklagten.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/^2\s{2,}/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\n\s*\.\s*\/\./&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Ab einer bestimmten Menge an Findbucheinträgen gibt es hin- und wieder Unterschiede in der Anzahl der Leerzeichen (Tippfehler, Scanfehler, &amp;hellip;), weshalb wir diese dynamisch mit regulären Ausdrücken beschrieben haben. Alternativ hätten wir in diesem Findbuch auch ohne reguläre Ausdrücke arbeiten können.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;2 &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;. /.&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Es ist hier auch möglich den Text zu Verkürzen, anstatt die 2 zu ersetzen:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">substring&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;. /.&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="alert alert-note">
&lt;div>
Wir zeigen hier bewusst Lösungen mit unterschiedlicher Komplexität.
Je nach vorliegendem Datenmaterial sind die einfachen Strategien (Textverkürzung, Textersetzung, &amp;hellip;) vollkommen ausreichend.
Teilweise sind Findbücher jedoch inkonsistent (unterschiedliche Autoren, unterschiedliche Archivalien, Tippfehler, Scanfehler, &amp;hellip;).
Hier benötigt es komplexere Lösungen, wie zum Beispiel reguläre Ausdrücke.
&lt;/div>
&lt;/div>
&lt;h4 id="zeilenumbrüche-entfernen">Zeilenumbrüche entfernen&lt;/h4>
&lt;p>Bei den Klägern wollen wir zusätzlich die Leerzeilen entfernen.
Dafür gehen wir auf &amp;ldquo;Kläger&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;
und verwenden die folgende Expression:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/-\n\s*(?![A-Z])/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/(?&amp;lt;=-)\n\s*(?=[A-Z])/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\n\s*/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dieser Expression entfernt zuerst Zeilenumbrüche (mit Bindestrich), die mit einem Bindestrich enden, wobei das erste Wort in der nächsten Zeile nicht groß geschrieben sein darf.
Dann werden Zeilenumbrüche entfernt, bei denen der Bindestrich erhalten bleiben soll.
Anschließend werden die restlichen Zeilenumbrüche mit einem Leerzeichen ersetzt.
Diese Umwandlung können wir wie beschrieben in einem nachgelagerten Schritt, oder direkt bei der Erstellung der Spalte durchführen.&lt;/p>
&lt;h3 id="abschnitt-3-beklagte">Abschnitt 3 (Beklagte)&lt;/h3>
&lt;p>Wir wechseln mit dem “Facet” zu Abschnitt 3, übernehmen hier den kompletten Inhalt, entfernen die Abschnittnummer, und entfernen die Zeilenumbrüche.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/^3\s{2,}/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/-\n\s*(?![A-Z])/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/(?&amp;lt;=-)\n\s*(?=[A-Z])/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\n\s*/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="abschnitt-4-prokuratoren">Abschnitt 4 (Prokuratoren)&lt;/h3>
&lt;p>Wir wechseln mit dem “Facet” zu Abschnitt 4 und übernehmen hier den kompletten Inhalt. Die Formatierung (Zeilenumbrüche, &amp;hellip;) wollen wir hier beibehalten.
Lediglich die Abschnittnummer entfernen wir.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/^4/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="abschnitt-5-prozessart-und-gegenstand">Abschnitt 5 (Prozessart und Gegenstand)&lt;/h3>
&lt;p>Wir wechseln mit dem “Facet” zu Abschnitt 5. Hier wollen wir die Prozessart von dem Prozessgegenstand trennen.
Hierfür ist es in den meisten Fällen ausreichend, die erste Zeile von den restlichen zu trennen.
Bei manchen Prozessen erstreckt sich die Prozessart jedoch auf mehrere Zeilen.
Es ist zwar möglich auf Grund verschiedener Merkmale die Anzahl der Zeilen für die Prozessart zu bestimmen, der Algorithmus dafür wird jedoch komplex.
Daher prüfen wir die einzelnen Einträge und korrigieren bei den Ausnahmen manuell nach.&lt;/p>
&lt;h4 id="prozessart">Prozessart&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/^5\s{2,}/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wir trennen den Text an den Zeilenumbrüchen auf, wählen die erste Zeile und ersetzen dort die Abschnittnummer.
Anschließend korrigieren wir die Prozessart in den Ausnahmefällen manuell.
Dafür fahren wir wie in Abbildung 10 mit der Maus in die zu bearbeitende Zelle, worauf ein blaues Bedienelement mit dem Text &amp;ldquo;Edit&amp;rdquo; es uns erlaubt in den Bearbeitungsmodus für diese Zelle zu wechseln.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-edit-funktionalität-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der &amp;#39;Edit&amp;#39;-Funktionalität in OpenRefine." srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-edit-prozessart_hueac7ef049c1393811c59b6c953ba3d8c_17548_94926e056d45232cbb94416d31a817f7.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-edit-prozessart_hueac7ef049c1393811c59b6c953ba3d8c_17548_edd06836278122286e3c1be2ee1b9272.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-edit-prozessart_hueac7ef049c1393811c59b6c953ba3d8c_17548_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-edit-prozessart_hueac7ef049c1393811c59b6c953ba3d8c_17548_94926e056d45232cbb94416d31a817f7.webp"
width="692"
height="314"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der &amp;lsquo;Edit&amp;rsquo;-Funktionalität in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h4 id="gegenstand">Gegenstand&lt;/h4>
&lt;p>Die Spalte Prozessart haben wir schon manuell korigiert. Um uns diesen Schritt für die Spalte Gegenstand zu sparen, gehen wir in der nächsten &amp;ldquo;Expression&amp;rdquo; wie folgt vor:&lt;/p>
&lt;ol>
&lt;li>Ersetze die Abschnittnummer&lt;/li>
&lt;li>Ersetze alle Zeilenumbrüche&lt;/li>
&lt;li>Entferne die Prozessart durch Ersetzung mit dem Inhalt der Spalte Prozessart.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/^5\s{2,}/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/-\n\s*(?![A-Z])/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/(?&amp;lt;=-)\n\s*(?=[A-Z])/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\n\s*/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Prozessart&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="abschnitt-6-vorinstanzen">Abschnitt 6 (Vorinstanzen)&lt;/h3>
&lt;p>Wir wechseln mit dem “Facet” zu Abschnitt 6 und übernehmen hier den kompletten Inhalt. Die Formatierung (Zeilenumbrüche, &amp;hellip;) wollen wir hier beibehalten.
Lediglich die Abschnittnummer entfernen wir.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/^6/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="abschnitt-7-darin">Abschnitt 7 (Darin)&lt;/h3>
&lt;p>Wir wechseln mit dem “Facet” zu Abschnitt 7 und übernehmen hier den kompletten Inhalt.
Die Zeilenumbrüche wollen wir entfernen, dabei aber jedes Q in einer neuen Zeile stehen haben.&lt;/p>
&lt;p>Dabei gehen wir wie folgt vor:&lt;/p>
&lt;ol>
&lt;li>Abschnittnummer entfernen&lt;/li>
&lt;li>Zeilenumbrüche vor &lt;code>Q&lt;/code> mit Trennsequzenz ersetzen&lt;/li>
&lt;li>Zeilenumbrüche vor &lt;code>ohne Q&lt;/code> mit Trennsequzenz ersetzen&lt;/li>
&lt;li>Zeilenumbrüche mit Bindestrich (anschließend Kleinschreibung) entfernen&lt;/li>
&lt;li>Zeilenumbrüche mit Bindestrich (anschließend Großschreibung) entfernen&lt;/li>
&lt;li>Restliche Zeilenumbrüche mit Leerzeichen ersetzen&lt;/li>
&lt;li>Trennsequzenz durch Zeilenumbrüche und Leerzeichen für Formatierung ersetzen&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/^7/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\s*\n\s+(?=Q\s*\d)/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;-:::-&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\s*\n\s+(?=ohne Q\s*)/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;-:::-&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/-\n\s*(?![A-Z])/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/(?&amp;lt;=-)\n\s*(?=[A-Z])/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\n\s*/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/-:::-/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;\n &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="abschnitt-8-umfang-stapelhöhe-hinweise">Abschnitt 8 (Umfang, Stapelhöhe, Hinweise)&lt;/h3>
&lt;p>Wir wechseln mit dem “Facet” zu Abschnitt 8.
In diesem Abschnitt haben wir mehrere Bestandteile, die wir in separate Spalten extrahieren wollen.&lt;/p>
&lt;blockquote>
&lt;div class="entities" style="line-height: 2.5; direction: ltr"> Q 1– 39&lt;br> &lt;mark class="entity" style="background: #b3e2cd; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;">3 cm &lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem">Stapelhöhe&lt;/span>&lt;/mark>&lt;br> ohne Wetzlarer Nummer, da vor Generalausteilung abgegeben (an Nach-&lt;br> folgeinstanz?)&lt;/div>
&lt;/blockquote>
&lt;p>Die Stapelhöhe bietet sich hier als Trennmerkmal an, da sie einfach zu identifizieren ist.
Bei Einträgen ohne Stapelhöhe können wir die Trennung manuell vornehmen.
Bei komplexeren Angaben können die verwendeten regulären Ausdrücke auch erweitert werden.&lt;/p>
&lt;h4 id="umfang">Umfang&lt;/h4>
&lt;p>Um den Umfang zu extrahieren, teilen wir den Eintrag bei der Stapelhöhe und entfernen die Abschnittnummer.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\d+\s+cm/&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/^8\s+/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Ein Eintrag muss manuell nachbearbeitet werden.&lt;/p>
&lt;h4 id="stapelhöhe">Stapelhöhe&lt;/h4>
&lt;p>Die Stapelhöhe extrahieren wir direkt mit einem regulären Ausdruck.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\d+\s+cm/&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="hinweise">Hinweise&lt;/h4>
&lt;p>Die Hinweise stehen nach der Stapelhöhe. Daher teilen wir den Eintrag bei der Stapelhöhe, nehmen den hinteren Teil, und entfernen die Zeilenumbrüche.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\d+\s+cm/&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">slice&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/-\n\s*(?![A-Z])/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/(?&amp;lt;=-)\n\s*(?=[A-Z])/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\n\s*/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Ein Eintrag muss manuell nachbearbeitet werden.&lt;/p>
&lt;h3 id="nacharbeiten">Nacharbeiten&lt;/h3>
&lt;p>An dieser Stelle ist es soweit, dass wir die Spalten umsortieren, überflüssige Spalten löschen, die Zeilen zusammenfassen und die Daten noch einmal visuell prüfen.&lt;/p>
&lt;h4 id="spalte-abschnitt-löschen">Spalte Abschnitt löschen&lt;/h4>
&lt;p>Die Spalte Abschnitt wird nicht mehr benötigt und sie kann gelöscht werden.
&amp;ldquo;Abschnitt&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Remove this column&amp;rdquo;&lt;/p>
&lt;h4 id="zeilen-zusammenfassen">Zeilen zusammenfassen&lt;/h4>
&lt;p>Bei der Spalte Original verbinden wir mit der Trennsequenz &lt;code>-:::-&lt;/code> über &amp;ldquo;Original&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Join multi-valued cells&amp;hellip;&amp;rdquo;. Die Trennsequenz ersetzen wir anschließend via &amp;ldquo;Original&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;-:::-&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die anderen Spalten (Hinweise, Stapelhöhe, Umfang, Darin, Vorinstanzen, Gegenstand, Prozessart, Prokuratoren, Beklagte, Kläger) verbinden wir ohne Trennzeichen, da es hier ja nur einen Wer pro &amp;ldquo;record&amp;rdquo; gibt.&lt;/p>
&lt;p>Jetzt sollten wir wieder genausowiele Zeilen (&amp;ldquo;rows&amp;rdquo;) wie &amp;ldquo;records&amp;rdquo; haben.&lt;/p>
&lt;h4 id="spalten-sortieren">Spalten sortieren&lt;/h4>
&lt;p>Jetzt können die Spalten via &amp;ldquo;All&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit columns&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Re-order / remove columns&amp;hellip;&amp;rdquo; noch sortiert werden.&lt;/p>
&lt;h4 id="visuell-inspizieren">Visuell inspizieren&lt;/h4>
&lt;p>Jetzt kommt noch einmal ein visueller Abgleich der extrahierten Daten mit dem Original.
Die Spalte Original kann danach auch gelöscht werden (&amp;ldquo;Original&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Remove this column&amp;rdquo;). Das Ergebnis ist in Abbildung 11 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-bereinigten-daten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der bereinigten Daten in OpenRefine." srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-daten-uebersicht_hue7d96f5f6eeadc11e8a721db2fa25c32_118208_c616ef63cd17f7789628e07259ec8434.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-daten-uebersicht_hue7d96f5f6eeadc11e8a721db2fa25c32_118208_331bfd1e353e74dd44cb84efc115e313.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-daten-uebersicht_hue7d96f5f6eeadc11e8a721db2fa25c32_118208_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-daten-uebersicht_hue7d96f5f6eeadc11e8a721db2fa25c32_118208_c616ef63cd17f7789628e07259ec8434.webp"
width="760"
height="355"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der bereinigten Daten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h4 id="export">Export&lt;/h4>
&lt;p>Die Daten können wir über &amp;ldquo;Export&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Comma-separated value&amp;rdquo; als CSV-Datei exportieren.
Das machen wir, da wir für die Transformation der Daten auf das Datenbankschema ein separates Projekt erstellen wollen.&lt;/p>
&lt;p>Diese Trennung in zwei Projekte ist Geschmackssache.
Es hat sich jedoch gezeigt, dass es gerade bei der Übertragung der Daten auf das Erfassungsschema Abstimmungsbedarf und gegebenenfalls mehrerer Iterationen bedarf.
Daher hat sich diese Aufteilung in zwei getrennte Arbeitsschritte und Projekte bei uns etabliert.&lt;/p>
&lt;blockquote>
&lt;p>💾 Die einzelnen Arbeitsschritte im OpenRefine Format:&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/rkg-57/akten-rkg-band-57-wertheim-openrefine-txt.json" target="_blank">
&lt;i class="fas fa-file-archive pr-1 fa-fw">&lt;/i>Inventar Akten RKG Band 57 - Wertheim als OpenRefine Arbeitsschritte&lt;/a>
.
&lt;h2 id="4-tabelle-auf-datenbankschema-übertragen">4. Tabelle auf Datenbankschema übertragen&lt;/h2>
&lt;p>Wir haben in Teil 3 den Text des Inventars des Findbuchs in strukturierte Daten umgewandelt.
In diesem Teil wandeln wir diese Daten in unser Erfassungs- bzw. Datenbankschema um. Anders ausgedrückt: Wir bringen die Daten in eine Form, die es uns erlaubt, sie auf die Felder unseres Erschließungsformulars im AFIS zu mappen.&lt;/p>
&lt;blockquote>
&lt;p>💾 Die Datei mit den strukturierten Daten für diesen Teil:&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/rkg-57/akten-rkg-band-57-wertheim.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Inventar Akten RKG Band 57 - Wertheim als CSV&lt;/a>
.
&lt;h3 id="import">Import&lt;/h3>
&lt;p>Wir erstellen ein neues Projekt in OpenRefine und importieren dafür die CSV Datei.
OpenRefine erkennt automatisch die passenden Einstellungen und wir passen lediglich den Projektnamen und die Schlagworte an.
Siehe dazu Abbildung 12.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-einstellungen-zum-import-der-csv-datei-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Einstellungen zum Import der CSV-Datei in OpenRefine." srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-create-db-settings_hu01def4a5f868504ab7cc8e0012fe3607_137624_f5d65e24f766d31f8288a945c528844c.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-create-db-settings_hu01def4a5f868504ab7cc8e0012fe3607_137624_dab575ce2e0209004cbf908fcd7d561c.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-create-db-settings_hu01def4a5f868504ab7cc8e0012fe3607_137624_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-create-db-settings_hu01def4a5f868504ab7cc8e0012fe3607_137624_f5d65e24f766d31f8288a945c528844c.webp"
width="760"
height="362"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Einstellungen zum Import der CSV-Datei in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="transformation">Transformation&lt;/h3>
&lt;p>Da wir schon strukturierte Daten haben, fällt dieser Abschnitt etwas kürzer aus.
Hier geht es hauptsächlich darum einzelne Spalten zusammenzufassen, gegebenenfalls mit Text zu ergänzen und manchmal auch umzuwandeln.&lt;/p>
&lt;h4 id="titel">Titel&lt;/h4>
&lt;p>Hier wollen wir, dass der Kläger im Titelfeld steht und dass der Titel mit &amp;ldquo;Kläger:&amp;rdquo; beginnt. Unser Titel soll also die Form &amp;ldquo;Kläger: {Kläger}&amp;rdquo; haben.
Dafür wandeln wir die Spalte einfach via &amp;ldquo;Kläger&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo; um:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;Kläger: &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">value&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anschließend benennen wir die Spalte via &amp;ldquo;Kläger&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Rename this column&amp;rdquo; in &amp;ldquo;Titel&amp;rdquo; um.&lt;/p>
&lt;p>Um die Übersicht zu behalten, verschieben wir diese Spalte mit &amp;ldquo;Titel&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Move column to end&amp;rdquo; direkt an das Ende.&lt;/p>
&lt;h4 id="bestellsignatur">Bestellsignatur&lt;/h4>
&lt;p>Für die Bestellsignatur ergänzen wir zur Findbuch Nummer in der Spalte Nr die Bestandssignatur &lt;code>R J 10&lt;/code>.
Dafür transformieren wir via &amp;ldquo;Nr&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit cells&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Transform&amp;hellip;&amp;rdquo;&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;R J 10 &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">value&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Danach benennen wir die Spalte via &amp;ldquo;Nr&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Rename this column&amp;rdquo; in &amp;ldquo;Bestellsignatur&amp;rdquo; um.&lt;/p>
&lt;p>Anschließend sind wir mit dieser Spalte fertig und verschieben sie via &amp;ldquo;Bestellsignatur&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Move column to end&amp;rdquo; direkt an das Ende.&lt;/p>
&lt;h4 id="vorsignatur-1">Vorsignatur 1&lt;/h4>
&lt;p>Hier können wir direkt die Spalte Altsignatur umbennen und an das Ende verschieben.&lt;/p>
&lt;h4 id="vorsignatur-2">Vorsignatur 2&lt;/h4>
&lt;p>Hier können wir direkt die Spalte Vorsignatur umbennen und an das Ende verschieben.&lt;/p>
&lt;h4 id="entstehungszeitraum">Entstehungszeitraum&lt;/h4>
&lt;p>Wir haben beschlossen, dass wir als Entstehungszeitraum die niedrigste Jahreszahl der Laufzeit bis zur höchsten Jahreszahl der Laufzeit verwenden.
Diese müssen aus der Laufzeit erst noch extrahiert und in das AFIS Importformat umgewandelt werden.&lt;/p>
&lt;p>Um die original Schreibweise zu erhalten, wird diese im nächsten Feld (Entstehungszeitraum, Anm.) übernommen.&lt;/p>
&lt;p>Also erstellen wir hier eine neue Spalte aus der Spalte Laufzeit durch folgende Operationen:&lt;/p>
&lt;ol>
&lt;li>Ersetze alles was keine Ziffer ist &lt;code>\D&lt;/code> durch ein Leerzeichen.&lt;/li>
&lt;li>Ersetze mehrere Leerzeichen hintereinander &lt;code>\s+&lt;/code> durch &lt;strong>ein&lt;/strong> Leerzeichen.&lt;/li>
&lt;li>Entferne Leerzeichen zu Beginn und Ende der Laufzeit mit &lt;code>trim()&lt;/code>.&lt;/li>
&lt;li>Teile den Text an Leerzeichen mit &lt;code>split()&lt;/code>.&lt;/li>
&lt;li>Sortiere die Liste (technisch ein &lt;a href="https://docs.openrefine.org/manual/grelfunctions#array-functions" target="_blank" rel="noopener">Array&lt;/a>) mit &lt;code>sort()&lt;/code>.&lt;/li>
&lt;li>Die Liste wird &lt;code>arr&lt;/code> genannt (via &lt;code>with&lt;/code>).&lt;/li>
&lt;li>Wenn die Liste mehr als ein Element beinhaltet, nehmen wir das erste &lt;code>arr[0]&lt;/code> und letzte Element &lt;code>arr[-1]&lt;/code> aus der sortierten Liste.&lt;/li>
&lt;li>Wenn die Liste nur ein Element beinhaltet, nehmen wir dieses.&lt;/li>
&lt;li>(indirekt) Bei Fehlern, wird das Feld einfach nicht ausgefüllt.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">with&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\D/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/\s+/&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">sort&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">arr&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">arr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">length&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;gt;=&amp;lt;= +&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">arr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34; +&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">arr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;= +&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">arr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anschließend verschieben wir die neue Spalte an das Ende.&lt;/p>
&lt;h4 id="entstehungszeitraum-anm">Entstehungszeitraum, Anm.&lt;/h4>
&lt;p>Hier können wir direkt die Spalte Laufzeit umbennen und an das Ende verschieben.&lt;/p>
&lt;h4 id="beklagte">Beklagte&lt;/h4>
&lt;p>Diese Spalte übernehmen wir direkt so und verschieben sie an das Ende.&lt;/p>
&lt;h4 id="bemerkung">Bemerkung&lt;/h4>
&lt;p>In dieser Spalte fassen wir die Spalten Vorinstanzen und Hinweise zusammen.
Hier gibt es mehrere Möglichkeiten die Spalten zusammen zu fassen.&lt;/p>
&lt;h5 id="technische-variante">Technische Variante&lt;/h5>
&lt;p>Bei der ersten, technischeren Variante erstellen wir eine neue Spalte basierend auf der Spalte Vorinstanzen und fügen dabei den Wert der Spalte Hinweise hinzu.
Dabei ist zu beachten, dass wir die Werte nur verwenden, wenn sie auch vorhanden sind &lt;code>isNonBlank&lt;/code>.
Sonst kommt es zu einem Fehler und die Zielspalte bleibt leer, wenn zum Beispiel für einen Eintrag nur die Vorinstanzen belegt sind.&lt;/p>
&lt;p>Von der Spalte Vorinstanzen ausgehend erzeugen wir eine neue Spalte Bemerkung mit folgender &amp;ldquo;Expression&amp;rdquo;:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isNonBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Vorinstanzen, Anfangsjahr:\n&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isNonBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Hinweise&amp;#34;&lt;/span>&lt;span class="p">]),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;\n\nHinweise: &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Hinweise&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anschließend löschen wir die Spalten Vorinstanzen und Hinweise und verschieben die neue Spalte Bemerkung an das Ende.&lt;/p>
&lt;h5 id="weniger-technische-variante">Weniger technische Variante&lt;/h5>
&lt;p>Bei der weniger technischen Variante transformieren wir zuerst die Spalte Vorinstanzen:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isNonBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Vorinstanzen, Anfangsjahr:\n&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dann transformieren wir die Spalte Hinweise:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isNonBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Hinweise&amp;#34;&lt;/span>&lt;span class="p">]),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;\n\nHinweise: &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Hinweise&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anschließend verbinden wir die beiden Spalten via &amp;ldquo;Vorinstanzen&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Edit column&amp;quot;
&lt;i class="fas fa-caret-right pr-1 fa-fw">&lt;/i>&amp;quot;Join columns&amp;hellip;&amp;rdquo;.
Dabei können wir die Original Spalten Vorinstanzen und Hinweise auch gleich löschen. Siehe dazu Abbildung 13.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-einstellungen-zum-verbinden-der-spalten-vorinstanzen-und-hinweise-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Einstellungen zum Verbinden der Spalten Vorinstanzen und Hinweise in OpenRefine." srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-join-columns_hu758a7a4d0dc133cf90137b645178b4fb_32557_7c1eccb8bff53265486780fb516c4cfd.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-join-columns_hu758a7a4d0dc133cf90137b645178b4fb_32557_7cb4b95f9772b3349d54f79fef805e97.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-join-columns_hu758a7a4d0dc133cf90137b645178b4fb_32557_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-join-columns_hu758a7a4d0dc133cf90137b645178b4fb_32557_7c1eccb8bff53265486780fb516c4cfd.webp"
width="760"
height="433"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Einstellungen zum Verbinden der Spalten Vorinstanzen und Hinweise in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Die neue Spalte Bemerkung schieben wir an das Ende.&lt;/p>
&lt;h4 id="enthält">Enthält&lt;/h4>
&lt;p>Hier fassen wir die Spalten Gegenstand, Darin und Prokuratoren zusammen.&lt;/p>
&lt;p>Von der Spalte Gegenstand ausgehend erzeugen wir eine neue Spalte Enthält mit folgender &amp;ldquo;Expression&amp;rdquo;:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isNonBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Gegenstand materiell:\n &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isNonBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Darin&amp;#34;&lt;/span>&lt;span class="p">]),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;\n\nDarin:\n&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Darin&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isNonBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Prokuratoren&amp;#34;&lt;/span>&lt;span class="p">]),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;\n\nProkuratoren mit Bevollmächtigungsjahr:\n&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Prokuratoren&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Die Spalten Gegenstand, Darin und Prokuratoren löschen wir anschließend und die neue Spalte Enthält verschieben wir an das Ende.&lt;/p>
&lt;h4 id="gegenstand-1">Gegenstand&lt;/h4>
&lt;p>Hier können wir direkt die Spalte Prozessart umbennen und an das Ende verschieben.&lt;/p>
&lt;h4 id="umfang-1">Umfang&lt;/h4>
&lt;p>Wir haben uns dazu entschlossen den Umfang und die Stapelhöhe in einem Feld zu erfassen und führen sie daher wieder zusammen.&lt;/p>
&lt;p>Um uns das Umbenennen der Spalte Umfang zu sparen, transformieren wir die Spalte anstatt eine neue Spalte zu erzeugen.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">value&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">isNonBlank&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Stapelhöhe&amp;#34;&lt;/span>&lt;span class="p">]),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;\n&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">cells&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Stapelhöhe&amp;#34;&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nx">trim&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Anschließend löschen wir die Spalte Stapelhöhe und verschieben die Spalte Umfang an das Ende.
Die Daten sind nun in ihrem Zielformat und sind in Abbildung 14 abgebildet.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-bereinigten-daten-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der bereinigten Daten in OpenRefine." srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-daten-uebersicht-db_hue1a572288dee0ca50ad4409666b23711_91382_8d34b872be45e366760a417dfb944af9.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-daten-uebersicht-db_hue1a572288dee0ca50ad4409666b23711_91382_dcfd3271ec79aa08cc6a8e4577e122b2.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-daten-uebersicht-db_hue1a572288dee0ca50ad4409666b23711_91382_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-daten-uebersicht-db_hue1a572288dee0ca50ad4409666b23711_91382_8d34b872be45e366760a417dfb944af9.webp"
width="760"
height="398"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der bereinigten Daten in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;h3 id="export-1">Export&lt;/h3>
&lt;p>Die Daten werden nun über &amp;ldquo;Export&amp;quot;
&lt;i class="far fa-caret-square-down pr-1 fa-fw">&lt;/i>&amp;quot;Custom tabular exporter…&amp;rdquo; als CSV-Datei exportiert.
Die Einstellungen sind in Abbildung 15 gezeigt.&lt;/p>
&lt;figure id="figure-bildschirmfoto-der-einstellungen-für-den-export-in-openrefine">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Bildschirmfoto der Einstellungen für den Export in OpenRefine." srcset="
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-export-csv-custom_hub1a00db0525c7e9d5f3154d003b99d65_19895_ca6e5b88091033b235a194d224210831.webp 400w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-export-csv-custom_hub1a00db0525c7e9d5f3154d003b99d65_19895_cf351030337c0f371e9ced3ac7324495.webp 760w,
/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-export-csv-custom_hub1a00db0525c7e9d5f3154d003b99d65_19895_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://fdmlab.landesarchiv-bw.de/post/2021-07-findbuecher-mit-openrefine-in-datenbank-uebernehmen/openrefine-export-csv-custom_hub1a00db0525c7e9d5f3154d003b99d65_19895_ca6e5b88091033b235a194d224210831.webp"
width="760"
height="363"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption data-pre="Abbildung&amp;nbsp;" data-post=":&amp;nbsp;" class="numbered">
Bildschirmfoto der Einstellungen für den Export in OpenRefine.
&lt;/figcaption>&lt;/figure>
&lt;p>Wir verwenden den &amp;ldquo;Custom tabular exporter&amp;rdquo;, da bei uns häufig Excel zum Inspizieren der Daten verwendet wird.
Excel erwartet bei CSV-Dateien jedoch ein Semikolon &lt;code>;&lt;/code> als Trennzeichen und &lt;code>iso-8859-1&lt;/code> als Kodierung.&lt;/p>
&lt;blockquote>
&lt;p>💾 Die Datei mit den strukturierten Daten für den Datenbank Import:&lt;/p>
&lt;/blockquote>
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/rkg-57/akten-rkg-band-57-wertheim-db.csv" target="_blank">
&lt;i class="fas fa-file-csv pr-1 fa-fw">&lt;/i>Inventar Akten RKG Band 57 - Wertheim als CSV für Datenbank Import&lt;/a>
.
>
> 💾 Die einzelnen Arbeitsschritte im OpenRefine Format:
&lt;a href="https://fdmlab.landesarchiv-bw.de/data/rkg-57/akten-rkg-band-57-wertheim-openrefine-db.json" target="_blank">
&lt;i class="fas fa-file-archive pr-1 fa-fw">&lt;/i>Inventar Akten RKG Band 57 - Wertheim als OpenRefine Arbeitsschritte&lt;/a>
.
&lt;h2 id="fazit">Fazit&lt;/h2>
&lt;p>Wir haben mit OpenRefine ein komplettes, textbasiertes Findbuch in ein für den Datenbankimport kompatibles Format umgewandelt.
Dabei haben wir auf komplexe Code-Schleifen und Bedingungen verzichtet und dafür mehr manuelle Schritte vorgenommen.&lt;/p>
&lt;p>Die Fähigkeit von OpenRefine Änderungen an Daten und die Wirkung von Transformationen quasi live anzuzeigen, erlaubt es auch Einsteigern schnelle Fortschritte zu erzielen.
Mit den Erklärungen und dem Aufzeigen unterschiedlicher Lösungen haben wir Strategien aufgezeigt, die sich auf ähnliche Probleme übertragen lassen.&lt;/p>
&lt;p>Wir konnten zeigen, dass sich mit OpenRefine auch Texte in tabellenartige Formate transformieren lassen.
Es bleibt die Herausforderung passende Muster (reguläre Ausdrücke) zu finden, die es ermöglichen die Daten aus den Texten passend herauszufiltern.&lt;/p></description></item></channel></rss>