Heim

Hilfe:Personendaten/Datenextraktion

Die Extraktion der Personendaten und PND-Links ist entweder aus einer SQL-Datenbank oder direkt aus dem XML-Dump [1] möglich.

Inhaltsverzeichnis

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.

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.

Extraktion

Eine Möglichkeit zum Parsen 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://tools.wikimedia.de/~voj/pd/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 eine Logdatei 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.

Transformation

Die extrahierten und in Datenfelder aufgesplitteten Personendaten können anschließend mit Hilfe des Perl-Skriptes transform.pl bereinigt und transformiert werden - 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:

 ./transform.pl < pd.extract > 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.

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:

awk -F '\t' '// {if ($11) print $11" "$2}' < pd.tab

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

Auswertung

Verschiedene Auswertungen der Personendaten und PND-Links werden unter Wikipedia:Personendaten/Auswertung gesammelt. Weitere Beiträge sind erwünscht!