Ergänzungen Kapitel 3 nach Lehrveranstaltung

This commit is contained in:
Felix Lohmeier 2017-11-03 02:45:41 +01:00
parent c34c84ce27
commit 26b810e1e6
13 changed files with 210 additions and 112 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
images/systemressourcen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -7,13 +7,12 @@
Das obige Bild zeigt den Datenfluss vom Abruf externer Daten über eine Schnittstelle bis hin zur Bereitstellung dieser Daten in einem Discovery-System. Das wollen wir bauen und so gehen wir vor:
* Wir laden heute eine Reihe von Testdaten aus Bibliothekssystemen über die SRU-Schnittstelle von Swissbib \(Kap 3.3\). Diese Daten transformieren wir mit OpenRefine von MARC21/XML in das Tabellenformat TSV \(Kap. 3.5\).
* In Kapitel 4 \(16.11.17\) werden wir den Suchindex Apache Solr installieren, kennenlernen, ein Datenmodell für eine Meta-Suche modellieren und dann die Testdaten als TSV indexieren.
* In Kapitel 5 \(30.11.17\) werden wir schließlich das Content-Management-System TYPO3 mit der Erweiterung TYPO3-find installieren und unsere eigene Katalogoberfläche konfigurieren.
* In [Kapitel 4](/kapitel-4.md) \(16.11.17\) werden wir den Suchindex Apache Solr installieren, kennenlernen, ein Datenmodell für eine Meta-Suche modellieren und dann die Testdaten als TSV indexieren.
* In [Kapitel 5](/kapitel-5.md) \(30.11.17\) werden wir schließlich das Content-Management-System TYPO3 mit der Erweiterung TYPO3-find installieren und unsere eigene Katalogoberfläche konfigurieren.
Danach haben wir noch zwei Kapitel Zeit, um entweder...
1. mit der gleichen Software weitere Datenquellen zu integrieren \(insbesondere aus Archivsystemen\) und das Datenmodell und das Relevanzranking daraufhin anzupassen,
2. oder das Discovery-System VuFind zu installieren, kennenzulernen und mit den enthaltenen Tools den obigen "händischen" Gesamtworkflow noch einmal professioneller aufzubauen.
Abschließend werden wir in jedem Fall noch lernen wie wir selbst Schnittstellen bereitstellen und wie wir uns mit der Linked Data Cloud verbinden können.
1. mit der gleichen Software weitere Datenquellen zu integrieren \(insbesondere aus Archivsystemen\) und das Datenmodell sowie das Relevanzranking daraufhin anzupassen,
2. oder das Discovery-System [VuFind](https://vufind.org) zu installieren, kennenzulernen und mit den enthaltenen Tools den obigen "händischen" Gesamtworkflow noch einmal professioneller aufzubauen.
In jedem Fall werden wir abschließend noch lernen, wie wir selbst Schnittstellen bereitstellen und wie wir uns mit der Linked Data Cloud verbinden können.

View File

@ -6,16 +6,16 @@ Es gibt zahlreiche Übertragungsprotokolle im Bibliotheks- und Archivbereich. Dr
* [SRU](http://www.loc.gov/standards/sru/) - Search/Retrieve via URL \(Library of Congress\)
* [OAI-PMH](https://www.openarchives.org/pmh/) - Open Archives Initiative Protocol for Metadata Harvesting \(Open Archives Initiative\)
Z39.50 ist sehr alt, aber immer noch im Einsatz. Meist wird das moderne SRU als Ergänzung angeboten.
Z39.50 ist sehr alt, aber immer noch im Einsatz. Meist wird das modernere SRU als Ergänzung angeboten.
Während Z39.50 und SRU sich besonders für Live-Abfragen oder gezielte Suchabfragen eignet, zielt OAI-PMH vor allem auf größere Datenabzüge und regelmäßige Aktualisierungen. Das Schöne an SRU und OAI-PMH ist, dass die Anfragen wie eine URL zusammengestellt werden können und direkt über den Browser ohne Zusatzsoftware aufrufbar sind.
Während Z39.50 und SRU sich besonders für Live-Abfragen oder gezielten Datenabruf mit vielen Parametern eignet, zielt OAI-PMH vor allem auf größere Datenabzüge und regelmäßige Aktualisierungen. Das Schöne an SRU und OAI-PMH ist, dass die Anfragen als Internetadresse (URL) zusammengestellt werden können und direkt über den Browser ohne Zusatzsoftware aufrufbar sind.
Bevor wir konkrete Testdaten für unser "Wissensportal" herunterladen, wollen wir die Möglichkeiten der Schnittstellen kennenlernen. Wir orientieren uns an dem Schweizer Projekt Swissbib, das öffentliche Schnittstellen nach SRU und OAI-PMH bereitstellt und diese auch gut dokumentiert hat:
Bevor wir konkrete Testdaten für unser "Wissensportal" herunterladen, wollen wir zunächst die Möglichkeiten der Schnittstellen erkunden. Wir orientieren uns an dem Schweizer Projekt Swissbib, das öffentliche Schnittstellen nach SRU und OAI-PMH bereitstellt und diese auch gut dokumentiert hat:
* Dokumentation OAI: [http://www.swissbib.org/wiki/index.php?title=Swissbib\_oai](http://www.swissbib.org/wiki/index.php?title=Swissbib_oai)
* Dokumentation SRU: [http://www.swissbib.org/wiki/index.php?title=SRU](http://www.swissbib.org/wiki/index.php?title=SRU)
* Dokumentation OAI: [http://www.swissbib.org/wiki/index.php?title=Swissbib\_oai](http://www.swissbib.org/wiki/index.php?title=Swissbib_oai)
Bitte schauen Sie sich dort um und lösen Sie die folgenden Aufgaben. Zum Laden und Speichern der Daten über die Kommandozeile können Sie wieder das Programm `curl` nutzen, dass Sie in [Kapitel 1.5]() kennengelernt haben.
Bitte schauen Sie sich dort um und lösen Sie die folgenden Aufgaben. Zum Laden und Speichern der Daten über die Kommandozeile können Sie wieder das Programm `curl` nutzen, dass Sie in [Kapitel 1.5]() kennengelernt haben. Um die Aufgaben vollständig lösen zu können, müssen Sie die Dokumentation genau lesen und etwas stöbern.
## Aufgabe 1
@ -27,19 +27,18 @@ Laden Sie einige Datensätze aus dem gesamten Swissbib-Verbund, die seit dem 31.
## Bonusaufgabe
Finden Sie heraus, nach welchen Regeln Swissbib MARC21 in Dublin Core transformiert.
Finden Sie heraus, nach welchen Regeln die SRU-Schnittstelle von Swissbib MARC21 in Dublin Core transformiert.
## Lösungen
Die Lösungen für die obigen Aufgaben und alle weiteren Aufgaben im Skript sind auf der Seite [Lösungen](/losungen.md) dokumentiert.
Die Lösungen für die obigen Aufgaben sind auf der Seite [Lösungen](/losungen.md) dokumentiert.
## Aktuelle Entwicklungen
[Resourcesync](http://www.openarchives.org/rs/) ist ein vielversprechender neuer Standard, der schnellere und spezifischere Synchronisierungen ermöglicht, als es mit OAI-PMH möglich ist. Aktuell ist der Standard noch selten im Einsatz, könnte aber auf längere Sicht OAI-PMH wirksam ergänzen und irgendwann vielleicht ablösen. Es gibt Referenzimplementierungen in Python für [Data Provider](https://github.com/resourcesync/py-resourcesync) und für [Harvester](https://github.com/resync/resync).
[Resourcesync](http://www.openarchives.org/rs/) ist ein vielversprechender neuer Standard, der schnellere und spezifischere Synchronisierungen ermöglicht, als es mit OAI-PMH möglich ist. Aktuell ist Resourcesync noch selten im Einsatz, wird aber in nächster Zeit als Ergänzung zu OAI-PMH immer öfter anzutreffen sein und könnte OAI-PMH auf längere Sicht vielleicht sogar ablösen. Es gibt Referenzimplementierungen in Python für [Data Provider](https://github.com/resourcesync/py-resourcesync) und für [Harvester](https://github.com/resync/resync).
Grundlegende Informationen und aktuelle Anwendungen sind der folgenden Präsentation zu entnehmen:
> Martin Klein, Gretchen Gueguen, Mark Matienzo, Petr Knoth \(20.4.2017\): ResourceSync - Overview and Real-World Use Cases for Discovery, Harvesting, and Synchronization of Resources on the Web. Präsentation auf DPLAfest 2017. [https://www.slideshare.net/martinklein0815/resourcesync-overview-and-realworld-use-cases-for-discovery-harvesting-and-synchronization-of-resources-on-the-web](https://www.slideshare.net/martinklein0815/resourcesync-overview-and-realworld-use-cases-for-discovery-harvesting-and-synchronization-of-resources-on-the-web)
Ein ganz anderes Feld sind die vielfältigen Linked Data Schnittstellen. Damit werden wir uns später in [Kapitel 7](/kapitel-7.md) \(11.01.18\) beschäftigen.
Ein ganz anderes Feld sind die vielfältigen Linked Data Schnittstellen. Damit werden wir uns später in [Kapitel 7](/kapitel-7.md) \(11.01.18\) beschäftigen.

View File

@ -1,13 +1,18 @@
# 3.3 Testdaten über SRU herunterladen
Als Testdaten laden wir zunächst alles was der NEBIS-Verbund zum Suchbegriff `Albert Einstein` über alle Felder zu bieten hat \(etwa 2000 Treffer\):
Wir nutzen die [SRU-Schnittstelle von Swissbib](http://www.swissbib.org/wiki/index.php?title=SRU).
## Auswahl der Testdaten
Als Testdaten laden wir zunächst alles, was der NEBIS-Verbund für eine Suche nach `Albert Einstein` über alle Felder zu bieten hat \(etwa 2000 Treffer\):
* Suche im Katalog von Swissbib: [https://www.swissbib.ch/Search/Results?lookfor=albert+einstein&type=AllFields&filter%5B%5D=%7Eunion%3A%22NEBIS%22](https://www.swissbib.ch/Search/Results?lookfor=albert+einstein&type=AllFields&filter[]=~union%3A"NEBIS")
* Abfrage der SRU-Schnittstelle:
`http://sru.swissbib.ch/sru/search/defaultdb?query=+dc.anywhere+%3D+Albert+Einstein+AND+dc.xNetwork+%3D+NEBIS&operation=searchRetrieve&recordSchema=info%3Asrw%2Fschema%2F1%2Fmarcxml-v1.1-light&maximumRecords=100&startRecord=0&recordPacking=XML&availableDBs=defaultdb&sortKeys=Submit+query`
* Abfrage der SRU-Schnittstelle: <http://sru.swissbib.ch/sru/search/defaultdb?query=+dc.anywhere+%3D+Albert+Einstein+AND+dc.xNetwork+%3D+NEBIS&operation=searchRetrieve&recordSchema=info%3Asrw%2Fschema%2F1%2Fmarcxml-v1.1-light&maximumRecords=100&startRecord=0&recordPacking=XML&availableDBs=defaultdb&sortKeys=Submit+query>
Hier ist die Postkarte von Albert Einstein an Alfred Stern aus [Kapitel 2.2](//kapitel-2/22_datenstruktur-von-archivsystemen.md) übrigens nicht dabei. Die Daten aus e-manuscripta.ch laden wir erst später in [Kapitel 6](/kapitel-6.md) als separate Datenquelle.
## Abfrage der SRU-Schnittstelle mit einem Shell-Script
Die SRU-Schnittstelle lässt maximal 100 Records pro Abfrage zu, d.h. die Daten müssen in Teilen abgefragt werden:
1. `startRecord=0&maximumRecords=100`
@ -22,5 +27,15 @@ Bitte geben Sie die folgenden Befehle in die Kommandozeile ein:
* Script ausführbar machen: `chmod +x sru-download.sh`
* Script starten mit `./sru-download.sh`
Das Script lädt nun die Daten in 100er Paketen und speichert sie als XML-Dateien im Ordner ```Downloads```.
## Optional: Individuelle Testdaten laden
Wenn Sie sich eher für Harry Potter als für Albert Einstein interessieren, dann können Sie das Shell-Script anpassen. Öffnen Sie die Datei ```sru-download.sh``` mit einem Texteditor (hier: Anwendungen / Zubehör / Pluma Text Editor) und bearbeiten Sie die folgenden Zeilen:
* Zeile 8: ```query="dc.anywhere+%3D+Albert+Einstein+AND+dc.xNetwork+%3D+NEBIS"``` ersetzen durch ```query="dc.anywhere+%3D+Harry+Potter+AND+dc.xNetwork+%3D+NEBIS"```
* Zeile 11: ```filename="einstein-nebis"``` ersetzen durch ```filename="potter-nebis"```
Sie können sich übrigens auch über die Oberfläche von <http://sru.swissbib.ch> eine beliebige Suchanfrage zusammenstellen. Nach einem Klick auf "Submit Query" erhalten Sie die Ergebnisse und können aus der Adresszeile des Browsers den betreffenden Abschnitt kopieren und in das Shell-Script Zeile 8 einfügen.
Wenn Sie mehr über die Programmierung von Shell-Scripten erfahren wollen, finden Sie Informationen im sehr empfehlenswerten [Bash-Skripting-Guide für Anfänger](https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_f%C3%BCr_Anf%C3%A4nger/).

View File

@ -4,19 +4,28 @@ Bevor wir die im vorigen Abschnitt heruntergeladenen MARC21-Daten verarbeiten, s
Für OpenRefine gibt es eine [riesige Fülle von Tutorials](https://github.com/OpenRefine/OpenRefine/wiki/External-Resources), die den Einstieg erleichtern. Um die Funktionsweise kennenzulernen, ist es am einfachsten eins dieser Tutorials durchzuarbeiten.
## Aufgabe: Tutorial "Cleaning Data with OpenRefine" durcharbeiten
Wir bearbeiten jetzt das folgende selbsterklärende Tutorial:
> Seth van Hooland, Ruben Verborgh and Max De Wilde \(2013-08-05\): "Cleaning Data with OpenRefine" In: Programming Historian. [http://programminghistorian.org/lessons/cleaning-data-with-openrefine](http://programminghistorian.org/lessons/cleaning-data-with-openrefine)
## Hinweise zur Arbeit mit dem Tutorial
Rufen Sie sich das Tutorial im Browser auf und starten dann OpenRefine. So können Sie zwischen den Browsertabs komfortabel hin und her schalten.
Die im Tutorial benannte Ausgangsdatei `phm-collection.tsv` ist unter folgender Adresse erreichbar: [http://data.freeyourmetadata.org/powerhouse-museum/phm-collection.tsv](http://data.freeyourmetadata.org/powerhouse-museum/phm-collection.tsv)
Falls Sie sich nicht mehr gut an OpenRefine erinnern, schauen Sie sich die Erläuterungen in [Kapitel 1.6 Metadaten ansehen mit OpenRefine](/kapitel-1/16-metadaten-ansehen-mit-openrefine.md) noch einmal an. Hier der Startbefehl:
Wir verwenden die neue OpenRefine Version 2.7, die andere Standardeinstellungen hat, daher ist **abweichend vom Tutorial** folgende Einstellung beim Import der TSV-Datei vorzunehmen:
```
~/openrefine-2.7/refine
```
Die im Tutorial benannte Ausgangsdatei `phm-collection.tsv` können Sie unter folgender Adresse herunterladen: [http://data.freeyourmetadata.org/powerhouse-museum/phm-collection.tsv](http://data.freeyourmetadata.org/powerhouse-museum/phm-collection.tsv)
## Wichtiger Hinweis zur Arbeit mit dem Tutorial
Wir verwenden die neue OpenRefine Version 2.7, die andere Standardeinstellungen hat. Daher ist **abweichend vom Tutorial** folgende Einstellung beim Import der TSV-Datei vorzunehmen:
* Checkbox bei "_Parse cell text into numbers, dates, ..._" aktivieren
Die Checkbox bei "_Quotation marks are used to enclose cells containing column separators_" muss deaktiviert werden, das steht so aber auch im Tutorial.
[![](/images/tutorial-openrefine-import.png)](https://raw.githubusercontent.com/felixlohmeier/kurs-bibliotheks-und-archivinformatik/master/images/tutorial-openrefine-import.png)
[![](/images/tutorial-openrefine-import.png)](https://raw.githubusercontent.com/felixlohmeier/kurs-bibliotheks-und-archivinformatik/master/images/tutorial-openrefine-import.png)

View File

@ -1,6 +1,6 @@
# 3.5 Verarbeitung von MARC21 mit OpenRefine
Ein möglicher Weg zum Laden von Metadaten in den Suchindex Solr ist die Transformation der umfangreichen bibliothekarischen Metadaten in eine klassische Tabellenstruktur mit wenigen Spalten, in denen wir die für die Suche relevanten Daten zusammenführen:
Ein möglicher Weg zum Laden von Metadaten in den Suchindex Solr ist die Transformation der umfangreichen bibliothekarischen Metadaten in eine klassische Tabellenstruktur mit wenigen Spalten, in denen wir die für die Suche relevante Daten zusammenführen:
* Spaltenüberschriften werden zu Feldern im Suchindex
* Mehrere Werte in einer Tabellenzelle können mit einem Trennzeichen eingegeben werden \(das Trennzeichen muss eindeutig sein, darf also nicht bereits in den Daten vorkommen\)
@ -14,11 +14,11 @@ Nach der Transformation könnten die Daten beispielsweise so aussehen:
| 299 | Albert Einstein | Ziegelmann, Horst␟Fischer, Ernst Peter␟Renn, Jürgen | ... |
| ... | ... | ... | ... |
Natürlich könnten wir auch mit einem anderen Werkzeug \(z.B. XSLT\) direkt XML transformieren und anschließend auch direkt als XML indexieren, aber Tabellendaten sind eben einfach besonders übersichtlich und in dieser Struktur fallen Ungereimtheiten in den Daten sofort ins Auge. Für unsere erste Datenquelle im Discovery-System also eine gute Übung.
Natürlich könnten wir auch mit einem anderen Werkzeug \(z.B. XSLT\) die Dateien direkt als XML transformieren und in den Suchindex laden, aber Tabellendaten sind eben einfach besonders übersichtlich und in dieser Struktur fallen Ungereimtheiten in den Daten sofort ins Auge. Für unsere erste Datenquelle im Discovery-System also eine gute Übung.
## Eigenes Schema oder einem Metadatenstandard folgen?
Es ist sicher klar, dass wir nicht die umständlichen MARC-Zahlen und Codes als Spaltennamen übernehmen wollen, sondern sprechende Namen wie TItel, AutorInnen usw. nutzen wollen. Doch welche Daten brauchen wir in welcher Form für den Katalog?
Es ist sicher klar, dass wir nicht die umständlichen MARC-Zahlen und Codes als Spaltennamen in unseren Katalog übernehmen wollen, sondern sprechende Namen wie TItel, AutorInnen und so weiter. Doch welche Daten brauchen wir in welcher Form für den Katalog?
Überlegen Sie:
@ -28,112 +28,104 @@ Es ist sicher klar, dass wir nicht die umständlichen MARC-Zahlen und Codes als
* Welche Kurzinformationen \(Unterscheidungsmerkmale\) sollen in der Trefferliste stehen?
* Welche Informationen sollen in der Vollanzeige dargestellt werden?
Wenn Sie ein innovatives Discovery-System auf Basis von verschiedenen heterogenen Datenquellen bauen wollen, dann kann auch die absichtliche Reduktion auf wenige Felder helfen \("Simplicity"\). Wichtig für das Nutzererlebnis \("User Experience"\) ist, dass die Felder konsistent belegt sind und Trefferliste und Facetten nützliche und eindeutige Unterscheidungsmerkmale beinhalten. Bei der Datentransformation haben Sie die Chance einige Unstimmigkeiten zu bereinigen und Informationen clever zu aggregieren, so dass die Datenquellen einigermaßen einheitlich durchsuchbar sind.
Wenn Sie ein innovatives Discovery-System auf Basis von verschiedenen heterogenen Datenquellen bauen wollen, dann kann auch die absichtliche Reduktion auf wenige Felder helfen \("Simplicity"\). Wichtig für das Nutzererlebnis \("User Experience"\) ist, dass die Felder konsistent belegt sind und Trefferliste und Facetten nützliche und eindeutige Unterscheidungsmerkmale beinhalten. Bei der Datentransformation haben Sie die Chance einige Unstimmigkeiten zu bereinigen und Informationen clever zu aggregieren, so dass die Daten trotz verschiedener Quellen einigermaßen einheitlich durchsuchbar sind.
Haben Sie eigene Vorstellungen? Falls nicht, dann orientieren Sie sich an [Dublin Core](http://dublincore.org/documents/dces/), denn diese Initiative hatte von Beginn an das Ziel, einen gemeinsamen Mindeststandard zu definieren und entsprechend übersichtlich sind die Felder. Wenn Sie noch nicht mit MARC gearbeitet haben und die passenden Zahlen und Codes nicht im Kopf haben, dann folgen Sie einfach der [Empfehlung der Library of Congress für einen "MARC to Dublin Core Crosswalk"](https://www.loc.gov/marc/marc2dc.html).
Haben Sie eigene Vorstellungen? Falls nicht, dann orientieren Sie sich an [Dublin Core](http://dublincore.org/documents/dces/), denn diese Initiative hatte von Beginn an das Ziel, einen gemeinsamen Mindeststandard zu definieren und entsprechend übersichtlich sind die Felder. Wenn Sie noch nicht mit MARC gearbeitet haben und die passenden Zahlen und Codes nicht im Kopf haben, dann orientieren Sie sich an der [Empfehlung der Library of Congress für einen "MARC to Dublin Core Crosswalk"](https://www.loc.gov/marc/marc2dc.html).
## Anleitung zur Transformation von MARC21 mit OpenRefine
## Aufgabe 1: Testdaten importieren und zur weiteren Bearbeitung umstrukturieren
JSON-Transformationsregeln für Schritte 2 bis 5: [openrefine-marc.json](https://raw.githubusercontent.com/felixlohmeier/kurs-bibliotheks-und-archivinformatik/master/openrefine/openrefine-marc.json)
### Arbeitsspeicher für OpenRefine freigeben
### Step 1: Import MARC files
Für das Laden und Transformieren der 2075 Beispieldatensätze benötigt OpenRefine etwa 1,5 GB Arbeitsspeicher. Als Standardeinstellung verwendet OpenRefine jedoch maximal 1,4 GB Arbeitsspeicher. Wenn während der Transformation der Speicher ausgeht, wird OpenRefine erst sehr langsam und stürzt dann irgendwann ab.
Two options:
Wieviel freien Arbeitsspeicher Sie zur Verfügung haben, bestimmen Sie am besten, indem Sie alle Fenster bis auf den Browser schließen und dann in der Kommandozeile den Befehl ```free -m``` eingeben. In der Spalte "verfügbar" können Sie ablesen, wieviel MB maximal noch zur Verfügung stehen.
* Option 1: Import marcxml \(.marcxml, .xml\) as XML files
* Option 2: Import binary marc \(.mrc\) as MARC files
![Screenshot](../images/systemressourcen.png)
Parsing options for each option:
Ziehen Sie von diesem Wert zur Sicherheit mindestens 300 MB ab. Das Ergebnis ist der Höchstwert, den Sie OpenRefine zuordnen können.
* Click on `<record>` xml element
Um jetzt das Limit zu erhöhen, bearbeiten wir die Einstellungsdatei von OpenRefine. Öffnen Sie die Datei ```refine.ini``` mit einem Texteditor (hier: Anwendungen / Zubehör / Pluma Text Editor) und ändern Sie den Wert in der Zeile ```REFINE_MEMORY=1400M``` auf ```2000M``` und speichern Sie die Datei (```STRG``` und ```S```).
Columns should look like this:
Wenn Sie über genügend freien Arbeitsspeicher verfügen, können Sie auch gleich ein höheres Limit setzen. Falls Sie nicht genügend freien Arbeitsspeicher haben, um das Limit zu erhöhen, dann bleibt Ihnen nichts anderes übrig als die Anzahl der zu verarbeitenden Daten zu reduzieren. Sie könnten im Folgenden beispielsweise nur einen Teil der heruntergeladenen XML-Dateien importieren.
1. record
2. record - datafield
3. record - datafield - tag
4. record - datafield - ind2
5. record - datafield - ind1
6. record - datafield - subfield
7. record - datafield - subfield - code
8. record - controlfield
9. record - controlfield - tag
10. record - leader
Weitere Informationen: <https://github.com/OpenRefine/OpenRefine/wiki/FAQ:-Allocate-More-Memory#linux-or-mac>
Attention: These column names will be used in the following steps. Rename columns now if they differ from the above list.
### Daten importieren
### Step 2: Create records
* Im Menüpunkt "Create Project" auf den Button "Durchsuchen" klicken, in den Ordner Downloads wechseln und alle der im vorigen Kapitel gespeicherten XML-Dateien (```einstein-nebis```...) auswählen. Mehrere Dateien können Sie, wie sonst auch üblich, mit der Taste Shift markieren (oberste XML-Datei anklicken, Shift gedrückt halten und unterste XML-Datei anklicken). Das Protokoll zum Download (Dateiendung ```.log```) können wir nicht gebrauchen.
* Select row mode \(show as: rows\)
* Delete columns "record" and "record - datafield"
* Move column "record - leader" to the beginning
* Im nächsten Bildschirm könnten Sie von den ausgewählten Dateien noch wieder welche abwählen. Das ist aber nicht nötig. Klicken Sie gleich weiter oben rechts auf den Button "Configure Parsing Options".
[http://kb.refinepro.com/2012/06/create-records-in-google-refine.html](http://kb.refinepro.com/2012/06/create-records-in-google-refine.html)
* Im letzten Bildschirm können Sie nun Einstellungen vornehmen, wie die XML-Dateien von OpenRefine interpretiert werden sollen. Gehen Sie wie folgt vor:
### Step 3: Extract data from controlfields
* Klicken Sie als erstes im Vorschaubildschirm auf den Pfad ```<record xmlns:xs="http://www.w3.org/2001/XMLSchema">```. Es ist wichtig genau diese Stelle zu treffen. Wenn Sie mit der Maus darüber fahren, wird ein Kasten angezeigt, welche Daten OpenRefine als einen Datensatz interpretieren wird.
![Screenshot](../images/openrefine-import-marc-xml.png)
* Transform on column "record - controlfield" `cells["record - controlfield - tag"].value + "␟" + value`
* Delete column "record - controlfield - tag"
* Join multi-valued cells in column "record - controlfield" with separator `␞` \(this will delete blank rows too\)
* Add column "tmp" based on column "record - leader" with expression `""`
* Transpose cells across columns from "record - leader" to "tmp" into one column "leader" with fill down in other columns
* Blank down column "record - controlfield"
* Split column "record - controlfield" into several columns by separator `␞`
* Facet rows without blanks in column "leader" and blank out cells in columns "record - datafield -ind1", "record - datafield -ind2" and "record - datafield - subfield - code"
* Transpose cells across columns from "record - controlfield 1" to "\(last column\)" into one column "tmp"
* Transform on column "record - datafield - tag" with expression `cells["tmp"].value.split("␟")[0]`
* Transform on column "record - datafield - subfield" with expression `cells["tmp"].value.split("␟")[1]`
* Delete column "tmp"
* Nehmen Sie dann folgende weiteren Einstellungen vor:
### Step 4: Create index
* Checkbox "Store file source" deaktivieren
* Im Textfeld "Project Name" den hinteren Teil hinter dem Datum entfernen oder einen eigenen Namen vergeben
* Move column "leader" to the end
* Add column "index" based on column "record - datafield - tag" with expression `forNonBlank(value,v,row.record.index,null)`
* Move column "index" to the beginning
* Abschließend können Sie das neue OpenRefine-Projekt mit diesen Daten erstellen, indem Sie oben rechts den Button "Create Project" drücken.
[http://kb.refinepro.com/2012/06/creating-row-and-record-index.html](http://kb.refinepro.com/2012/06/creating-row-and-record-index.html)
### Daten prüfen
### Step 5: Fill down
Klicken Sie bei der Spalte "All" auf das Dreieck und wählen Sie im Menü den Punkt Edit columns / Re-order / remove columns... aus.
* Fill down \(the safe way\) in columns "record - datafield - ind1" and "record - datafield - ind2" with expression `row.record.cells["record - datafield - ind1"].value[0]` and `row.record.cells["record - datafield - ind2"].value[0]` respectively
* Fill down \(the easy way\) in column record - datafield - tag
* Move column "leader" to the beginning
So sollte die Spaltenstruktur aussehen:
[http://kb.refinepro.com/2012/03/fill-down-right-and-secure-way.html](http://kb.refinepro.com/2012/03/fill-down-right-and-secure-way.html)
![Screenshot](../images/openrefine-screenshot-reorder-columns.png)
### Step 6: Statistics
Achtung: Die weiteren Schritte beziehen sich auf diese Spaltennamen, daher müssen Ihre Spaltenbezeichnungen zwingend mit denen vom Screenshot übereinstimmen. Falls es bei Ihnen anders aussieht, ist beim Import etwas schiefgegangen.
### Daten "massieren"
Bevor wir inhaltlich mit den MARC21-Daten arbeiten können, müssen wir diese zunächst umformen. OpenRefine "versteht" MARC21 nicht, sondern lädt die Daten wie andere XML-Dateien.
Um die MARC21-Daten so umzustrukturieren, dass sie in dem flachen Tabellenformat von OpenRefine benutzbar sind, sind zahlreiche Transformationsschritte notwendig. Damit Sie diese nicht manuell durchführen müssen, nutzen wir ein vorbereitetes Transformationsscript.
1. Rufen Sie die Datei [openrefine-marc.json](https://raw.githubusercontent.com/felixlohmeier/kurs-bibliotheks-und-archivinformatik/master/openrefine/openrefine-marc.json) im Browser auf und kopieren Sie den gesamten Inhalt in die Zwischenablage (```STRG``` und ```A``` um alles zu markieren und ```STRG``` und ```C``` um es in die Zwischenablage zu kopieren)
2. Wechseln Sie in OpenRefine in den Tab "Undo / Redo" (neben "Facet / Filter" unterhalb des OpenRefine-Logos) und klicken Sie den Button "Apply...". Fügen Sie den Inhalt der Zwischenablage in das Textfeld ein (```STRG``` und ```V```) und bestätigen Sie mit dem Button "Perform Operations".
Die Verarbeitung kann je nach Menge der Daten ein paar Minuten dauern. Anschließend ist die Struktur schon etwas handlicher. Etwa so sollte es aussehen:
![Screenshot](../images/openrefine-marc-nach-massage.png)
## Aufgabe 2: MARC-Daten analysieren und neue Spalten für das Zielschema bilden
**Das Skript ist an dieser Stelle noch nicht vollständig ausgearbeitet. Hier eine kurze englische Anleitung, wie Sie vorgehen können. Eine ausführliche Erläuterung erfolgt spätestens bis zum 16.11.2017.**
### Statistik
* Text facet on column "record - datafield - tag"
* Try "Blank down" on column "record - datafield - tag" to see how many records include each MARC field
* Rollback with "Fill down" on column "record - datafield - tag" to see total number of MARC fields again
#### Step 7: Create columns
### Neue Spalten erstellen
##### A\) copy values to new columns
#### A\) Werte in neue Spalte kopieren
* Select row mode \(show as: rows\)
* Select values with text facets in "record - datafield - tag" and "record - datafield - subfield - code" \(example: tag 100 and codes a, d and q for authors\)
* Add column based on column "record - datafield - subfield" with expression `value`
#### B\) transform values in new columns
#### B\) Werte in neuer Spalte transformieren
* Normalize values in new column \(e.g. search/replace\)
* Add separators \(e.g. add brackets to birth dates: select tag 100 / code d and transform new column with expression `"(" + value + ")"`\)
#### C\) join values in each new column
#### C\) Werte in neuer Spalte zusammenführen
* Move column "leader" to the end
* Move column "index" to the beginning
* Join multi-valued cells in new column with separator ` ` \(space\)
#### Step 8: Join records
### Datensätze zusammenführen
* Move column "leader" to the beginning
* Join multi-valued cells in each new column with separator `␟`
#### Step 9: Export
* Use Export / Custom tabular exporter, select relevant columns and download file
### Daten exportieren
* Use Export / Custom tabular exporter, select relevant columns and download file

View File

@ -1,22 +1,13 @@
# 3.6 Bonus: Vergleich mit Crosswalk-Ergebnissen
Wir hätten auch auf den integrierten "Crosswalk" von Swissbib vertrauen und die Daten gleich als Dublin Core herunterladen können. Nach welchen Transformationsregeln hätte Swissbib das dann eigentlich generiert? In [Kapitel 3.2](/3.2) Aufgabe 3 hatten wir das XSL-Stylesheet von Swissbib gefunden: [http://sru.swissbib.ch/sru/xslfiles/MARC21slim2OAIDC.swissbib.xsl](http://sru.swissbib.ch/sru/xslfiles/MARC21slim2OAIDC.swissbib.xsl)
Wir hätten auch auf den integrierten "Crosswalk" von Swissbib vertrauen und die Daten gleich als Dublin Core herunterladen können. Nach welchen Transformationsregeln hätte Swissbib das dann eigentlich generiert?
Versuchen Sie das XSL-Stylesheet zu "lesen", auch wenn Sie die Sprache XSL nicht kennen sollten. Manche Abschnitte sind dank der XML-Struktur mit etwas Puzzelei auch so verständlich.
## Aufgabe
Folgende Regeln stehen \(leicht vereinfacht\) darin:
Versuchen Sie das [XSL-Stylesheet zur Transformation von MARC nach Dublin Core der SRU-Schnittstelle von Swissbib]((http://sru.swissbib.ch/sru/xslfiles/MARC21slim2OAIDC.swissbib.xsl)) zu "lesen", auch wenn Sie die Sprache XSL nicht kennen sollten. Manche Abschnitte sind dank der XML-Struktur mit etwas Puzzelei auch so verständlich.
* dc:id aus MARC 001
* dc:creator aus MARC 100, 110, 111, 700, 710, 711, 720
* dc:title aus MARC 245 a,b,f,g,h,k
* dc:type aus MARC 655 und aus leader
* dc:publisher aus MARC 260a und 260b
* dc:date aus MARC 260c
* dc:language aus MARC controlfield 008
* dc:format aus MARC 856q
* dc:description aus MARC 500a bis 599a \(ohne 506, 530, 540 und 546\)
* dc:subject aus MARC 600, 610, 611, 630, 650, 653, jeweils a,b,c,d,q
* dc:coverage aus MARC 752a, 752b, 752c, 752d
* dc:relation aus MARC 530a, 530b, 530c, 530d, 530u und aus 760, 762, 765, 767, 770, 772-777, 780, 785-787 jeweils o und t
* dc:identifier aus MARC 856u und 020a
* dc:rights aus MARC 506a, 540a
Notieren Sie welche Dublin-Core-Felder aus welchen MARC Nummern und Codes zusammengesetzt werden. Sie werden feststellen, dass dieser Crosswalk nicht in jedem Fall der [Empfehlung der Library of Congress]((https://www.loc.gov/marc/marc2dc.html)) folgt.
## Lösung
Einen Teil der Antwort finden Sie auf der Seite [Lösungen](/losungen.md).

View File

@ -10,14 +10,14 @@ OpenRefine verfügt über hilfreiche Undo/Redo-Funktionen, mit denen Sie auch al
Transformationsregeln extrahieren (altes Projekt):
* Oben links Menü Undo / Redo den Button Extract... drücken
* Alles im rechten Textfeld in die Zwischenablage kopieren (z.B. mit STRG+A und STRG+C)
* Oben links im Reiter "Undo / Redo" den Button "Extract..." drücken
* Alles im rechten Textfeld in die Zwischenablage kopieren (z.B. mit ```STRG```+```A``` und ```STRG```+```C```)
Transformationsregeln anwenden (neues Projekt):
* Neues Projekt erstellen
* Oben links Menü Undo / Redo den Button Apply... drücken
* Den Inhalt der Zwischenablage einfügen (z.B. mit STRG+V) und den Button Perform Operations drücken.
* Neues OpenRefine-Projekt mit ähnlichen oder gleichen Datenstrukturen erstellen
* Oben links im Reiter "Undo / Redo den Button "Apply..." drücken
* Den Inhalt der Zwischenablage einfügen (z.B. mit ```STRG```+```V```) und den Button "Perform Operations" drücken.
## Download des Shell-Scripts openrefine-batch
@ -31,9 +31,11 @@ cd openrefine-batch-master
chmod +x openrefine-batch.sh
```
## Tutorial aus dem vorigen Kapitel automatisiert bearbeiten
## Tutorial aus Kapitel 3.4 automatisiert bearbeiten
In dem Download sind die Daten aus dem Tutorial enthalten. Wenn Sie mögen, können Sie die JSON-Datei im Ordner examples/powerhouse-museum/config/ durch Ihre eigene Transformationshistorie ersetzen.
In dem Download sind die Daten aus dem Tutorial enthalten. Wenn Sie mögen, können Sie die mitgelieferte JSON-Datei im Ordner examples/powerhouse-museum/config/ durch Ihre eigene Transformationshistorie ersetzen.
Geben Sie im Terminal folgenden Befehl ein, um das Script ```openrefine-batch.sh``` auf den mitgelieferten Beispieldaten laufen zu lassen:
```
./openrefine-batch.sh \

View File

@ -18,5 +18,21 @@ curl "http://oai.swissbib.ch/oai/DB=2.1?verb=ListRecords&metadataPrefix=m21-xml%
* Rufen Sie den [Explain-Befehl der SRU-Schnittstelle von Swissbib](http://sru.swissbib.ch/sru/explain?operation=explain) auf. Im XML gibt es ein Element `ns:schemaInfo` in dem Informationen zu den angebotenen Metadatenformaten stehen. Bei Dublin Core ist im Attribut `location` ein [XSL-Stylesheet](http://sru.swissbib.ch/sru/xslfiles/MARC21slim2OAIDC.swissbib.xsl) verlinkt. Diesem sind konkrete Transformationsanweisungen zu entnehmen, siehe Interpretation in [Kapitel 3.6.](/kapitel-3/36-bonus-vergleich-mit-crosswalk-ergebnissen.md)
## [3.6 Bonus: Vergleich mit Crosswalk-Ergebnissen](/kapitel-3/36-bonus-vergleich-mit-crosswalk-ergebnissen.md)
Folgende Regeln stehen \(leicht vereinfacht\) darin:
* dc:id aus MARC 001
* dc:creator aus MARC 100, 110, 111, 700, 710, 711, 720
* dc:title aus MARC 245 a,b,f,g,h,k
* dc:type aus MARC 655 und aus leader
* dc:publisher aus MARC 260a und 260b
* dc:date aus MARC 260c
* dc:language aus MARC controlfield 008
* dc:format aus MARC 856q
* dc:description aus MARC 500a bis 599a \(ohne 506, 530, 540 und 546\)
* dc:subject aus MARC 600, 610, 611, 630, 650, 653, jeweils a,b,c,d,q
* dc:coverage aus MARC 752a, 752b, 752c, 752d
* dc:relation aus MARC 530a, 530b, 530c, 530d, 530u und aus 760, 762, 765, 767, 770, 772-777, 780, 785-787 jeweils o und t
* dc:identifier aus MARC 856u und 020a
* dc:rights aus MARC 506a, 540a

View File

@ -294,5 +294,80 @@
"description": "Move column leader to position 0",
"columnName": "leader",
"index": 0
},
{
"op": "core/column-move",
"description": "Move column record - datafield - subfield - code to position 5",
"columnName": "record - datafield - subfield - code",
"index": 5
},
{
"op": "core/text-transform",
"description": "Text transform on cells in column leader using expression grel:cells[\"record - datafield - subfield\"].value",
"engineConfig": {
"mode": "row-based",
"facets": [
{
"omitError": false,
"expression": "isBlank(value)",
"selectBlank": false,
"selection": [
{
"v": {
"v": false,
"l": "false"
}
}
],
"selectError": false,
"invert": false,
"name": "leader",
"omitBlank": false,
"type": "list",
"columnName": "leader"
}
]
},
"columnName": "leader",
"expression": "grel:cells[\"record - datafield - subfield\"].value",
"onError": "keep-original",
"repeat": false,
"repeatCount": 10
},
{
"op": "core/column-rename",
"description": "Rename column leader to id",
"oldColumnName": "leader",
"newColumnName": "id"
},
{
"op": "core/column-rename",
"description": "Rename column record - datafield - tag to tag",
"oldColumnName": "record - datafield - tag",
"newColumnName": "tag"
},
{
"op": "core/column-rename",
"description": "Rename column record - datafield - ind1 to ind1",
"oldColumnName": "record - datafield - ind1",
"newColumnName": "ind1"
},
{
"op": "core/column-rename",
"description": "Rename column record - datafield - ind2 to ind2",
"oldColumnName": "record - datafield - ind2",
"newColumnName": "ind2"
},
{
"op": "core/column-rename",
"description": "Rename column record - datafield - subfield - code to code",
"oldColumnName": "record - datafield - subfield - code",
"newColumnName": "code"
},
{
"op": "core/column-rename",
"description": "Rename column record - datafield - subfield to value",
"oldColumnName": "record - datafield - subfield",
"newColumnName": "value"
}
]