Kapitel 5 ergänzt

This commit is contained in:
Felix Lohmeier 2017-05-22 10:15:09 +02:00
parent 2046b3aad9
commit f2a5ce0a3f
5 changed files with 353 additions and 5 deletions

View File

@ -1,8 +1,8 @@
# 5 Erweiterungsmöglichkeiten
Ziel: ...
Ziel: Vertiefung der erlernten Techniken.
Bitte nehmen Sie sich für die folgenden Abschnitte insgesamt etwa 8 Stunden Zeit:
Bitte wählen Sie einen der folgenden Abschnitte und nehmen Sie sich dafür etwa 8 Stunden Zeit:
* [...]()
* [...]()
* [Zusätzliche Daten über OAI-Schnittstelle](5-1-zusaetzliche-daten-ueber-oai-schnittstelle.md)
* [Relevanzranking mit TYPO3-find und Solr](5-2-relevanzranking-mit-typo3-find-und-solr.md)

View File

@ -0,0 +1,116 @@
# 5.1 Zusätzliche Daten über OAI-Schnittstelle
Über das Protokoll [OAI-PMH](http://www.openarchives.org/OAI/openarchivesprotocol.html) (Open Archives Initiative Protocol for Metadata Harvesting) können Metadaten vieler Repositorien heruntergeladen werden. Eine standardkonforme OAI-Schnittstelle unterstützt mindestens das Ausgabeformat Dublin Core, oft werden zusätzliche Formate wie MARC oder MODS unterstützt. Über weitere Variablen kann die Abfrage nach Datum oder Teilbeständen gesteuert werden.
In dieser Aufgabe laden Sie Daten via OAI-PMH aus einem Repositorium, bearbeiten Sie mit OpenRefine und indexieren die Daten im Suchindex.
Das internationale Forschungsdatenrepository [Zenodo](http://www.zenodo.org) bietet eine gut implementierte OAI-Schnittstelle, die auch über den Browser "erkundet" werden kann:
* Schnittstelle: https://zenodo.org/oai2d?verb=Identify
* Dokumentation: http://developers.zenodo.org/#oai-pmh
Beispiel "European Commission Funded Research (OpenAIRE)":
* In dieser Community liegen etwa 3.800 Dokumente, wie eine Suche zeigt: https://zenodo.org/communities/ecfunded/search?page=1&size=20
* Auf der [Übersichtsseite der Community](https://zenodo.org/communities/ecfunded/) steht ein Link zu Informationen für das Harvesting über OAI-PMH. In der URL selbst sind die Parameter abzulesen, die benötigt werden. Beispiel: https://zenodo.org/oai2d?verb=ListRecords&set=user-ecfunded&metadataPrefix=oai_dc. Daran können Sie ablesen, dass das Set "user-ecfunded" heißt.
## 1. OAI Harvesting
Es gibt sehr viele Clients, um OAI-Schnittstellen abzufragen. VuFind hat beispielsweise einen umfangreichen [OAI-Harvester](https://github.com/vufind-org/vufindharvest) integriert, der auch eigenständig benutzt werden kann. Wir nutzen für diese Aufgabe einen schlanken kommandozeilenbasierten Client, der in Python geschrieben wurde: https://github.com/bloomonkey/oai-harvest. Der Entwickler heißt John Harrison und arbeitet an der Universität von Liverpool.
### 1.1 Installation:
```
sudo apt-get install sqlite3 python3-pip
sudo python3 -m pip install git+https://github.com/infrae/pyoai.git
sudo python3 -m pip install git+http://github.com/bloomonkey/oai-harvest.git#egg=oaiharvest
```
### 1.2 Download:
```
mkdir zenodo
oai-harvest https://zenodo.org/oai2d -s user-ecfunded -p oai_dc -d zenodo
```
### 1.3 Die Dateien sollten nun im "Persönlichen Ordner" im Unterverzeichnis "zenodo" liegen. 3800 Einzeldateien in OpenRefine zu laden schlägt leicht fehl, daher ist es sinnvoll diese Dateien vorher ein Zip-Archiv zu packen und dann diese Zip-Datei in OpenRefine zu laden:
```
zip -r zenodo.zip zenodo
```
## 2. Verarbeitung mit OpenRefine
### 2.1 OpenRefine starten
```~/openrefine-2.7-rc.2/refine```
### 2.2 Projekt erstellen
Zip-Datei hochladen und bei der Auswahl des Pfads auf die erste Zeile (<oai_dc...>) klicken
### 2.3 Spalten umbenennen, damit Sie auf die Felder im Schema des Suchindex passen (z.B. "oai_dc:dc - dc:title" in "Titel" umbenennen). Dabei müssen Sie Bezeichnungen verwenden, die im Schema vorhanden sind:
* Titel
* Urheber
* Medientyp
* Sprache
* Jahr
* Link
Für den Import in Solr ist zudem eine Spalte "id" zwingend technisch notwendig. Diese kann aus der Spalte "File" gebildet werden. Weitere mögliche Felder können Sie dem Schema unter http://localhost:8983/solr/#/gettingstarted/schema entnehmen.
### 2.4 Überflüssige Spalten löschen
### 2.5 Mehrfachbelegungen
* Spalte id (ehemals File) / Blank down
* Spalten mit Mehrfachbelegungen zusammenführen mit Edit cells / Join multi-valued cells.... Wählen Sie dabei ein Trennzeichen, dass nicht in den Daten vorkommt. Am besten das Sonderzeichen Unit Separator ␟
http://unicode-table.com/en/241F/
* Leere Zeilen löschen
### 2.6 Daten exportieren als TSV
* Es sollten jetzt 3805 Zeilen sein.
* Menü Export / Tab-separated value. Datei wird vom Firefox Browser im Ordner Downloads gespeichert.
* OpenRefine beenden: ```STRG```+```C``` im Terminal, in dem OpenRefine läuft
## 3. Daten in Suchindex laden
### 3.1 Solr starten
```~/solr-6.5.0/bin/solr start -s ~/solr-6.5.0/example/schemaless/solr```
### 3.2 Daten laden
Wechseln Sie in der Kommandozeile in das Verzeichnis mit den gespeicherten Daten (z.B. mit ```cd Downloads```) und geben Sie dann den folgenden Befehl zum Laden der Daten ein. In dem Befehl muss der Dateiname der zu importierenden Datei angegeben werden, also: ```test.tsv``` durch den Dateinamen der mit OpenRefine exportierten Datei ersetzen.
```curl "http://localhost:8983/solr/gettingstarted/update/csv?commit=true&separator=%09" --data-binary @test.tsv -H 'Content-type:text/plain; charset=utf-8'```
Falls Sie eine Fehlermeldung "Error adding field 'Jahr'='2014-09-21'" erhalten, dann liegt das daran, dass in unserem Schema im Feld Jahr nur Nummern zugelassen sind. In diesem Fall müssen Sie das Projekt noch einmal in OpenRefine laden, die Trennzeichen im Feld Jahr entfernen (z.B. mit der Transformation ```value[0,4]``` und die Datei nochmal exportieren.
Wenn Sie mehrfachbelegte Felder aufsplitten wollen, müssen Sie die URL innerhalb der Anführungszeichen (mehrfach) ergänzen. Beispiel für Titel:
```&f.Titel.split=true&f.Titel.separator=%E2%90%9F```
Vollständiger Befehl für Beispiel Titel:
```curl "http://localhost:8983/solr/gettingstarted/update/csv?commit=true&separator=%09&f.Titel.split=true&f.Titel.separator=%E2%90%9F" --data-binary @test.tsv -H 'Content-type:text/plain; charset=utf-8'```
## 3.3 TYPO3 Ergebnis prüfen
http://localhost in der virtuellen Maschine aufrufen, um den Katalog anzuzeigen
Die Facetten funktionieren nicht, wenn dort Sonderzeichen wie ```:``` oder ```&``` enthalten sind. Diese müssen in OpenRefine entfernt oder ersetzt werden.
Der Befehl zum Leeren des gesamten Suchindex lautet:
```
curl "http://localhost:8983/solr/gettingstarted/update?commit=true&stream.body=%3Cdelete%3E%3Cquery%3E*%3A*%3C/query%3E%3C/delete%3E"
```
Anschließend können Sie die Daten neu indexieren (siehe oben Schritt 3.2)
## Literatur
* Open Archives Initiative Protocol for Metadata Harvesting: http://www.openarchives.org/OAI/openarchivesprotocol.html
* OAI-Schnittstelle der Deutschen Nationalbibliothek: http://www.dnb.de/DE/Service/DigitaleDienste/OAI/oai_node.html
* OAI-Schnittstelle von Zenodo: http://developers.zenodo.org/#oai-pmh

View File

@ -0,0 +1,229 @@
# 5.2 Relevanzranking mit TYPO3-find und Solr
TYPO3-find basiert auf dem Suchindex Solr, weshalb für das Relevanzranking die Konfigurationsmöglichkeiten von Solr genutzt werden können. Eine Verbesserung der Relevanzsortierung von Trefferlisten kann in der Praxis bereits durch eine einfache Gewichtung der Felder erzielt werden.
* Relevanz ist abhängig vom Nutzungskontext, d.h. von der Person, die sucht und von ihrem Erkenntnisinteresse zum jeweiligen Zeitpunkt.
* Discovery-Systeme versuchen eine subjektiv als "gut" empfundene Relevanzsortierung durch eine unterschiedliche Gewichtung der verschiedenen Metadatenfelder (Titel, UrheberIn, Beschreibungstext) herzustellen.
* Wenn die Daten uneinheitlich sind (z.B. wenn zu einem Objekt viele und zu einem anderen Objekt sehr wenige beschreibende Daten vorliegen), dann führt dies oft zu unerwarteten Rankings, weil der Suchindex in der Standardkonfiguration das Verhältnis der Suchtreffer in einem Dokument zur Gesamtlänge des Dokuments in die Berechnung der Relevanzsortierung einfließen lässt.
* Weil die Definition eines Algorithmus auf Basis von objektiven Kriterien so schwer fällt, wird in der Praxis die Gewichtung der Felder oft experimentell auf Basis von häufig durchgeführten Suchen austariert. Nutzerstudien sind beim Relevanzranking also besonders wichtig.
## 1. Solr Schema anpassen und neu indexieren
Die Suchabfragen werden in Solr durch einen Parser interpretiert. Der voreingestellte Parser erlaubt keine einfache Gewichtung von Feldern, daher nutzen wir den sogenannten "eDismax" Parser.
Weil dieser nicht mit Feldern funktioniert, die als "string" konfiguriert sind, müssen wir zunächst das Schema ändern. Dafür nutzen wir die [Schema API](https://cwiki.apache.org/confluence/display/solr/Schema+API).
### 1.1 Solr starten
```
~/solr-6.5.0/bin/solr start -s ~/solr-6.5.0/example/schemaless/solr
```
### 1.2 Schema ändern
```
curl -X POST -H 'Content-type:application/json' --data-binary '{
"replace-field":[
{ "name":"ISBN",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"DDC",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"Datum",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"LCC",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"ISSN",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"Urheber",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"Titel",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"Medientyp",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": false },
{ "name":"Sprache",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"Ort",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"Verlag",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"Jahr",
"type":"tlong",
"stored":true,
"indexed": true,
"docValues": false,
"multiValued": false },
{ "name":"Beschreibung",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"Schlagwoerter",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"Beitragende",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"Reihe",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"Vorgaenger",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"Nachfolger",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true },
{ "name":"Link",
"type":"text_general",
"stored":true,
"indexed": true,
"multiValued": true }]
}' http://localhost:8983/solr/gettingstarted/schema
```
### 1.3 Core neu laden, damit die Konfigurationsänderung wirksam wird
```
curl "http://localhost:8983/solr/admin/cores?action=RELOAD&core=gettingstarted"
```
### 1.4 Index leeren
```
curl "http://localhost:8983/solr/gettingstarted/update?commit=true&stream.body=%3Cdelete%3E%3Cquery%3E*%3A*%3C/query%3E%3C/delete%3E"
```
### 1.5 Neu indexieren (dauert 5-10 Minuten...)
```
curl "http://localhost:8983/solr/gettingstarted/update/csv?commit=true&separator=%09&f.ISBN.split=true&f.ISBN.separator=%E2%90%9F&f.ISSN.split=true&f.ISSN.separator=%E2%90%9F&f.Sprache.split=true&f.Sprache.separator=%E2%90%9F&f.LCC.split=true&f.LCC.separator=%E2%90%9F&f.DDC.split=true&f.DDC.separator=%E2%90%9F&f.Urheber.split=true&f.Urheber.separator=%E2%90%9F&f.Ort.split=true&f.Ort.separator=%E2%90%9F&f.Verlag.split=true&f.Verlag.separator=%E2%90%9F&f.Datum.split=true&f.Datum.separator=%E2%90%9F&f.Beschreibung.split=true&f.Beschreibung.separator=%E2%90%9F&f.Schlagwoerter.split=true&f.Schlagwoerter.separator=%E2%90%9F&f.Beitragende.split=true&f.Beitragende.separator=%E2%90%9F&f.Reihe.split=true&f.Reihe.separator=%E2%90%9F&f.Vorgaenger.split=true&f.Vorgaenger.separator=%E2%90%9F&f.Nachfolger.split=true&f.Nachfolger.separator=%E2%90%9F&f.Link.split=true&f.Link.separator=%E2%90%9F&f.Titel.split=true&f.Titel.separator=%E2%90%9F" --data-binary @hsh-ksf.tsv -H 'Content-type:text/plain; charset=utf-8'
```
## 2. TYPO3-Find Konfiguration erweitern
Auch hier muss der Parser eDismax in der Konfiguration aktiviert werden. Rufen Sie dazu die TYPO3-Administrationsoberfläche in der virtuellen Maschine auf http://localhost/typo3/ und wählen Sie im Menü List / Seite "Home" das Template "Main TypoScript Rendering". Ersetzen Sie dort den vorhandenen Eintrag im Textfeld Setup durch folgenden Abschnitt und drücken Sie anschließend den Save-Button:
```
page = PAGE
page.100 < styles.content.get
page.javascriptLibs.jQuery = 1
page.includeJS.find = EXT:find/Resources/Public/JavaScript/find.js
plugin.tx_find.features.requireCHashArgumentForActionArguments = 0
plugin.tx_find.settings {
connections {
default {
options {
host = localhost
port = 8983
path = /solr/gettingstarted
}
}
}
standardFields {
title = Titel
snippet = Urheber
}
facets {
10 {
id = Medientyp
field = Medientyp
sortOrder = count
}
20 {
id = Sprache
field = Sprache
sortOrder = count
}
30 {
id = Jahr
field = Jahr
sortOrder = count
}
}
features {
eDisMax = 1
}
}
```
## 3. Relevanzranking einstellen
Im folgenden Befehl sind alle Felder mit Faktor 1 gewichtet. Variieren Sie die Zahlen und entfernen Sie Felder, die Sie aus dem Relevanzranking ausschließen wollen. Die Änderungen werden erst wirksam, wenn Sie den Index neu laden. Prüfen Sie die Ergebnisse im Katalog, machen Sie Beispielsuchen und nähern Sie sich Stück für Stück einem effektiven Relevanzranking an.
### 3.1 Konfiguration ändern
```
curl http://localhost:8983/solr/gettingstarted/config -H 'Content-type:application/json' -d '{
"update-requesthandler": {
"name": "/select",
"class":"solr.SearchHandler",
"defaults":{
"echoParams":"explicit",
"rows":"10"
},
"appends":{
"defType":"edismax",
"qf":"ISBN^1 DDC^1 Datum^1 LCC^1 ISSN^1 Urheber^1 Titel^1 Medientyp^1 Sprache^1 Ort^1 Verlag^1 Jahr^1 Beschreibung^1 Schlagwoerter^1 Beitragende^1 Reihe^1 Vorgaenger^1 Nachfolger^1 Link^1"
}
}
}'
```
### 3.2 Core neu laden, damit die Konfigurationsänderung wirksam wird
```
curl "http://localhost:8983/solr/admin/cores?action=RELOAD&core=gettingstarted"
```
### 3.3 Ergebnis prüfen
http://localhost
## Literatur
* Präsentation von Elmar Haake: Relevanzranking als Erfolgsfaktor für Discoverysysteme. http://docplayer.org/3530893-Relevanzranking-als-erfolgsfaktor-fuer-discoverysysteme-elmar-haake-staats-und-universitaetsbibliothek-bremen.html
* Hajo Seng: Relevance-Ranking auf dem VuFind-Anwendertreffen (siehe die dort verlinkten Papiere und Vortragsfolien). http://beluga-blog.sub.uni-hamburg.de/blog/2015/10/02/relevance-ranking-auf-dem-vufind-anwendertreffen-2015/
* Solr/Lucene Score Tutorial: http://www.openjems.com/solr-lucene-score-tutorial/
* The Extended DisMax Query Parser: https://cwiki.apache.org/confluence/display/solr/The+Extended+DisMax+Query+Parser

View File

@ -39,7 +39,8 @@ Kapitel 4: Prototyp eines Katalogs mit TYPO3-find bauen
* [4.2 Zwischenfazit](4-2-0-zwischenfazit.md)
Kapitel 5: Erweiterungsmöglichkeiten
* ...
* [5.1 Zusätzliche Daten über OAI-Schnittstelle](5-1-zusaetzliche-daten-ueber-oai-schnittstelle.md)
* [5.2 Relevanzranking mit TYPO3-find und Solr](5-2-relevanzranking-mit-typo3-find-und-solr.md)
## Lerntagebücher

View File

@ -47,5 +47,7 @@
* [4.2.1 Was haben wir im Seminar erreicht?](4-2-1-was-haben-wir-im-seminar-erreicht.md)
* [4.2.2 Was fehlt noch für einen Produktivbetrieb?](4-2-2-was-fehlt-noch-fuer-einen-produktivbetrieb.md)
* [Kapitel 5](5-0-erweiterungsmoeglichkeiten.md)
* [5.1 Zusätzliche Daten über OAI-Schnittstelle laden und mit OpenRefine verarbeiten](5-1-zusaetzliche-daten-ueber-oai-schnittstelle.md)
* [5.2 Relevanzranking mit TYPO3-find und Solr konfigurieren](5-2-relevanzranking-mit-typo3-find-und-solr.md)
* [Lerntagebücher](lerntagebuecher.md)
* [Prüfungsleistungen](pruefungsleistungen.md)