Kapitel 2 ergänzt

This commit is contained in:
Felix Lohmeier 2017-03-22 23:28:08 +01:00
parent 5a3660c0aa
commit f1c2ca4e7d
17 changed files with 702 additions and 10 deletions

View File

@ -0,0 +1,11 @@
# Kapitel 2: Metadaten laden und mit OpenRefine transformieren
Bitte nehmen Sie sich für die folgenden Abschnitte insgesamt etwa 4 Stunden Zeit:
* [2.1 Einführung in Metadatenformate und Schnittstellen](2-1-0-einfuehrung-in-metadatenformate-und-schnittstellen.md)
* [2.2 Metadaten über eine Schnittstelle laden](2-2-0-metadaten-ueber-eine-Schnittstelle-laden.md)
* [2.3 Metadaten transformieren mit OpenRefine](2-3-0-metadaten-transformieren-mit-openrefine.md)
Beiträge in den Lerntagebüchern der Studierenden:
* (folgt)

View File

@ -0,0 +1,8 @@
# 2.1 Einführung in Metadatenformate und Schnittstellen
Ziel: Metadatenformate und Möglichkeiten zum freien Austausch von Metadaten kennenlernen
Inhalte:
* [2.1.1 Metadatenformate und -standards](2-1-1-metadatenformate-und-standards.md)
* [2.1.2 Initiativen zum Austausch von Metadaten](2-1-2-initiativen-zum-austausch-von-metadaten.md)
* [2.1.3 Schnittstellen des Bibliotheksverbunds GBV](2-1-3-schnittstellen-des-bibliotheksverbunds-gbv.md)

View File

