Updates kapitel-3/36-bonus-vergleich-mit-crosswalk-ergebnissen.md
Auto commit by GitBook Editor
This commit is contained in:
parent
f07d703479
commit
8e99b494f5
|
@ -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\):
|
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:
|
* 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`
|
`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`
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
# 3.5 Verarbeitung von MARC21 mit OpenRefine
|
# 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
|
* 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\)
|
* 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.
|
* 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 | ... |
|
| 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?
|
## 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:
|
Überlegen Sie:
|
||||||
|
|
||||||
* Welche Informationen wollen Sie generell in Ihrem Bibliothekskatalog anbieten?
|
* Welche Informationen wollen Sie in Ihrem Bibliothekskatalog anbieten?
|
||||||
* Wer soll die Hauptzielgruppe sein?
|
* Wer soll die Hauptzielgruppe sein?
|
||||||
* Welche Filtermöglichkeiten wollen Sie anbieten?
|
* Welche Filtermöglichkeiten \(Facetten\) wollen Sie anbieten?
|
||||||
* Welche Kurzinformationen sollen in der Trefferliste stehen?
|
* Welche Kurzinformationen \(Unterscheidungsmerkmale\) sollen in der Trefferliste stehen?
|
||||||
* Welche Informationen sollen in der Vollanzeige dargestellt werden?
|
* 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
|
## 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:
|
Two options:
|
||||||
|
|
||||||
* Option 1: Import marcxml (.marcxml, .xml) as XML files
|
* Option 1: Import marcxml \(.marcxml, .xml\) as XML files
|
||||||
* Option 2: Import binary marc (.mrc) as MARC files
|
* Option 2: Import binary marc \(.mrc\) as MARC files
|
||||||
|
|
||||||
Parsing options for each option:
|
Parsing options for each option:
|
||||||
|
|
||||||
* Click on ```<record>``` xml element
|
* Click on `<record>` xml element
|
||||||
|
|
||||||
Columns should look like this:
|
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
|
### Step 2: Create records
|
||||||
|
|
||||||
* Select row mode (show as: rows)
|
* Select row mode \(show as: rows\)
|
||||||
* Delete columns "record" and "record - datafield"
|
* Delete columns "record" and "record - datafield"
|
||||||
* Move column "record - leader" to the beginning
|
* 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
|
### 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"
|
* Delete column "record - controlfield - tag"
|
||||||
* Join multi-valued cells in column "record - controlfield" with separator ```␞``` (this will delete blank rows too)
|
* 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 ```""```
|
* 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
|
* Transpose cells across columns from "record - leader" to "tmp" into one column "leader" with fill down in other columns
|
||||||
* Blank down column "record - controlfield"
|
* 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"
|
* 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"
|
* 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 - tag" with expression `cells["tmp"].value.split("␟")[0]`
|
||||||
* Transform on column "record - datafield - subfield" with expression ```cells["tmp"].value.split("␟")[1]```
|
* Transform on column "record - datafield - subfield" with expression `cells["tmp"].value.split("␟")[1]`
|
||||||
* Delete column "tmp"
|
* Delete column "tmp"
|
||||||
|
|
||||||
### Step 4: Create index
|
### Step 4: Create index
|
||||||
|
|
||||||
* Move column "leader" to the end
|
* 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
|
* 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
|
### 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 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 easy way\) in column record - datafield - tag
|
||||||
* Move column "leader" to the beginning
|
* 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
|
### Step 6: Statistics
|
||||||
|
|
||||||
|
@ -108,28 +107,31 @@ Attention: These column names will be used in the following steps. Rename column
|
||||||
|
|
||||||
#### Step 7: Create columns
|
#### Step 7: Create columns
|
||||||
|
|
||||||
##### A) copy values to new columns
|
##### A\) copy values to new columns
|
||||||
|
|
||||||
* Select row mode (show as: rows)
|
* 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)
|
* 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```
|
* 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)
|
* 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 + ")"```)
|
* 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 "leader" to the end
|
||||||
* Move column "index" to the beginning
|
* 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
|
#### Step 8: Join records
|
||||||
|
|
||||||
* Move column "leader" to the beginning
|
* 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
|
#### 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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
# 3.6 Bonus: Vergleich mit Crosswalk-Ergebnissen
|
# 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.
|
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:id aus MARC 001
|
||||||
* dc:creator aus MARC 100, 110, 111, 700, 710, 711, 720
|
* 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:date aus MARC 260c
|
||||||
* dc:language aus MARC controlfield 008
|
* dc:language aus MARC controlfield 008
|
||||||
* dc:format aus MARC 856q
|
* 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:subject aus MARC 600, 610, 611, 630, 650, 653, jeweils a,b,c,d,q
|
||||||
* dc:coverage aus MARC 752a, 752b, 752c, 752d
|
* 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: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:identifier aus MARC 856u und 020a
|
||||||
* dc:rights aus MARC 506a, 540a
|
* 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/
|
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).
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue