Updates kapitel-3/36-bonus-vergleich-mit-crosswalk-ergebnissen.md

Auto commit by GitBook Editor
This commit is contained in:
Felix Lohmeier 2017-11-02 12:09:39 +00:00
parent f07d703479
commit 8e99b494f5
3 changed files with 58 additions and 44 deletions

View File

@ -2,7 +2,7 @@
Als Testdaten laden wir zunächst alles was der NEBIS-Verbund zum Suchbegriff `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%5B%5D=%7Eunion%3A%22NEBIS%22)
* 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`

View File

@ -1,13 +1,12 @@
# 3.5 Verarbeitung von MARC21 mit OpenRefine
Ein möglicher Weg zum Laden von Metadaten in den Suchindex Solr ist die Transformation der bibliothekarischen Metadaten in eine klassische Tabellenstruktur:
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:
* 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\)
* OpenRefine bietet als Export vorrangig CSV oder TSV an. Das kann der Suchindex Solr problemlos indexieren.
Nach der Transformation könnten die Daten beispielsweise so aussehen:
Nach der Transformation könnten die Daten beispielsweise so aussehen:
| id | Titel | AutorInnen | ... |
| :--- | :--- | :--- | :--- |
@ -19,19 +18,19 @@ Natürlich könnten wir auch mit einem anderen Werkzeug \(z.B. XSLT\) direkt XML
## Eigenes Schema oder einem Metadatenstandard folgen?
Es ist sicher klar, dass wir nicht die umständlichen MARC-Zahlen und Codes übernehmen wollen, sondern sprechende Namen wie TItel, AutorInnen usw. nutzen wollen. Doch welche Daten brauchen wir genau in welcher Form für den Katalog?
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?
Überlegen Sie:
* Welche Informationen wollen Sie generell in Ihrem Bibliothekskatalog anbieten?
* Welche Informationen wollen Sie in Ihrem Bibliothekskatalog anbieten?
* Wer soll die Hauptzielgruppe sein?
* Welche Filtermöglichkeiten wollen Sie anbieten?
* Welche Kurzinformationen sollen in der Trefferliste stehen?
* Welche Filtermöglichkeiten \(Facetten\) wollen Sie anbieten?
* 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. Bei der Datentransformation haben Sie die Chance einige Unstimmigkeiten zu bereinigen und Informationen klug zu aggregieren, so dass die Datenquellen vergleichbar 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 Datenquellen 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 angenehm übersichtlich sind die Felder. Wenn Sie die passenden MARC-Felder nicht kennen, 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 folgen Sie einfach 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
@ -39,12 +38,12 @@ Haben Sie eigene Vorstellungen? Falls nicht, dann orientieren Sie sich an [Dubli
Two options:
* Option 1: Import marcxml (.marcxml, .xml) as XML files
* Option 2: Import binary marc (.mrc) as MARC files
* Option 1: Import marcxml \(.marcxml, .xml\) as XML files
* Option 2: Import binary marc \(.mrc\) as MARC files
Parsing options for each option:
* Click on ```<record>``` xml element
* Click on `<record>` xml element
Columns should look like this:
@ -63,42 +62,42 @@ Attention: These column names will be used in the following steps. Rename column
### Step 2: Create records
* Select row mode (show as: rows)
* Select row mode \(show as: rows\)
* Delete columns "record" and "record - datafield"
* Move column "record - leader" to the beginning
<http://kb.refinepro.com/2012/06/create-records-in-google-refine.html>
[http://kb.refinepro.com/2012/06/create-records-in-google-refine.html](http://kb.refinepro.com/2012/06/create-records-in-google-refine.html)
### Step 3: Extract data from controlfields
* Transform on column "record - controlfield" ```cells["record - controlfield - tag"].value + "␟" + value```
* 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 ```""```
* 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 ```␞```
* 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]```
* 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"
### Step 4: Create index
* Move column "leader" to the end
* Add column "index" based on column "record - datafield - tag" with expression ```forNonBlank(value,v,row.record.index,null)```
* Add column "index" based on column "record - datafield - tag" with expression `forNonBlank(value,v,row.record.index,null)`
* Move column "index" to the beginning
<http://kb.refinepro.com/2012/06/creating-row-and-record-index.html>
[http://kb.refinepro.com/2012/06/creating-row-and-record-index.html](http://kb.refinepro.com/2012/06/creating-row-and-record-index.html)
### Step 5: Fill down
* 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
* 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
<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](http://kb.refinepro.com/2012/03/fill-down-right-and-secure-way.html)
### Step 6: Statistics
@ -108,28 +107,31 @@ Attention: These column names will be used in the following steps. Rename column
#### Step 7: Create columns
##### A) copy values to new columns
##### A\) copy values to new columns
* 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```
* 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\) transform values in new columns
* 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 + ")"```)
* 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\) join values in each new column
* Move column "leader" to the end
* Move column "index" to the beginning
* Join multi-valued cells in new column with separator ``` ``` (space)
* Join multi-valued cells in new column with separator ` ` \(space\)
#### Step 8: Join records
* Move column "leader" to the beginning
* Join multi-valued cells in each new column with separator ```␟```
* Join multi-valued cells in each new column with separator `␟`
#### Step 9: Export
* Use Export / Custom tabular exporter, select relevant columns and download file
* Use Export / Custom tabular exporter, select relevant columns and download file

View File

@ -1,10 +1,10 @@
# 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>
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)
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.
Folgende Regeln stehen grob darin:
Folgende Regeln stehen \(leicht vereinfacht\) darin:
* dc:id aus MARC 001
* dc:creator aus MARC 100, 110, 111, 700, 710, 711, 720
@ -14,18 +14,30 @@ Folgende Regeln stehen grob darin:
* 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: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
Sie können übrigens ein solches XSL-Stylesheet mit einem XSLT-Prozessor auf der Kommandozeile direkt auf die heruntergeladenen Marc-Daten anwenden
## Anwendung des XSL-Stylesheets von Swissbib mit Live-Editor xsltransform.net
Rufen Sie den Live-Editor [xsltransform.net](http://www.xsltransform.net) auf.
1. Kopieren Sie den Inhalt einer der in Kapitel 3.3 heruntergeladenen XML-Dateien in das obere Textfeld.
2. Kopieren Sie den Inhalt des [XSL-Stylesheets](http://sru.swissbib.ch/sru/xslfiles/MARC21slim2OAIDC.swissbib.xsl) in das mittlere Textfeld.
3. Das Ergebnis ist nach wenigen Sekunden im unteren Textfeld einsehbar und kann als Datei gespeichert werden.
## Anwendung des XSL-Stylesheets von Swissbib auf der Kommandozeile
Sie können übrigens ein solches XSL-Stylesheet mit einem XSLT-Prozessor auf der Kommandozeile direkt auf die heruntergeladenen Marc-Daten anwenden. Öffnen Sie den Ordner mit ihren XML-Dateien, rufen Sie dort die Kommandozeile auf \(Rechtsklick: "Im Terminal öffnen"\) und geben Sie folgende Befehle ein:
```
wget http://sru.swissbib.ch/sru/xslfiles/MARC21slim2OAIDC.swissbib.xsl
mkdir dc/
for i in *.xml; do xsltproc -o dc/$i.xml MARC21slim2OAIDC.swissbib.xsl; done
for i in *.xml; do xsltproc -o dublincore/$i.xml MARC21slim2OAIDC.swissbib.xsl; done
```
Laden Sie das Transformationsergebnis (Dublin Core als XML) in OpenRefine und vergleichen Sie es mit den MARC-Daten.
Die Ergebnisse \(Dublin Core als XML\) finden Sie jetzt im Unterordner `dublincore`. Laden Sie eine oder mehrere der Dateien in OpenRefine und vergleichen Sie diese mit Ihrem Ergebnis aus [Kapitel 3.5](/kapitel-3/35-verarbeitung-von-marc21-mit-openrefine.md).