Hilfe:Personendaten/Datenextraktion
aus Wikipedia, der freien Enzyklopädie
Die Extraktion der Personendaten und PND-Links ist entweder aus einer SQL-Datenbank oder direkt aus dem XML-Dump [1] möglich.
Inhaltsverzeichnis |
[Bearbeiten] Extraktion aus einer SQL-Datenbank
Mit einer SQL-Abfrage in der Datenbank lassen sich z.B. bei http://www.wikisign.org durch jeden Nutzer die Personendaten aus allen Wikipedia-Artikeln des letzten Datenbank-Dumps herausfiltern.
SELECT cur_namespace, cur_title, SUBSTRING(SUBSTRING(cur_text FROM INSTR(cur_text,'{{Personendaten|' )), 1, INSTR(SUBSTRING(cur_text FROM INSTR(cur_text,'{{Personendaten|' )),'}}')+1) AS 'Personendaten' FROM cur where cur_text Like "%{{Personendaten%" and cur_namespace = 0 and cur_is_redirect = 0 Limit 10
Allerdings müssen die so extrahierten Personendaten mit weiteren Skripten in einzelne Datenfelder aufgeteilt werden.
[Bearbeiten] Extraktion aus dem XML-Dump
Im folgenden wird nicht nur die Extraktion von Personendaten aus dem XML-Dump sondern ein gesamter ETL-Prozess beschrieben, mit dessen Ergebnis die Personendaten detailliert aufbereitet zur Verfügung stehen.
[Bearbeiten] Extraktion
Eine Möglichkeit zum Parsens des XML-Dumps ist hier beschrieben. Dazu werden STX- und Perl-Skripte verwendet (extractPersonendaten.stx
, pd2tab.stx
und ggf. correct-dump.pl
), die unter http://wdw.sieheauch.de/staging-area/ verfügbar sind:
XML_DUMP=pages_current.xml.gz zcat $XML_DUMP | correct-dump.pl | java -jar joost.jar -o pd.extract - extractPersonendaten.stx pd2tab.stx 2> pd.log
Als Ausgabe werden ein Logfile pd.log
mit Mitteilungen und Warnungen sowie die Tabulator-getrennte Datei pd.extract
in UTF-8-Kodierung mit den Datenfeldern der Personendaten und des Artikels aus dem sie stammen angelegt. Die Reihenfolge der Datenfelder ist folgende:
1 | pd_id | Interne Datenbank-ID des Artikels |
2 | pd_article | Name des Artikels |
3 | pd_name | NAME der Person |
4 | pd_alternative | ALTERNATIVNAMEN der Person |
5 | pd_description | KURZBESCHREIBUNG der Person |
6 | pd_born | GEBURTSDATUM |
7 | pd_born_in | GEBURTSORT |
8 | pd_died | STERBEDATUM |
9 | pd_died_in | STERBEORT |
10 | pd_pnd | PND-Nummer |
Bei Artikeln mit mehreren Personendaten oder mehreren PND-Nummern wird nur jeweils die erste Vorlage ausgewertet und eine Warnung in pd.log
geschrieben. Bei Artikeln, die nur PND-Nummer oder nur Personendaten enthalten, bleiben die übrigen Felder leer.
[Bearbeiten] Transformation
Die extrahierten und in Datenfelder aufgesplitteten Personendaten können anschließend mit Hilfe des Perl-Skriptes transform.pl
bereinigt und transformiert - beispielsweise werden die Datumsangaben ausgewertet und PND-Nummer geprüft und es wird versucht den konkreten Ort zu bestimmen, in dem eine Person geboren oder gestorben ist:
cat pd.extract | ./transform.pl > pd.tab
Die Aufbereitung der Daten führt zu einer Zunahme der Daten wobei zusätzliche Redundanzen erzeugt werden. Im Gegensatz zum herkömmlichen Datenbankentwurf ist dies jedoch nicht negativ sondern ein übliches Vorgehen beim Data-Warehousing, um anschließende Auswertungen möglich zu machen. Folgende Datenfelder werden zusätzlich zu den bei der Extraktion angelegten erzeugt.
11 | pnd_nr | geprüfte PND-Nummer |
12 | pnd_date | zusätzliche Datumsangabe bei PND-Nummern (als Kommentar) |
13 | n_given | Vorname (falls sich der Name in „Nachname, Vorname“ aufsplitten lässt) |
14 | n_surname | Nachname (falls sich der Name in „Nachname, Vorname“ aufsplitten lässt) |
15 | b_place | Artikel zum Geburtsort (falls eindeutig durch Wikilink gekennzeichnet) |
16 | d_place | Artikel zum Sterbeort (falls eindeutig durch Wikilink gekennzeichnet) |
17 | b_day | Geburtstag (1-31) |
18 | b_month | Geburtsmonat (1-12) |
19 | b_year | Geburtsjahr (Jahre vor Christus als negative Zahlen) |
20 | b_decade | Geburtsjahrzehnt (zum Beispiel „1930“) |
21 | b_century | Geburtsjahrhundert (zum Beispiel „20“) |
22 | b_year1 | Erstes Jahr der Zeitspanne, in der die Geburt liegt (falls eine Spanne angegeben) |
23 | b_year2 | Letztes Jahr der Zeitspanne, in der die Geburt liegt (falls eine Spanne angegeben) |
24 | b_note | Zusatz zum Geburtstag (beispielsweise „vermutlich“ oder „um“) |
25 | d_day | Todestag (1-31) |
26 | d_month | Sterbemonat (1-12) |
27 | d_year | Sterbejahr |
28 | d_decade | Sterbejahrzehnt |
29 | d_century | Sterbejahrhundert |
30 | d_year1 | Erstes Jahr der Zeitspanne, in der der Todestag liegt (falls eine Spanne angegeben) |
31 | d_year2 | Letztes Jahr der Zeitspanne, in der der Todestag liegt (falls eine Spanne angegeben) |
32 | d_note | Zusatz zum Todestag |
Das Datenfeld GEBURTSDATUM der Personendaten mit dem Wert „um 1181/1182“ würde beispielsweise in folgende Felder aufgeteilt:
- pd_born = um 1181/1182
- b_decade = 1180
- b_year1 = 1181
- b_year2 = 1182
- b_century = 12
- b_note = um
Die extrahierten und transformierten Personendaten werden mehr oder weniger regelmäßig auf die oben beschriebene Weise aus dem Datenbankdump erzeugt und sind unter http://tools.wikimedia.de/~voj/pd/staging-area/ verfügbar.
[Bearbeiten] Laden
Die Tabulator-getrennten Datei können bereits mit einfachen Mitteln auch ohne Datenbank ausgewertet werden. Beispielsweise liefert folgender Aufruf eine Liste aller geprüften PND-Nummern und den dazugehörigen Artikeln:
cat pd.tab | awk -F '\t' '// {if ($11) print $11" "$2}'
Umfangreichere Auswertungen sind allerdings besser in einer SQL-Datenbank möglich. Die Datei pd-schema.sql
enthält das Datenbankschema für die Tabelle pd
, in das die Daten sehr schnell mit einem bulk insert geladen werden können
LOAD DATA LOCAL INFILE 'pd.extract' INTO TABLE pd
[Bearbeiten] Auswertung
Verschiedene Auswertungen der Personendaten und PND-Links werden unter Wikipedia:Personendaten/Auswertung gesammelt. Weitere Beiträge sind erwünscht!