@ -0,0 +1,22 @@
# 2.1.1 Metadatenformate und -standards
## Präsentation Kirsten Jeude (2013)
http://www.slideshare.net/suvanni/auf-du-und-du-mit-dublin-core-co-berufsfeld-metadatenmanagement-im-kontext-der-bibliothek-der-zukunft
[![Screenshot Präsentation Kirsten Jeude](images/screenshot-jeude-2013.png)](http://www.slideshare.net/suvanni/auf-du-und-du-mit-dublin-core-co-berufsfeld-metadatenmanagement-im-kontext-der-bibliothek-der-zukunft)
## Interview mit Kirsten Jeude
ZBW Podcast: ["Kirsten Jeude - Die Datenübersetzerin"](https://www.youtube.com/watch?v=YwbRTDvt_sA)
## Kernpunkte
* Es gibt viele verschiedene Definitionen für Metadaten, je nach Perspektive (z.B. der IT, der KatalogbastlerInnen, der BibliothekarInnen usw.). Grundsätzlich sind es (vgl. Folie 13) **strukturierte "Daten über Daten"**, also eine formale Beschreibung einer Vielzahl von Dingen (Texte, Bilder, Objekte, Personen, usw.). Metadaten sollen u.a. das Auffinden, Identifizieren, Auswählen und den Zugang zu einer Ressource erleichtern. Metadaten können getrennt vom beschriebenen Objekt in einer separaten Datei gespeichert oder in das Objekt eingebettet sein. Bilddateien wie JPG enthalten zum Beispiel eingebettete Metadaten (Aufnahmedatum, Auflösung usw.).
* Da die Anforderungen an Metadaten kontextabhängig sind, gibt es eine Vielzahl an Standards, die sich entwickelt haben. Beispiele im Bibliothekswesen sind **PICA, MODS, DC, MAB, MARC21, METS, EAD, TEI, LIDO** (vgl. Folie 44). Diese Standards können technisch in verschiedenen Formaten (Text, XML) umgesetzt werden. Die Regeln der Standards werden oft in einem **Schema** dokumentiert, mit dem sich prüfen lässt, ob eine Datei (technisch) standardkonform ist. Wenn eine Anwendung genauere Festlegungen treffen will oder gar Elemente aus verschiedenen Standards kombiniert werden sollen, dann wird dies in einem **Anwendungsprofil** festgelegt (vgl. Folie 59).
* Um Metadaten aus verschiedenen Quellen zusammenzuführen, ist meist ein "Übersetzen" der Daten aus verschiedenen Quellschemas (MARC21, PICA) in ein einheitliches Zielschema notwendig. Dieser Prozess wird **Mapping (oder auch "Crosswalk")** genannt. Dabei gehen je nach Schema mehr oder weniger Informationen verloren. Es gibt Standard-Crosswalks zwischen Metadatenstandards, die als Grundlage dienen können. Da aber jede Einrichtung die Daten etwas anders erfasst (ist ja nur menschlich), lohnt es sich immer in die Daten zu schauen, wie die einzelnen Metadatenfelder wirklich befüllt sind. Die meisten Mappings werden daher teils auf Basis von Standard-Crosswalks, teils auf Basis von Beispieldaten erstellt (zu Problemen beim "Mapping in der Praxis" vgl. die Folien 70ff).
* Für den Austausch von Metadaten gibt es **Schnittstellen wie Z39.50, SRU oder OAI-PMH** (vgl. Folie 86ff).
## Literatur
* Wikipedia zu Metadaten: https://de.wikipedia.org/wiki/Metadaten
* Onlinetutorial "Einführung in Metadaten und Metadatenformate" von Claudia Effenberger und Stefanie Rühle: http://moodle.dnb.de/course/view.php?id=14
* Kleines Handbuch der DINI AG KIM: http://www.kim-forum.org/Subsites/kim/DE/Materialien/Handbuch/handbuch_node.html

View File

@ -0,0 +1,51 @@
# 2.1.2 Initiativen zum Austausch von Metadaten
## Open Bibliographic Data
Die "Open Bibliographic Data Working Group" der Open Knowledge Foundation hat 2011 Prinzipien zu offenen bibliografischen Daten veröffentlicht (vgl. [Webseite im Internet Archive](http://web.archive.org/web/20160426071002/http://openbiblio.net/principles/)):
* Grundlage: [Open Definition](http://opendefinition.org) "Wissen ist offen, wenn jedeR darauf frei zugreifen, es nutzen, verändern und teilen kann"
* Empfohlene Lizenzen: Public Domain Dedication and License (PDDL) oder Creative Commons Zero (CC0)
Gemeinsam mit der Public Domain Working Group ist ein "Open Metadata Handbook" entstanden. Letzte stabile Version vom 12.3.2014: https://en.wikibooks.org/w/index.php?title=Open_Metadata_Handbook&stable=1
## Metadateninteroperabilität
* die Einigung auf ein einziges übergreifendes Metadatenformat ist nicht realistisch, weil verschiedene Ressourcen beschrieben werden sollen und verschiedene Anforderungen an die Daten gestellt werden (und weil unterschiedliche Katalogisierungstraditionen bestehen)
* Eine Interoperabilität zwischen Formaten muss durch Werkzeuge erreicht werden
* setzt offene Standards voraus
## Beispiel Open Library
* Ziel: "One web page for every book"
* Teilprojekt des Internet Archives
* Daten sind gemeinfrei, stammen von Verlagen, Bibliotheken und Privatpersonen
* strukturiertes Wiki im Hintergrund
* gestartet von [Aaron Swartz](http://www.aaronsw.com/weblog/openlibrary) (sehenswerte Filmdokumentation über Aaron Swartz: [The Internet's Own Boy](https://en.wikipedia.org/wiki/The_Internet's_Own_Boy))
## Bespiel Deutsche Nationalbibliothek
* seit 1.7.2015 stehen die Titeldaten der DNB und die Normdaten der GND unter CC-0 zur Verfügung
* einmalige kostenfreie Anmeldung und Autorisierung notwendig
* Bezug über Online-Schnittstellen (SRU, OAI)
* Formate: MARC21, MARC21XML, RDF
## Chancen durch offene Daten
* steigende Bedeutung von Bibliotheken durch mehr Sichtbarkeit im Web
* Nachnutzung der Daten z.B. von Verlagen, Archiven, Wikipedia
* Chance für Kooperationen und Forschung mit den Daten
* Kataloganreicherung (z.B. Schlagwörter): verbesserte Recherchequalität
## Gründe für geringe Beteiligung von Bibliotheken
* keine Notwendigkeit?
* Gefühl, die akribisch gesammelten Daten zu verschenken
* Angst, überflüssig zu werden
* nicht zuständig fühlen: Aufgabe der Bibliotheksverbünde
## Ausblick
Die Open Bibliographic Data Working Group der Open Knowledge Foundation ist leider nicht mehr aktiv. Generell sind Initiativen zum Austausch von Metadaten zwischen Bibliotheken eher rückläufig, stattdessen wird seit etwa 2013 auf politischer Ebene eine zentralistische Lösung gesucht. Aktuell arbeiten beispielsweise die Bibliotheksverbünde GBV und SWB an einer vertieften Kooperation (vgl. https://www.bsz-bw.de/news.html?id=445).
Eine vielversprechende aktuelle Entwicklung ist das Projekt "WikiCite" der Wikimedia, das zum Ziel wissenschaftliche Ressourcen in Wikidata nachzuweisen und damit u.a. für Referenzen in der Wikipedia nutzbar zu machen. 2016 gab es dazu eine große Veranstaltung in Berlin: https://meta.wikimedia.org/wiki/WikiCite_2016

View File

@ -0,0 +1,17 @@
# 2.1.3 Schnittstellen des Bibliotheksverbunds GBV
Das Bibliothekssystem der Bibliothek im Kurt-Schwitters-Forum ist ein "LBS"-System des Anbieters OCLC, das vom Bibliotheksverbund GBV betrieben wird.
Die Metadaten können über Schnittstellen des GBV abgerufen werden, sind aber nicht zur freien Nachnutzung gekennzeichnet. Siehe Datenbankinfo beim GBV: https://uri.gbv.de/database/opac-de-960-3
Das interne Datenformat ist [PICA+](https://www.gbv.de/wikis/cls/PICA-Format), das im Plain-Text-Format oder als XML-Format verfügbar ist. Darüberhinaus bietet der GBV die Metadaten auch in weiteren Formaten an, wie zum Beispiel:
* MARC 21
* Dublin Core (DC)
* MODS
* ISBD
Ausgehend vom internen Datenformat PICA+ werden die übrigen Formate automatisch hergestellt. Dazu werden Übereinstimmungen zwischen den Feldern definiert, die als Mapping oder [Crosswalk](https://en.wikipedia.org/wiki/Schema_crosswalk) bezeichnet werden. Wenn nicht alle Daten aus dem internen Datenformat in das Zielformat passen (wie zum Beispiel beim "kleinsten gemeinsamen Nenner" der Metadatenformate: Dublin Core), dann gehen bei diesem Prozess Informationen verloren.
Wenn alle Daten "verlustfrei" verarbeitet werden sollen, muss also grundsätzlich entweder mit dem internen (auch: [nativ](http://www.duden.de/rechtschreibung/nativ)en) Datenformat gearbeitet werden oder es muss genau (in der Dokumentation) geprüft werden, ob der Crosswalk zum Zielformat wirklich vollständig ist.
In den folgenden beiden Übungen laden wir daher Beispieldatensätze (Kap 2.2.1) und prüfen welche Daten in den verschiedenen Formaten enthalten sind (Kap 2.2.2). Anschließend entscheiden wir uns für ein Format und laden die gesamten Daten herunter.

View File

@ -0,0 +1,8 @@
# 2.2 Metadaten über eine Schnittstelle laden
Ziel: Ausgewählte Metadaten der Bibliothek in verschiedenen Formaten über eine Schnittstelle laden und vergleichen. Anschließend Download der gesamten Daten im gewünschten Format.
Inhalte:
* [2.2.1 Übung: unAPI-Schnittstelle des GBV](2-2-1-uebung-unapi-schnittstelle-des-gbv.md)
* [2.2.2 Übung: Vergleich der verschiedenen Formate](2-2-2-uebung-vergleich-der-verschiedenen-formate.md)
* [2.2.3 Download der Metadaten](2-2-3-download-der-metadaten.md)

View File

@ -0,0 +1,50 @@
# 2.2.1 Übung: unAPI-Schnittstelle des GBV
Die Verbundzentrale des Bibliotheksverbunds GBV bietet mehrere [Schnittstellen](https://www.gbv.de/wikis/cls/Schnittstellen), die einen Abruf einzelner Datensätze erlauben. Wir nutzen für diese Übung die sogenannte "unAPI".
Dokumentation der unAPI-Schnittstelle des GBV: https://www.gbv.de/wikis/cls/unAPI
Für den Abruf von Datensätzen über die unAPI wird die jeweilige Identifikationsnummer des Datensatzes (in den Bibliothekssystemen des GBV "PPN" genannt) benötigt. Diese kann im Bibliothekskatalog z.B. über den Zitierlink angezeigt werden.
![Screenshot des KSF-Katalogs](images/screenshot-ksf-katalog-ppn.png)
## Aufgabe: Download mit curl
Lesen Sie die Dokumentation im Wiki des GBV und laden Sie mit dem Programm **curl** und der dort dokumentierten Beispielanfrage
```
http://unapi.gbv.de/?id=gvk:ppn:56677741X&format=mods
```
die Metadaten für einen beliebigen Katalogdatensatz der HAW-Bibliothek in allen vom GBV angebotenen Formaten (PICA+, PICA-XML, MARC21, etc.).
**Hinweise:**
* Sie können die Anfragen auch direkt in einem Browser aufrufen.
* Die http-Adresse müssen Sie bei **curl** in Anführungszeichen setzen, weil das Format mit einem &-Symbol übergeben wird, das sonst als Steuerzeichen interpretiert wird.
```
curl "http://..."
```
* Zum Speichern der Ausgabe als Datei können Sie am Ende des Befehls Folgendes anfügen (funktioniert für viele Linux-Programme):
```
> dateiname.txt
```
## Lösung
Beispiel:
* PPN: {%s%}834422018{%ends%}
* ID des Katalogs beim GBV: {%s%}opac-de-960-3{%ends%} (Katalog der HAW-Bibliothek)
### PICA+
{%s%}curl "http://unapi.gbv.de/?id=opac-de-960-3:ppn:834422018&format=pp" > 834422018.pp{%ends%}
### PICA-XML
{%s%}curl "http://unapi.gbv.de/?id=opac-de-960-3:ppn:834422018&format=picaxml" > 834422018.picaxml{%ends%}
### MARC21
{%s%}curl "http://unapi.gbv.de/?id=opac-de-960-3:ppn:834422018&format=marc21" > 834422018.marc21{%ends%}
### Weitere Formate
* MARCXML: {%s%}curl "http://unapi.gbv.de/?id=opac-de-960-3:ppn:834422018&format=marcxml" > 834422018.marcxml{%ends%}
* MODS: {%s%}curl "http://unapi.gbv.de/?id=opac-de-960-3:ppn:834422018&format=mods" > 834422018.mods{%ends%}
* DC: {%s%}curl "http://unapi.gbv.de/?id=opac-de-960-3:ppn:834422018&format=dc" > 834422018.dc{%ends%}
* ISBD: {%s%}curl "http://unapi.gbv.de/?id=opac-de-960-3:ppn:834422018&format=isbd" > 834422018.isbd{%ends%}
* PICA+ als HTML: {%s%}curl "http://unapi.gbv.de/?id=opac-de-960-3:ppn:834422018&format=picahtml" > 834422018.html{%ends%}

View File

@ -0,0 +1,60 @@
# 2.2.2 Übung: Vergleich der verschiedenen Formate
Im vorigen Abschnitt haben wir beispielhaft Katalogdaten in verschiedenen Formaten heruntergeladen. Jetzt stellt sich die Frage, mit welchem dieser Formate wir weiterarbeiten wollen. Wie eingangs beschrieben, suchen wir ein einfach zu verarbeitendes, gut strukturiertes Format, dass alle benötigten Daten beinhaltet. Um eine Entscheidung für eines der Formate treffen zu können, sollten wir die heruntergeladenen Metadaten mit dem OPAC abgleichen (Aufgabe 1) und die Formate untereinander vergleichen (Aufgabe 2).
## Aufgabe 1: Heruntergeladene Metadaten mit der Anzeige im OPAC abgleichen
Im [Katalog der Bibliothek des Kurt-Schwitters-Forums](http://www.hs-hannover.de/bibl/quicklinks/suche-im-katalog-ksf/index.html) werden in der Detailansicht eine ganze Reihe von Metadaten zu den Bibliotheksbeständen angezeigt, die wir auch in unserem zukünftigen Katalog verwenden wollen. Suchen Sie einzelne Wörter aus dem Katalogeintrag in den heruntergeladenen Metadaten, um festzustellen, ob diese Wörter in den jeweiligen Formaten überhaupt enthalten sind.
Am einfachsten ist es, wenn Sie dazu Texte im OPAC markieren, in die Zwischenablage kopieren ```STRG+C``` und im Terminal einfügen (Rechtsklick und "einfügen" auswählen).
## Lösung
Hier ein Beispiel für die PPN 834422018. Wenn Sie in der vorigen Übung andere Beispieldaten heruntergeladen haben, müssen Sie die Zahl entsprechend ersetzen.
PPN direkt im OPAC aufrufen:
* {%s%}http://opac.tib.eu/DB=11/XMLPRS=N/PPN?PPN=834422018{%ends%}
Suche nach Textschnipseln in den heruntergeladenen Metadaten:
* {%s%}grep -i -n -H "Lehrbuch" 834422018*{%ends%}
## Aufgabe 2: Direkter Vergleich der Metadatenformate
Vergleichen Sie das interne Format des Bibliothekssystems (PICA+/PICAXML) mit den ebenfalls über die Schnittstellen des GBV angebotenen Formaten MARC21/MARCXML, DC und MODS. Die Umwandlung von PICA+ in PICAXML und MARC21 in MARCXML ist verlustfrei, so dass nur drei Vergleiche zu tätigen sind:
1. PICAXML vs. MARCXML
2. PICAXML vs. DC
3. PICAXML vs. MODS
Hinweise:
* Für den Vergleich können Sie Onlinetools wie [Diff Checker](https://www.diffchecker.com/) oder [Tools auf der Kommandozeile](http://www.tecmint.com/best-linux-file-diff-tools-comparison/) verwenden.
## Lösung
Im Folgenden wird eine mögliche Lösung beschrieben, die Tools auf der Kommandozeile nutzt, um die heruntergeladenen Daten zu vereinheitlichen und dann automatisch zu vergleichen. Wenn Sie die jeweiligen Formate manuell miteinander verglichen haben, ist das auch vollkommen ok. In dieser Übung geht es nicht um Tricks auf der Kommandozeile, sondern um die Unterschiede der Metadatenformate ;-).
Vorverarbeitung:
* picaxml: {%s%}curl -s "http://unapi.gbv.de/?id=opac-de-960-3:ppn:834422018&format=picaxml" | sed 's/^ *//; s/ *$//; /^$/d; s/<[^>]*>//g' | sort | uniq > 834422018.picaxml.strip{%ends%}
* marcxml: {%s%}curl -s "http://unapi.gbv.de/?id=opac-de-960-3:ppn:834422018&format=marcxml" | sed 's/--/\n/g' | sed 's/^ *//; s/ *$//; /^$/d; s/<[^>]*>//g' | sort | uniq > 834422018.marcxml.strip{%ends%}
* dc: {%s%}curl -s "http://unapi.gbv.de/?id=opac-de-960-3:ppn:834422018&format=dc" | sed 's/^ *//; s/ *$//; /^$/d; s/<[^>]*>//g' | sort | uniq > 834422018.dc.strip{%ends%}
* mods: {%s%}curl -s "http://unapi.gbv.de/?id=opac-de-960-3:ppn:834422018&format=mods" | sed 's/^ *//; s/ *$//; /^$/d; s/<[^>]*>//g' | sort | uniq > 834422018.mods.strip{%ends%}
Vergleich picaxml mit marcmxl/dc/mods:
* picaxml vs. marcxml: {%s%}diff -u 834422018.picaxml.strip 834422018.marcxml.strip{%ends%}
* picaxml vs. dc: {%s%}diff -u 834422018.picaxml.strip 834422018.dc.strip{%ends%}
* picaxml vs. mods: {%s%}diff -u 834422018.picaxml.strip 834422018.mods.strip{%ends%}
Grafischer Vergleich picaxml mit marcxml/dc/mods:
* Installation vim: {%s%}sudo apt-get install vim{%ends%}
* picaxml vs. marcxml: {%s%}vimdiff 834422018.picaxml.strip 834422018.marcxml.strip{%ends%}
* picaxml vs. dc: {%s%}vimdiff 834422018.picaxml.strip 834422018.dc.strip{%ends%}
* picaxml vs. mods: {%s%}vimdiff 834422018.picaxml.strip 834422018.mods.strip{%ends%}
* Tipp: {%s%}Beenden von vimdiff mit zweimal :q und enter{%ends%}
Erläuterungen zu einzelnen Schritten der Vorverarbeitung:
* keine Statusinfos ausgeben (silent): {%s%}curl -s{%ends%}
* Leerzeichen links entfernen: {%s%}sed 's/^ *//'{%ends%}
* Leerzeichen rechts entfernen: {%s%}sed 's/ *$//'{%ends%}
* Leere Zeilen entfernen: {%s%}sed '/^$/d'{%ends%}
* Trennzeichen -- durch Zeilenumbrüche ersetzen(marcxml): {%s%}sed 's/--/\n/g'{%ends%}
* Alle Zeilen alphanumerisch sortieren: {%s%}sort{%ends%}
* Doppelte Zeilen entfernen: {%s%}uniq{%ends%}

View File

@ -0,0 +1,267 @@
# 2.2.3 Download der Metadaten
Die Verbundzentrale des Bibliotheksverbunds GBV bietet derzeit keinen einfachen Weg an, um regelmäßig vollständige Abzüge der Daten einer Bibliothek zu bekommen. Wenn wir also die Metadaten des Katalogs der Bibliothek im Kurt-Schwitters-Forum eigenständig laden wollen, müssen wir eine der angebotenen öffentlichen Schnittstellen benutzen.
## Wahl des Formats
Von den angebotenen [Formaten](https://www.gbv.de/wikis/cls/UnAPI#Formate) kommen für uns nur PICA+/PICAXML oder MARC21/MARCXML in Frage. In der vorigen Übung sollten Sie festgestellt haben, dass in den alternativen Formaten wie DC, MODS oder ISBD nicht alle Daten enthalten sind. **Wir verwenden MARC21/MARCXML**, weil der Standard wesentlich weiter verbreitet ist als PICA+/PICAXML und somit mehr Tools und Anleitungen dazu verfügbar sind.
Zu beachten ist, dass der Bibliotheksverbund diese Metadaten zuvor aus verschiedenen Quellen zusammengeführt hat, so dass wir hoffen müssen (und immer auch ein bisschen skeptisch sein sollten), dass die vorliegenden Metadaten alle einheitlich und standardkonform erfasst und in das gemeinsame Zielschema MARC21 ohne (großen) Informationsverlust "übersetzt" wurden.
## Wahl der Schnittstelle
Aus der [Dokumentation des GBV](https://www.gbv.de/wikis/cls/Schnittstellen):
> Folgende öffentliche, webbasierten Schnittstellen (APIs, Webservice ...) sind im GBV-Verbundwiki dokumentiert:
> * SRU und Z39.50 für Suche und Abruf kleiner Mengen von Datensätzen
> * unAPI für den Abruf einzelner Datensätze
> * SeeAlso für den Abruf von Links und Empfehlungen
> * DAIA für den Abruf von Verfügbarkeitsinformationen
> * PAIA für Zugriff auf Benutzerkonten
**Wir verwenden die [SRU-Schnittstelle](https://www.gbv.de/wikis/cls/SRU)**, die einen ähnlichen Funktionsumfang wie die Z39.50-Schnittstelle anbietet und etwas moderner ist. Über die SRU-Schnittstelle stehen nur XML-Formate zur Verfügung, so dass wir im Folgenden mit **MARCXML** arbeiten werden.
## Aufgabe 1: 100 Records über die SRU-Schnittstelle laden
Lesen Sie die [Dokumentation zur SRU-Schnittstelle im Wiki des GBV](https://www.gbv.de/wikis/cls/SRU) und stellen Sie auf Basis des dort aufgeführten Beispiels eine Abfrage mit folgenden Parametern zusammen:
* Katalog der Bibliothek im Kurt-Schwitters-Forum
* Suche über alle Felder
* Suchbegriff: ```open```
* Format: ```marcxml```
* Anzahl Records: ```100```
Laden Sie die Daten mit **curl**, wie in Kapitel 4.2 geübt.
## Lösung
Folgende Abfrage über die SRU-Schnittstelle des GBV liefert die ersten 100 Treffer im Format ```marcxml``` für den Suchbegriff ```open``` im Katalog der Bibliothek im Kurt-Schwitters-Forum:
{%s%}http://sru.gbv.de/opac-de-960-3?operation=searchRetrieve&query=pica.all%3Dopen&maximumRecords=100&recordSchema=marcxml{%ends%}
Speichern der Daten mit curl:
{%s%}curl "http://sru.gbv.de/opac-de-960-3?operation=searchRetrieve&query=pica.all%3Dopen&maximumRecords=100&recordSchema=marcxml" > 1-100.marcxml{%ends%}
## Aufgabe 2: 1.000 Records über die SRU-Schnittstelle laden
In Aufgabe 1 haben wir 100 Records über die SRU-Schnittstelle geladen. Wenn wir den Parameter maximumRecords einfach auf 1000 erhöhen, dann meldet die Schnittstelle einen Fehler zurück (probieren Sie es aus...). Suchen Sie nach einer Möglichkeit, mehr als 100 Records für den Suchbegriff ```open``` zu laden.
**Hinweise:**
* Stellen Sie mehrere Anfragen in 100er-Paketen.
* Nutzen Sie dazu den zusätzlichen Parameter ```startRecord```.
## Lösung
Download in 100er-Paketen:
* {%s%}curl "http://sru.gbv.de/opac-de-960-3?operation=searchRetrieve&query=pica.all%3Dopen&maximumRecords=100&recordSchema=marcxml&startRecord=1" > 1-100.marcxml{%ends%}
* {%s%}curl "http://sru.gbv.de/opac-de-960-3?operation=searchRetrieve&query=pica.all%3Dopen&maximumRecords=100&recordSchema=marcxml&startRecord=101" > 101-200.marcxml{%ends%}
* {%s%}curl "http://sru.gbv.de/opac-de-960-3?operation=searchRetrieve&query=pica.all%3Dopen&maximumRecords=100&recordSchema=marcxml&startRecord=201" > 201-300.marcxml{%ends%}
* usw.
## Aufgabe 3: Shell-Script zum Download von 1000 Records schreiben
Shell-Scripte ermöglichen die Automatisierung von Befehlen auf der Kommandozeile. So müssen Sie nicht alle Befehle nacheinander selbst eintippen, sondern brauchen nur einmal das Script starten und der Computer arbeitet die Befehle selbstständig nacheinander ab. Es können auch Variablen und Schleifen definiert werden, so dass die Befehle dynamisch innerhalb der Laufzeit des Scripts angepasst werden können, was sehr weitreichende Möglichkeiten bietet. Shell-Scripte sind somit ein erster Einstieg in die Programmierung, woher übrigens auch das Schimpfwort "[Scriptkiddie](https://de.wikipedia.org/wiki/Scriptkiddie)" stammt ;-).
Wenn Sie noch keine Erfahrung mit Shell-Scripten haben und die Aufgabe selbst lösen wollen, dann arbeiten Sie zunächst den sehr empfehlenswerten [Bash-Skripting-Guide für Anfänger](https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_f%C3%BCr_Anf%C3%A4nger/) durch (wofür Sie sich 1-2 Stunden Zeit nehmen sollten). Alternativ probieren Sie einfach die untenstehende Lösung aus und schauen was passiert.
**Hinweise:**
* Suchen Sie in Foren nach fertigen Lösungen (und wenn Sie nicht fündig werden, schauen Sie z.B. [hier](http://stackoverflow.com/questions/16131321/shell-script-using-curl-to-loop-through-urls))
* Verwenden Sie die Lösung aus Aufgabe 2 als Grundlage und versuchen Sie die 10 Einzelschritte über eine Schleife abzubilden.
* Definieren Sie zu Beginn Variablen, das macht das Script aufgeräumter und erleichtert spätere Anpassungen.
* Das Script läuft nicht durch, obwohl die Befehle einzeln in der Kommandozeile funktionieren? Achten Sie auf das sogenannte [Quoting](http://wiki.bash-hackers.org/syntax/quoting), das sind [übliche Fehler](http://www.greenend.org.uk/rjk/tech/shellmistakes.html#missingquote).
## Lösung
```
#!/bin/bash
url="http://sru.gbv.de/opac-de-960-3?operation=searchRetrieve&query=pica.all%3Dopen&maximumRecords=100&recordSchema=marcxml&startRecord="
startRecord=1
counter=100
while [ "$counter" -le 1000 ] ; do
curl "${url}${startRecord}" > ${startRecord}-${counter}.marcxml
let counter=counter+100
let startRecord=startRecord+100
done
exit
```
**Ausführen:**
* Diesen Textinhalt in einer Datei abspeichern, z.B. mit ```nano download-1000.sh```
* Danach muss das Script noch ausführbar gemacht werden: ```chmod +x download-1000.sh```
* Script starten mit ```./download-1000.sh```
**Erläuterungen:**
* Anfangs werden die Variablen ```url```, ```startRecord``` und ```counter``` definiert, die später mit ```${url}``` usw. wieder abgerufen werden. Der Wert für die Variable ```url``` muss in Anführungszeichen gesetzt werden, weil sonst das &-Zeichen von der Shell missverstanden würde.
* Als Schleife wurde hier die Form ```while [ ] ; do``` (...) ```done``` gewählt. Die Testbedingung ```"$counter" -le 1000``` innerhalb der eckigen Klammern des ```while```-Kommandos bedeutet, dass die Schleife solange ausgeführt wird, bis die Variable ```counter``` den Wert 1000 erreicht.
* Der curl-Befehl lautet nach Auflösung der Variablen genauso wie aus den vorigen Aufgaben bekannt. Der Dateiname unter dem das jeweilige Ergebnis gespeichert werden soll, setzt sich aus den Variablen ```startRecord``` und ```counter``` zusammen.
* Bevor der curl-Befehl erneut ausgeführt wird, sorgen die beiden ```let```-Befehle dafür, dass ```startRecord``` und ```counter``` jeweils um 100 erhöht werden. Somit lädt der zweite Durchlauf der Schleife die Records 101 bis 200 (und so weiter).
## Aufgabe 4: Download der vollständigen Metadaten der Bibliothek im Kurt-Schwitters-Forum
In der vorigen Aufgabe haben Sie mit einem Script mehrere 100er-Pakete für den Suchbegriff ```open``` heruntergeladen. Um die Metadaten aus dem Bibliothekskatalog **vollständig** abzurufen, benötigen wir eine oder mehrere Suchabfragen, welche die gesamte Ergebnismenge zurückliefern und die wir dann mit dem Parameter ```startRecord``` in 100er-Paketen nach und nach durchgehen können.
**Aufgabe:**
1. Lesen Sie die Dokumentation der [SRU-Schnittstelle](https://www.gbv.de/wikis/cls/SRU) und des [PICA-Formats](https://www.gbv.de/wikis/cls/PICA-Format) und probieren Sie Abfragen mit verschiedenen Feldern.
2. Wenn Sie eine Möglichkeit gefunden haben, passen Sie das Script aus Aufgabe 3 entsprechend an.
**Hinweise:**
* Probieren Sie den Wert ```.*``` in Ihren Suchanfragen
* Falls Sie sich für die theoretischen Hintergründe interessieren, könnte der Bericht "[Guidelines for preparing a Z39.50/SRU target to enable metadata harvesting](http://cyberdoc.univ-lemans.fr/PUB/CfU/Journee_UNIMARC_Lyon/TELplus-D2.3_v1.0%5B1%5D.pdf)" des EU-Projekts eContentplus vom 30.6.2009 interessieren (dort ist aber keine praktische Lösung für die Aufgabe zu finden).
## Lösung
Folgende Anfrage an die SRU-Schnittstelle liefert die Gesamtmenge zurück:
* Suchanfrage: {%s%}pica.ppn=.*{%ends%}
* Beispiel: {%s%}http://sru.gbv.de/opac-de-960-3?operation=searchRetrieve&query=pica.ppn=.*&maximumRecords=100&startRecord=1&recordSchema=marcxml{%ends%}
* entspricht folgender Suche im Katalog: {%s%}http://opac.tib.eu/DB=11/CMD?ACT=SRCH&TRM=PPN+.%3F{%ends%}
* Gesamtanzahl der Records: {%s%}612.152 (Stand: 22.03.2017){%ends%}
### Variante 1: Download-Script "minimal"
Mit dem Shell-Script aus Aufgabe 3 als Vorlage, der neuen Suchanfrage und der Gesamtanzahl der Records haben wir schon alle Bestandteile, die wir benötigen. Folgendes Script lädt alle Records herunter (vergleichen Sie es mit dem Script aus Aufgabe 3):
```
#!/bin/bash
url="http://sru.gbv.de/opac-de-960-3?operation=searchRetrieve&query=pica.ppn=.*&maximumRecords=100&recordSchema=marcxml&startRecord="
startRecord=1
counter=100
while [ "$counter" -le 612200 ] ; do
curl "${url}${startRecord}" > ${startRecord}-${counter}.marcxml
let counter=counter+100
let startRecord=startRecord+100
done
exit
```
**Ausführen:**
* Diesen Textinhalt in einer Datei abspeichern, z.B. mit ```nano download-minimal.sh```
* Danach muss das Script noch ausführbar gemacht werden: ```chmod +x download-minimal.sh```
* Script starten mit ```./download-minimal.sh```
### Variante 2: Download-Script "comfort"
Üblicherweise werden in Shell-Scripten noch Tests oder Statistiken eingebaut, um gleich prüfen zu können, ob die Aktionen erfolgreich waren. Außerdem werden üblicherweise so viele Variablen wie möglich definiert, damit das Script leicht angepasst und in anderen Kontexten verwendet werden kann. Weiterhin sollten Kommentare mit ```#``` eingeführt werden, damit das Script ohne extra Dokumentation besser nachvollziehbar wird.
Ein komfortableres Script könnte wie folgt aussehen (probieren Sie es einfach mal aus...).
```
#!/bin/bash
# Script zum Download von Metadaten über SRU-Schnittstellen mit curl
# sru-download.sh, Felix Lohmeier, v0.2, 16.03.2017
# https://github.com/felixlohmeier/seminar-praxis-der-digitalen-bibliothek
# Variablen (bei Bedarf hier anpassen)
url="http://sru.gbv.de/opac-de-960-3"
query="pica.ppn=.*"
format="marcxml"
outputdir="download"
filename="hsh_ksf"
recordlimitperquery=100
# Weitere technische Variablen
date="$(date +%F)"
datelog="$(date +%Y%m%d_%H%M%S)"
command="?operation=searchRetrieve"
startrecord=1
let counter=startrecord+recordlimitperquery-1
# Verzeichnis erstellen (falls nicht vorhanden)
mkdir -p $outputdir
# Ausgabe parallel in eine Logdatei schreiben
exec &> >(tee -a "$outputdir/${filename}_${datelog}.log")
# Anzahl der Datensätze auslesen
records=$(curl --silent "${url}${command}&query=${query}&recordSchema=${format}" | sed 's/</\n/g' | sed '/^\//d' | sed 's/:/\n/g' | grep numberOfRecords | cut -c 17-)
# Variablen ausgeben
echo "SRU-Schnittstelle: ${url}"
echo "Suchabfrage: ${query}"
echo "Format: ${format}"
echo "Anzahl Datensätze: ${records}"
echo "Datensätze pro Datei: ${recordlimitperquery}"
echo "Download in Verzeichnis: $(readlink -f ${outputdir})"
echo "Beispiel Dateiname: ${filename}_${date}_$(printf "%.7i\n" ${startrecord})-$(printf "%.7i\n" ${counter}).xml"
echo "Logdatei: ${filename}_${datelog}.log"
echo ""
# Startzeitpunkt ausgeben
echo "Startzeitpunkt: $(date)"
echo ""
# Schleife mit Aufruf von curl
while (("$counter" <= "$records")) ; do
echo "Download Records "${startrecord}" bis "${counter}"..."
curl "${url}${command}&query=${query}&maximumRecords=${recordlimitperquery}&recordSchema=${format}&startRecord=${startrecord}" > $outputdir/${filename}_${date}_$(printf "%.7i\n" ${startrecord})-$(printf "%.7i\n" ${counter}).xml
# Sofortige Prüfung des Downloads, wenn Format marcxml
if [ $format = "marcxml" ]; then
echo "Ergebnis: "$(grep -c -H '<controlfield tag="001">' $outputdir/${filename}_${date}_$(printf "%.7i\n" ${startrecord})-$(printf "%.7i\n" ${counter}).xml)" records"
fi
echo ""
let counter=counter+recordlimitperquery
let startrecord=startrecord+recordlimitperquery
done
# Prüfung des Downloads, wenn Format marcxml
if [ "$format" = "marcxml" ]; then
echo "Gesamtanzahl der Records im Ordner download:"
grep '<controlfield tag="001">' $outputdir/*.xml | wc -l
echo ""
echo "Dateien, die weniger als 10 Records enthalten:"
testfiles=($(find "$outputdir" -type f -name '*.xml'))
for i in "${testfiles[@]}" ; do
testfilerecords="$(grep -c -h '<controlfield tag="001">' ${i})"
if (("${testfilerecords}" < "10")); then
echo 1>&2 "${i}: ${testfilerecords}"
fi
done
echo ""
fi
# Prüfung, ob sich während des Downloads die Datenbank geändert hat
recordsafterdownload=$(curl --silent "${url}${command}&query=${query}&recordSchema=${format}" | sed 's/</\n/g' | sed '/^\//d' | sed 's/:/\n/g' | grep numberOfRecords | cut -c 17-)
if [ "$records" != "$recordsafterdownload" ]; then
echo 1>&2 "Warnung: Die Suchabfrage an die SRU-Schnittstelle hat vor Beginn des Downloads eine andere Gesamtanzahl an Datensätzen ergeben (${records}) als nach dem Download (${recordsafterdownload}). Das ist ein Indiz dafür, dass die Datenbank zwischenzeitlich verändert wurde. Es ist wahrscheinlich, dass dadurch einzelne Datensätze im Download fehlen."
fi
# Endzeitpunkt ausgeben
echo "Endzeitpunkt: $(date)"
echo ""
```
Script als Datei: [sru-download.sh](scripte/sru-download.sh)
**Ausführen:**
* Script mit ```curl``` auf den Server laden: ```curl -O https://github.com/felixlohmeier/seminar-praxis-der-digitalen-bibliothek/raw/master/scripte/sru-download.sh```)
* Script ausführbar machen: ```chmod +x sru-download.sh```
* Script starten mit ```./sru-download.sh```
## Aufgabe 5: Grobe Prüfung der heruntergeladenen Dateien
Das Script benötigt für einen Komplettdurchlauf etwa 6 Stunden. Sie werden also bestimmt nicht jede Transaktion aufmerksam am Bildschirm verfolgt haben. So oder so ist es sinnvoll mit ein paar Tests die Plausibilität der heruntergeladenen Dateien zu prüfen. Bitte beantworten Sie folgende Fragen:
1. Wie groß sind a) alle heruntergeladenen Dateien und b) die kleinste(n) der Dateien? Gibt es c) Auffälligkeiten bei den Dateigrößen?
2. Wieviele Records wurden heruntergeladen? (Tipp: nutzen Sie dazu das Feld bzw. den Pfad ```<controlfield tag="001">```)
3. Gibt es Dubletten? Wenn ja, a) welche, b) wieviele und c) wo?
## Lösung
Wechseln Sie in das Verzeichnis download mit ```cd download```
(1) Prüfung Dateigrößen:
* a) alle: {%s%}du -a -h{%ends%}
* b) die kleinste(n): {%s%}ls -1 -s -S{%ends%}
* c) Auffälligkeiten: {%s%}achten Sie auf kleine und gleiche Dateigrößen, ebenfalls mit ls -1 -s -S{%ends%}
(2) Prüfung Anzahl Records:
* alle: ```grep -h "<controlfield tag=\"001\">" *.marcxml | wc -l```
* ohne Dubletten: ```grep -h "<controlfield tag=\"001\">" *.marcxml | sed 's/<[^>]*>//g; s/^ *//' | uniq | wc -l```
(3) Dubletten ausgeben:
* a) welche: ```grep -h "<controlfield tag=\"001\">" *.marcxml | sed 's/<[^>]*>//g; s/^ *//' | uniq -D```
* b) wieviele: ```grep -h "<controlfield tag=\"001\">" *.marcxml | sed 's/<[^>]*>//g; s/^ *//' | uniq -c -d```
* c) wo: ```grep -h "<controlfield tag=\"001\">" *.marcxml | sed 's/<[^>]*>//g; s/^ *//' | uniq -D | grep -f - *```

View File

@ -0,0 +1,10 @@
# 2.3 Metadaten transformieren mit OpenRefine
Ziel: Heruntergeladene Metadaten mit OpenRefine in ein Tabellenformat transformieren.
Inhalte:
* [2.3.1 Installation OpenRefine](2-3-1-installation-openrefine.md)
* [2.3.2 OpenRefine starten und Daten laden](2-3-2-openrefine-starten-und-daten-laden.md)
* [2.3.3 Facetten und Text Filter](2-3-3-facetten-und-text-filter.md)
* [2.3.4 Records bilden](2-3-4-records-bilden.md)
* [2.3.5 Für jedes MARC-Feld eine Spalte](2-3-5-fuer-jedes-marc-feld-eine-spalte.md)

View File

@ -0,0 +1,43 @@
# 2.3.1 Installation OpenRefine
[OpenRefine](http://www.openrefine.org) bietet eine grafische Oberfläche zur Analyse und Transformation von Daten, die ähnlich wie eine klassische Tabellenverarbeitungssoftware (MS Excel, LibreOffice Calc, usw.) aufgebaut ist. Wir verwenden diese Software im Seminar um die Ausgangsdaten aus dem Bibliothekssystem zu manipulieren und in ein passendes Format für den Suchmaschinenindex zu transformieren.
## OpenRefine herunterladen und entpacken
Auf der Webseite von OpenRefine werden verschiedene Varianten zum [Download](http://openrefine.org/download.html) angeboten. Wir laden die neueste Version (Stand 22.3.2017: OpenRefine 2.7-rc2) für das Betriebssystem Linux. Die Installationsanleitung auf der Webseite ist simpel: "Download, extract, then type ./refine to start."
Wir erledigen dies wieder mit der Kommandozeile (MATE-Terminal):
* Download: ```wget https://github.com/OpenRefine/OpenRefine/releases/download/2.7-rc.2/openrefine-linux-2.7-rc.2.tar.gz```
* Extract (entpacken): ```tar -xzf openrefine-linux-2.7-rc.2.tar.gz```
Im Ordner ```openrefine-linux-2.7-rc.2``` finden Sie jetzt das Programm OpenRefine.
## OpenRefine starten
```~/openrefine-linux-2.7-rc.2/refine```
Die Tilde (```~```) ist ein Kürzel für ihr Benutzerverzeichnis. Dieser Befehl funktioniert immer, egal in welchem Verzeichnis Sie sich gerade befinden. Wenn Sie sich im Ordner von OpenRefine befinden (```cd ~/openrefine-linux-2.7-rc.2```) reicht ein simples ```refine```
Ist der Startvorgang erfolgreich, dann öffnet sich der Browser (Firefox) automatisch und Sie bekommen das Programm direkt angezeigt. OpenRefine ist in der Standardeinstellung unter der IP-Adresse http://127.0.0.1:3333 erreichbar.
Rufen Sie den Menüpunkt "Open Project" auf und klicken Sie ganz unten auf den Link "Browse workspace directory". Es öffnet sich der Ordner, in dem OpenRefine die Daten speichert. In der Standardkonfiguration unter Linux ist dies das Verzeichnis ```~/.local/share/openrefine```
### OpenRefine beenden
OpenRefine ist nur solange verfügbar, wie der oben verwendete Befehl in der Kommandozeile läuft.
1. Beenden Sie OpenRefine mit ```STRG``` und ```C``` auf der Kommandozeile. Der Browser schließt sich automatisch.
2. Starten Sie OpenRefine erneut, indem Sie auf der Kommandozeile mit der ```Pfeiltaste nach oben``` den vorigen Befehl auswählen und mit ```Enter``` ausführen.
Auf der Kommandozeile können Sie übrigens mitverfolgen, wie der Browser und OpenRefine miteinander kommunizieren. Beim Aufruf von OpenRefine im Browser erscheinen beispielsweise die folgenden POST und GET Befehle in der Kommandozeile:
```
15:10:34.819 [ refine] POST /command/core/load-language (19332ms)
15:10:34.940 [ refine] POST /command/core/load-language (121ms)
15:10:35.223 [ refine] POST /command/core/get-importing-configuration (283ms)
15:10:35.509 [ refine] GET /command/core/get-all-project-metadata (286ms)
15:10:35.632 [ refine] GET /command/core/get-languages (123ms)
15:10:35.721 [ refine] GET /command/core/get-version (89ms)
```
Doch dazu später mehr.

View File

@ -0,0 +1,18 @@
# 2.3.2 OpenRefine starten und Daten laden
Die folgenden Übungen in diesem Kapitel führen wir zunächst mit einer einzigen Datei aus dem Download durch. Diese Datei beinhaltet "nur" 100 Datensätze, mit denen wir beispielhaft arbeiten. Im nächsten Kapitel werden wir dann die gelernten Transformationen auf alle rund 600.000 Datensätze anwenden.
## Aufgabe: Daten konfigurieren und in ein neues Projekt laden
Starten Sie OpenRefine, laden Sie eine der in Kapitel 2.2.3 heruntergeladenen MARCXML-Dateien in OpenRefine und legen Sie damit ein neues Projekt an.
Hinweise:
* Wählen Sie die Option "XML-Files". Die Option "MARC" ist nicht für XML gedacht und [funktioniert derzeit ohnehin nicht](https://github.com/OpenRefine/OpenRefine/issues/794).
## Lösung
* OpenRefine starten: {%s%}~/openrefine-linux-2.7-rc.2/refine{%ends%}
* Projekt erstellen: {%s%}Im Menüpunkt "Create Project" auf den Button "Durchsuchen" klicken und eine der MARCXML Dateien auswählen. Im nächsten Bildschirm unten links bei Parse data as "XML files" auswählen, dann im Vorschaubildschirm auf den Pfad record xmlns="http://www.loc.gov/MARC21/slim" klicken und dann oben rechts den Button "Create Project" drücken.{%ends%}
Stören Sie sich nicht zu sehr an der zunächst unübersichtlichen Darstellung der Daten, das werden wir in den nächsten Übungen bereinigen.

View File

@ -0,0 +1,18 @@
# 2.3.3 Facetten und Text Filter
OpenRefine "versteht" das MARC-Format nicht. Es interpretiert die Daten daher genauso wie jede andere XML-Datei. Wenn Sie die Daten erstmalig in OpenRefine öffnen, sehen Sie daher die üblichen Nummern und Codes für die jeweiligen MARC-Felder in der Baumstruktur der XML-Datei. Die Bedeutung der MARC-Nummern und Codes müssen Sie nachschlagen. Der GBV bietet meines Wissens nach keine Beschreibung der Feldbelegungen an. Zur Orientierung können Sie die [Arbeitstabelle der Deutschen Nationalbibliothek](http://www.dnb.de/SharedDocs/Downloads/DE/DNB/standardisierung/marc21FeldbeschreibungTitelExcel032016.zip) in der [Dokumentation des MARC21-Formats](http://www.dnb.de/DE/Standardisierung/Formate/MARC21/marc21_node.html) verwenden.
## Aufgabe: Verschaffen Sie sich einen Überblick über die Daten(struktur) mit Hilfe von Facetten und Text Filtern
Hinweise:
* Starten Sie OpenRefine und laden Sie das in der vorigen Übung angelegte Projekt.
* Schauen Sie sich die Einführungsvideos zu OpenRefine an, insbesondere die ca. [7-Minuten-Kurzeinführung bei YouTube](https://www.youtube.com/watch?v=B70J_H_zAWM)
* Konsultieren Sie die [Seite zur Facettierung in der Dokumentation von OpenRefine](https://github.com/OpenRefine/OpenRefine/wiki/Faceting) und probieren Sie verschiedene Facetten aus.
* Gute Übungen zum Einstieg bietet auch Library Carpentry OpenRefine: [Basic OpenRefine Functions I: Working with columns, sorting, faceting, filtering and clustering](https://data-lessons.github.io/library-openrefine/03-basic-functions-I/)
## Bonusaufgabe: Laden Sie die Arbeitstabelle der DNB in OpenRefine
Die Dokumentation der DNB steht auch als Tabellendokument zur Verfügung. Da OpenRefine auf die Bearbeitung von tabellarischen Daten ausgelegt ist, können Sie die Arbeitstabelle anstatt in Excel/LibreOffice auch gleich in OpenRefine als neues Projekt anlegen.
[Arbeitstabelle der Deutschen Nationalbibliothek](http://www.dnb.de/SharedDocs/Downloads/DE/DNB/standardisierung/marc21FeldbeschreibungTitelExcel032016.zip)

37
2-3-4-records-bilden.md Normal file
View File

@ -0,0 +1,37 @@
# 2.3.4 Records bilden
## Aufgabe: Editieren Sie die Daten so, dass OpenRefine die 100 Datensätze jeweils als "Records" erkennt.
Hinweise:
* OpenRefine erkennt Records (Datensätze) anhand der ersten Spalte. Versuchen Sie in alle 100 Zeilen, in denen ein Datensatz beginnt, eine eindeutige Kennung in die erste Spalte zu bekommen. Die übrigen Zellen in der ersten Spalte sollten leer sein.
* Wechseln Sie die Ansicht oben zwischen "Rows" und "Records" und prüfen Sie die Änderung der Darstellung.
* Den Wert einer anderen Spalte kopieren Sie über die Transformationsregel: ```cells["NAME-DER-SPALTE"].value```
Literatur:
* [Difference between a record and a row](http://kb.refinepro.com/2012/03/difference-between-record-and-row.html)
* [Create records in Google Refine](http://kb.refinepro.com/2012/06/create-records-in-google-refine.html)
## Lösung
Spalten ordnen
* {%s%}All / Edit columns / Re-order / remove columns...{%ends%}
* {%s%}Spalte "record - leader" ganz nach oben schieben{%ends%}
Angabe in Spalte record-leader durch PPN aus Spalte "record - controlfield" ersetzen
* {%s%}Modus "rows" auswählen (falls nicht vorausgewählt){%ends%}
* {%s%}Spalte "record - controlfield - tag" / Facet / Text Facet / Wert 001 auswählen{%ends%}
* {%s%}Spalte "record - leader" / Edit cells / Transform... und folgenden Wert eingeben: cells["record - controlfield"].value{%ends%}
* {%s%}Facette schließen{%ends%}
Überflüssige Zeilen löschen
* {%s%}Spalte "record - datafield - subfield" / Facet / Customized facets / Facet by blank / Wert true anklicken{%ends%}
* {%s%}All / Edit rows / Remove all matching rows{%ends%}
* {%s%}Facette schließen{%ends%}
* {%s%}Modus "records" auswählen{%ends%}
OpenRefine erkennt jetzt die Datensätze anhand der PPN.

View File

@ -0,0 +1,56 @@
# 2.3.5 Für jedes MARC-Feld eine Spalte
Aktuell sind die Inhalte eines Datensatzes über viele Zeilen verteilt. Die MARC-Felder stehen untereinander in Zeilen. Wir transformieren die Daten nun so, dass die Daten wie in einer üblichen Tabelle strukturiert sind, d.h.:
* Die MARC-Felder in den Spaltenüberschriften.
* Jeder Datensatz nur über eine Zeile.
Das Vorgehen ist insbesondere bei Schritt 3 nicht besonders intuitiv. Das liegt daran, dass OpenRefine das MARC21-Format nicht "versteht" und wir jeden einzelnen Transformationsschritt selbst vorgeben müssen. Gleichzeitig demonstriert es Ihnen einige Funktionen von OpenRefine und zeigt, wie vielfältig das Werkzeug einzusetzen ist.
## Vorgehen
Schritt 1: Vorerst nicht benötigte Spalten löschen
* All / Edit columns / Re-order / remove columns...
* Spalten "record", "record - datafield", "record - datafield - ind1", "record - datafield - ind2" "record-controlfield" und "record-controlfield-tag" nach rechts schieben
Schritt 2: MARC-Felder durchgängig belegen
* Spalte "record - datafield - tag" / Edit cells / Fill down
Schritt 3: PPN aus Spalte record-leader in Spalte mit MARC-Feldern verschieben (und dafür eine neue Zeile einfügen)
* Spalte "record - leader" / Add Column based on this column...; Name für neue Spalte: ```NEU```
* Spalte "record - leader" / Transpose / Transpose cells across columns into Rows; In der zweiten Spalte ("To Column") ```NEU``` auswählen, rechts die Option "One column" auswählen und Name ```PPN``` eingeben
* Spalte "record - datafield - tag" / Facet / Customized facets / Facet by blank / Wert ```true``` auswählen und in Modus "rows" wechseln
* Spalte "record - datafield - tag" / Edit cells / Transform... / Wert ```"001"``` (also mit Anführungszeichen) eingeben und Facette schließen
* Spalte "record - datafield - tag" / Facet / Text facet / Wert ```001``` auswählen
* Spalte "record - datafield - subfield" / Edit cells / Transform... / Wert ```cells["PPN"].value``` eingeben und Facette schließen
Schritt 4: MARC-Feld mit Feld MARC-Code zusammenfassen
* Spalte "record - datafield - tag" / Edit cells / Transform... den Wert ```value + " : " + cells["record - datafield - subfield - code"].value``` eingeben
* Spalte "record - datafield - subfield - code" / Edit column / Remove this column
Schritt 5: Sortieren und Aufräumen
* Spalte "PPN" / Edit cells / Fill down
* Spalte "PPN" / Sort...
* Spalte "record - datafield - tag" / Sort...
* Im neu verfügbaren Menü "Sort" den Menüpunkt "Reorder rows permanently" auswählen
* Spalte "PPN" / Edit column / Remove this column
Schritt 6: Felder mit Mehrfachbelegungen zusammenführen
* Spalte "record - datafield - tag" / Edit cells / Blank down
* Spalte "record - datafield - subfield" / Edit cells / Join multi-valued cells und als Trennzeichen ```␟``` angeben (das Trennzeichen [Unit Separator ␟](http://unicode-table.com/en/241F/) aus dem Unicode-Zeichensatz kommt mit Sicherheit nicht in den Daten vor, daher ist dieses gut geeignet. Das Zeichen ist am einfachsten per copy & paste einzufügen).
Schritt 7: Transpose
* Spalte "record - datafield - tag" / Transpose / Columnize by key/value columns...
## Literatur zu den genutzten Funktionen
* [How can I join two datasets using a key in OpenRefine, with the secondary table having more than one value?](http://www.devsplanet.com/question/35776263) und [Cells to columns in OpenRefine](http://stackoverflow.com/questions/15187543/cells-to-columns-in-openrefine)
* [Zellen zusammenführen](http://kb.refinepro.com/2011/07/merge-2-columns-that-have-both-blank.html)
* [Trick, um neue Zeilen einzufügen](http://kb.refinepro.com/2011/12/add-extra-rows-records-in-google-refine.html)

View File

@ -28,7 +28,9 @@ Kapitel 1: Einführung ins Thema und Installation der Arbeitsumgebung
* [1.3 Grundinstallation der Arbeitsumgebung](1-3-0-grundinstallation-der-arbeitsumgebung.md)
Kapitel 2: Metadaten laden und mit OpenRefine transformieren
* ...
* [2.1 Einführung in Metadatenformate und Schnittstellen](2-1-0-einfuehrung-in-metadatenformate-und-schnittstellen.md)
* [2.2 Metadaten über eine Schnittstelle laden](2-2-0-metadaten-ueber-eine-Schnittstelle-laden.md)
* [2.3 Metadaten transformieren mit OpenRefine](2-3-0-metadaten-transformieren-mit-openrefine.md)
Kapitel 3: Transformierte Metadaten mit Solr indexieren
* ...

View File

@ -3,18 +3,32 @@
* [Einleitung](README.md)
* [Kapitel 1](1-0-einfuehrung-ins-thema-und-installation-der-arbeitsumgebung.md)
* [1.1 Einführung in Discovery-Systeme in Bibliotheken](1-1-0-einfuehrung-in-discovery-systeme-in-bibliotheken.md)
* [1.1.1 OPAC vs. Discovery-System](1-1-1-opac-vs-discovery-system.md)
* [1.1.2 Zwischenbilanz mit Problemen und Lösungsansätzen](1-1-2-zwischenbilanz-mit-problemen-und-loesungsansaetzen.md)
* [1.1.3 Marktüberblick](1-1-3-marktueberblick.md)
* [1.1.1 OPAC vs. Discovery-System](1-1-1-opac-vs-discovery-system.md)
* [1.1.2 Zwischenbilanz mit Problemen und Lösungsansätzen](1-1-2-zwischenbilanz-mit-problemen-und-loesungsansaetzen.md)
* [1.1.3 Marktüberblick](1-1-3-marktueberblick.md)
* [1.2 Open-Source-Software für Bibliothekskataloge](1-2-0-open-source-software-fuer-bibliothekskataloge.md)
* [1.2.1 Pro & Contra von Open Source](1-2-1-pro+contra-von-open-source.md)
* [1.2.2 Open Source Software zur Verarbeitung und Analyse von Metadaten](1-2-2-open-source-software-fuer-verarbeitung-von-metadaten.md) (Christensen 2014)
* [1.2.3 Auswahl der Software für das Seminar](1-2-3-auswahl-der-software-fuer-das-seminar.md)
* [1.2.1 Pro & Contra von Open Source](1-2-1-pro+contra-von-open-source.md)
* [1.2.2 Open Source Software zur Verarbeitung und Analyse von Metadaten](1-2-2-open-source-software-fuer-verarbeitung-von-metadaten.md) (Christensen 2014)
* [1.2.3 Auswahl der Software für das Seminar](1-2-3-auswahl-der-software-fuer-das-seminar.md)
* [1.3 Grundinstallation der Arbeitsumgebung](1-3-0-grundinstallation-der-arbeitsumgebung.md)
* [1.3.1 Installation der virtuellen Maschine](1-3-1-installation-der-virtuellen-maschine.md)
* [1.3.2 Einführung in die Linux Kommandozeile](1-3-2-einfuehrung-in-die-linux-kommandozeile.md)
* [1.3.3 Übung mit der Kommandozeile](1-3-3-uebung-mit-der-kommandozeile.md)
* [1.3.1 Installation der virtuellen Maschine](1-3-1-installation-der-virtuellen-maschine.md)
* [1.3.2 Einführung in die Linux Kommandozeile](1-3-2-einfuehrung-in-die-linux-kommandozeile.md)
* [1.3.3 Übung mit der Kommandozeile](1-3-3-uebung-mit-der-kommandozeile.md)
* [Kapitel 2](2-0-metadaten-laden-und-mit-openrefine-transformieren.md)
* [2.1 Einführung in Metadatenformate und Schnittstellen](2-1-0-einfuehrung-in-metadatenformate-und-schnittstellen.md)
* [2.1.1 Metadatenformate und -standards](2-1-1-metadatenformate-und-standards.md)
* [2.1.2 Initiativen zum Austausch von Metadaten](2-1-2-initiativen-zum-austausch-von-metadaten.md)
* [2.1.3 Schnittstellen des Bibliotheksverbunds GBV](2-1-3-schnittstellen-des-bibliotheksverbunds-gbv.md)
* [2.2 Metadaten über eine Schnittstelle laden](2-2-0-metadaten-ueber-eine-Schnittstelle-laden.md)
* [2.2.1 Übung: unAPI-Schnittstelle des GBV](2-2-1-uebung-unapi-schnittstelle-des-gbv.md)
* [2.2.2 Übung: Vergleich der verschiedenen Formate](2-2-2-uebung-vergleich-der-verschiedenen-formate.md)
* [2.2.3 Download der Metadaten](2-2-3-download-der-metadaten.md)
* [2.3 Metadaten transformieren mit OpenRefine](2-3-0-metadaten-transformieren-mit-openrefine.md)
* [2.3.1 Installation OpenRefine](2-3-1-installation-openrefine.md)
* [2.3.2 OpenRefine starten und Daten laden](2-3-2-openrefine-starten-und-daten-laden.md)
* [2.3.3 Facetten und Text Filter](2-3-3-facetten-und-text-filter.md)
* [2.3.4 Records bilden](2-3-4-records-bilden.md)
* [2.3.5 Für jedes MARC-Feld eine Spalte](2-3-5-fuer-jedes-marc-feld-eine-spalte.md)
* [Kapitel 3](3-0-transformierte-metadaten-mit-solr-indexieren.md)
* [Kapitel 4](4-0-prototyp-eines-katalogs-mit-typo3-find-bauen.md)
* [Kapitel 5](5-0-erweiterungsmoeglichkeiten.md)