Skip to content
Snippets Groups Projects
user avatar
Hartmut Beyer authored
d59253be
History
Name Last commit Last update
json
LICENSE
README.md

VD17-Dump

Dump der bibliographischen Metadaten aus dem VD 17. Die Daten werden über die SRU-Schnittstelle in PICA-XML geharvestet und in ein nutzerfreundliches JSON-Format umgerechnet.

Die Transformation wird laufend optimiert. Änderungs- und Ergänzungswünsche können über "Issues" eingebracht werden.

Der Dump gibt den Stand des VD 17 vom 10.01.2025 wieder.

Allgemeines

Grundlage sind die Daten für Monographien oder Teile eines mehrteiligen Werks, die über die SRU-Schnittstelle des VD 17 in PICA-XML heruntergeladen werden können.

Beispiel für das erste 500er-Set:

http://sru.k10plus.de/vd17?version=2.0&operation=searchRetrieve&query=pica.bbg=(Aa* or Af*)&maximumRecords=500&startRecord=1&recordSchema=picaxml

Das Datenmodell entspricht dem Pica3-Format, das in der Erfassungsrichtlinie von BSZ und GBV dokumentiert ist. Die Daten werden vom GBV unter der Creative Commons Lizenz CC0 zur Verfügung gestellt, s. hierzu das WikiK10plus. Die Derivate in diesem Repositorium stehen ebenfalls unter einer CC0-Lizenz. Der Quellcode zur Erzeugung des Dumps steht unter einer MIT-Lizenz.

Die Konversion erfolgt mit einem eigens entwickelten Python-Modul, dazu Näheres unter "Quellcode".

Dokumentation des Zielformats

Felder für bibliographische Einheiten

Feld Typ Inhalt
ppn String ID in der Datenbank
vdn String VD17-Nummer
bbg String Code für Bibliographische Gattung und Status s. Dokumentation
recType String Bibliographische Gattung: "Monographie", "Teilband" oder "Teilband mit eigenem Titel", errechnet aus bbg
catRule String Bei der Katalogisierung angewandtes Regelwerk, entweder "rak" oder "rda"
date String Datierung als Jahreszahl
lang String Sprachcodes nach ISO 639-2, getrennt durch ";"
langOrig String Sprachcodes der Originalsprache bei Übersetzungen
title String Titel einschließlich Untertitel
resp String Verantwortlichkeitsangabe
edition String Ausgabevermerk
format String Bibliographisches Format
pages String Kollationsvermerk
normPages Integer Normalisierte Seitenangabe. Der Algorithmus berücksichtigt Seiten- und Blattangaben, von-bis-Angaben, Ausdrücke mit "i.e." oder "das heißt" und römische Zahlen. S. die Funktion get_norm_p() unter https://github.com/hbeyer/pylib/blob/main/lib/pica.py
ppn_sup String Bei Teilen mehrbändiger Werke: ID der Gesamtaufnahme
title_sup String Bei Teilen mehrbändiger Werke: Titel der Gesamtaufnahme
vol String Bei Teilen mehrbändiger Werke: Bandangabe
digi String URLs von Digitalisaten, mehrere getrennt durch ";"
gat String Gattungsbegriffe der AAD, getrennt durch ";". Gattungsbegriffe von Teilbänden sind aus den Gesamtaufnahmen übernommen.
persons Array Personen, die als VerfasserInnen, BeiträgerInnen oder sonstige Personen erwähnt sind
publishers Array DruckerInnen und/oder VerlegerInnen
places Array Erscheinungsorte
copies Array Exemplare

Unterfelder persons

Feld Typ Inhalt
persName String Name, in der Form "Vorname, Nachname"
role String Beziehungskennzeichnung nach RDA (VerfasserIn etc.) oder DC (creator, contributor)
gnd String GND-Nummer
dateBirth String Geburtsdatum
dateDeath String Sterbedatum

Unterfelder publishers

Ist strukturiert wie persons, Feld role hat den Wert "publisher"

Unterfelder places

Feld Typ Inhalt
placeName String Ortsname
relation String Beziehungskennzeichnung: "Erscheinungsort", "Herstellungsort", "Enstehungsort" oder "Vertriebsort"

Unterfelder copies

Feld Typ Inhalt
place String Bibliotheksort
bib String Bibliothek
isil String ISIL der Bibliothek, s. ISIL-Datei
eln String ELN (External Library Number) der Bibliothek
iln String ILN (Internal Library Number) der Bibliothek
shelfmark String Signatur
epn String ID des Lokalsatzes
provenances String Provenienzinformationen, mehrere Angaben verkettet mit ";"

Beispieldatensatz

 {
  "ppn":"005973309",
  "vdn":"VD17 3:693602L",
  "permalink":"https://kxp.k10plus.de/DB=1.28/CMD?ACT=SRCHA&IKT=8079&TRM=%273:693602L%27",
  "bbg":"Aau",
  "recType":"Monographie",
  "catRule":"rak",
  "date":"1686",
  "lang":"ger",
  "title":"Theologische Send-Schreiben Von dem rechten Kirchen-gehen/ An Magr: G. S. einen Hoff-Prediger.. Darinnen auß wahrem Grunde und Verstand der Heyl: Schrifft/ wie auch nach der fürnehmsten alten und neuen Theologen ihren Zeugnissen/ kurtzlich dargethan und erwiesen wird/ wie weit/ und wie weit nicht/ das Kirchen-gehen einem Gott-suchenden Menschen nützlich und nöthig sey ; Darbey noch ein Brieff/ in welchem zu sehen/ was der rechte Adel seye",
  "resp":"Auffgesetzet von numehro Weyland Abraham von Franckenberg ... nebenst einem Verzeicnus seiner Schrifften.",
  "format":"8°",
  "pages":"[6] Bl., 95 S",
  "normPages":"107",
  "digi":"http://nbn-resolving.de/urn:nbn:de:gbv:3:1-538155",
  "gat":"Brief;Legende",
  "persons":[
   {
    "persName":"Frankenberg, Abraham",
    "role":"creator",
    "gnd":"118855050",
    "dateBirth":"1593",
    "dateDeath":"1652"
   }
  ],
  "publishers":[
   {
    "persName":"Balthasar, Wilhelm",
    "role":"publisher",
    "gnd":"1037612523"
   },
   {
    "persName":"Balthasar, Jacob",
    "role":"publisher",
    "gnd":"1037541766"
   }
  ],
  "places":[
   {
    "placeName":"Amsterdam",
    "relation":"Erscheinungsort"
   }
  ],
  "copies":[
   {
    "place":"Halle (Saale)",
    "bib":"Universitäts- und Landesbibliothek Sachsen-Anhalt",
    "isil":"DE-3",
    "eln":"0003",
    "iln":"65",
    "shelfmark":"S Tsch D0845",
    "epn":"005930863"
   },
   {
    "place":"Hannover",
    "bib":"Gottfried Wilhelm Leibniz Bibliothek - Niedersächsische Landesbibliothek",
    "isil":"DE-35",
    "eln":"0035",
    "iln":"72",
    "shelfmark":"T-A 57",
    "epn":"008409072"
   }
  ]
 }

Quellcode

Der Dump kann mit Python neu erzeugt werden. Hierfür muss zunächst der Quellcode aus dem Repositorium https://github.com/hbeyer/pylib geladen werden. Beispiel für Linux:

sudo git clone https://github.com/hbeyer/pylib

In dem dabei angelegten Verzeichnis pylib können dann Skripte mit Python 3 ausgeführt werden. Das Herunterladen der PICA-XML-Dateien und die Umrechnung in JSON geschieht durch folgendes Skript:

import logging
import pickle
from lib import sru
from lib import isil
from lib import xmlreader as xr
from lib import pica
logging.basicConfig(level=logging.INFO)

# Festlegen der Speicherpfade und der Datensätze pro JSON-Datei
source_folder = "{Ordner mit den PICAXML-Dateien}/"
source_folder_ac = "{Ordner mit den PICAXML-Dateien für Gesamtaufnahmen mehrbändiger Werke (Ac-Sätze)}/"
target_folder = "{Ordner zum Speichern der JSON-Dateien}/"
size = 1000
limit = 350000

# Laden der Ac-Sätze und Extrahieren der Gattungsbegriffe
req = sru.Request_VD17()
num = req.prepare("pica.bbg=Ac*")
print(req.url)
print(req.numFound)
req.download(source_folder_ac)

res = {}
reader = xr.DownloadReader(source_folder_ac, "record", "info:srw/schema/5/picaXML-v1.0")

for count, node in enumerate(reader):
    rec = pica.RecordVD17(node)
    gatt = [gat for gat in rec.gatt]
    if gatt == []:
        continue
    res[rec.ppn] = gatt
    if count > 100000:
        break

with open('gattungen-ac', 'wb') as file:
    pickle.dump(res, file)

# Download der PICA-XML-Daten
req = sru.Request_VD17()
num = req.prepare("pica.bbg=(Aa* or Af*)")
print(req.url)
print(req.numFound)
req.download(source_folder)

# Auslesen und Abspeichern in JSON
with open('gattungen-ac','rb') as file:
    gatt_ac = pickle.load(file)

reader = xr.DownloadReader(source_folder, "record", "info:srw/schema/5/picaXML-v1.0")

content = []
fnn = []
setn = 1
count = 0

for no, node in enumerate(reader):
    rec = pica.RecordVD17(node)
    if rec.get_rec_type() in ["Teilband", "Teilband mit eigenem Titel"]:
        try:
            rec.gatt = gatt_ac[rec.ppn_sup]
        except:
            #logging.info(f"Keine Gattungsbegriffe bei PPN {rec.ppn_sup}")
            pass
    content.append(rec)
    count += 1
    if count >= size:
        recl = pica.RecordList(content)
        fn = f"vd17-{str(setn).zfill(3)}"
        recl.to_json(target_folder + fn)
        logging.info(f"{no + 1} Datensätze abgespeichert")
        content = []
        setn += 1
        count = 0
    if no > limit:
        break
if content != []:
    recl = pica.RecordList(content)
    fn = f"vd17-{str(setn).zfill(3)}"
    recl.to_json(target_folder + fn)
    logging.info(f"{no + 1} Datensätze abgespeichert")