Informationsextraktion mit XSLT + Einbindung in eine Pythonanfrage an Wikipedia/Dbpedia Jani Takhsha HS Information Retrieval Institut für Computerlinguistik Universität Heidelberg 12. Januar 2015 1/29 1. Motivation 2. XSLT 2.1 XSLT–kurze Erklärung 2.2 einzelne Templates 3. Python 3.1 Wikipediaanfrage 3.2 Dbpediaanfrage 3.3 Mit Python XML editieren 4. Probleme und Hürden 5. weitere Aufgaben 5.1 Überblick 5.2 Plenarprotokolle 6. Ressourcen 7. Open Data Projekte 2/29 Motivation Inspiration Bundestagsradar von SPON in Zus.arbeit mit abgeordnetenwatch (Screenshot von [2]). 3/29 Motivation Input: XML Im Hintergrund: XML-Datei (von abgeordnetenwatch.de) Figure: Auszug aus der XML-Datei. (Alle Vor-und Nachnamen in den Screenshots der XML-Dateien sind anonymisiert.) 4/29 Motivation Idee Mit den Informationen über die MdBs herausfinden, mit welchen anderen Personen des öff. Lebens/der Wirtschaft sie über ihre Nebentätigkeiten vernetzt sind. 5/29 Motivation Verarbeitungsschritte Schritt 1. 2. 3. 4. 5. Input radar.xml splitnodes.xml company-Knoten Liste [Erg1, Erg2,...] Liste [P1, P2,] Modul splittnodes.xslt getcompany.py Wikipedia Dbpedia getcompany.py Output splitnodes.xml company-Knoten Liste [Erg1, Erg2,...] Liste [Person1, P2, ...] mdbknows.xml Splittnodes.xslt wird auf das erste Xml angewendet. Über das daraus transformierte XML splitnodes.xml läuft das Python-Script getcompany.py, in welchem die Datenbankabfragen erfolgen und das auch das letztendliche Output mdbknows.xml generiert. 6/29 XSLT XSLT–kurze Erklärung XSLT (Schritt 1) XSLT = EXtensible Stylesheet Language Transformation Sprache, um v.a. Xml-Dokumente zu verändern und in andere Formate zu transformieren. Xslt–Dokumente beinhalten Templates, die auf einen bestimmten Knoten eines Input–Dokuments ’gematcht’ werden. Der Pfad zu einem Knoten nennt sich XPATH. Figure: Oben links ist der XPATH zum 3. ’t’-Knoten des 1. ’person’-Knotens zu sehen (/personen/person[1]/n[1]/t[3]). 7/29 XSLT einzelne Templates XSLT: Header Relevante Knoten extrahieren (mit XSLT 2) → vereinfachte XML-Datei Figure: Header der xslt-Datei. Das Encoding ist (hier) dasselbe wie das des Input-XML und die Spezifikation für ”xsl:output” sorgt dafür, dass z.B. Umlaute richtig dargestellt werden. Die namespaces definieren, welche Sprache im Dokument verwendet wird. ’exclude-result-prefixes’ stellt sicher, dass die angegebenen Präfixe nicht in die Output-Datei ausgegeben werden. 8/29 XSLT einzelne Templates XSLT: Output (Header) Figure: Output: Encoding Wie in diesem Ausschnitt zu sehen, entspricht das Encoding des ausgegebenen XML-Files der Spezifikation in der auf der vorherigen Folie abgebildeten XSLT-Datei (windows-1252). 9/29 XSLT einzelne Templates XSLT:Template (Wurzelknoten) Figure: Wurzelknoten erstellen Ohne ’Root’ ist der Output nicht wohlgeformt! Der Slash matcht alle Knoten im Input-XML, dann werden diese in ’info’-Knoten umschlossen und die übrigen Templates auf sie angewandt. Figure: Ouput. Anfang und Ende des ausgegebenen XML-Files: Die Wurzelknoten schließen alle anderen Knoten ein. 10/29 XSLT einzelne Templates XSLT: Template (Person) Figure: Das Template matcht den Knoten ’person’. ’id’ erhält seinen eigenen Wert, der für ’name’ wird aus zwei anderen Attributwerten zusammengesetzt. Auf alle Kindknoten werden die anderen Templates angewandt. Figure: Output: Das Attribut ’id’ sowie das kombinierte Attribut ’name’ werden als einzige ’person’-Attribute ausgegeben. 11/29 XSLT einzelne Templates XSLT: Haupt-Template Figure: Das Haupt-Template matcht den Knoten t und gibt ihm das Attribut ’id’ des ’Großvaterknoten’ ’person’ (Z.22). Der Regex unterteilt den im XML-File in einem t-Knoten vorhandenen String in drei Gruppen, 1 = Name der Firma, 2 = Ort, 3 = Position des MdB. 12/29 XSLT einzelne Templates XSLT: finales Output Figure: Das vollständige tranformierte XML: Jetzt sind nur noch die für die Aufgaben notwendigen Daten da. ’Company’, ’place’ und ’pos’ sind die neu erstellten Kindknoten von ’t’. 13/29 Python Python (Schritt 2) Figure: Die company-Knoten werden mit dem Paket xml.etree.ElementTree (etree) extrahiert. ’company’ entspricht dem Knoten ’company’ im vereinfachten XML-File. 14/29 Python Wikipediaanfrage Python (Schritt 3) Wikipedia wird nach Einträgen zu den einzelnen ’company’-Knoten durchsucht. Figure: Eine Abfrage wie auf Abb. 12, diesmal mit Python. Die links, in Abb. 12 angezeigten Ergebnisse werden als Liste ausgegeben. Figure: Statt dem hier abgeb. manuellem Aufruf wird die Enzyklopädie mit dem Python-Paket ”Wikipedia” abgefragt. (siehe [9], http://de.wikipedia.org/wiki/...) 15/29 Python Dbpediaanfrage Python (Schritt 4) Die Liste mit den Titeln der möglichen Wikipages zu einer Suchanfrage soll auf Personen beschränkt werden Die Titel sind gleichzeitig Dbpedia-Label (wikilabels). Dbpedia Dbpedia benutzen, um festzustellen, ob das wikilabel eine Person bezeichnet. Wenn ja, diese Person als Kontaktperson zum entsprechenden MdB hinzufügen. 16/29 Python Dbpediaanfrage Python Figure: Dbpedia Abfrage mit SparqlWrapper. 17/29 Python Dbpediaanfrage SPARQL Figure: 1.-3.Zeile: Prefix Deklaration. 5.: Setzen der Variable ’ ?label’ as gewünschte Ausgabe. 8.: Entität soll den rdf:type ’person’ besitzen. 9.:Variable aus Z.5 als Wert des Prädikats rdfs:label setzen. 10.: Label soll in deutscher Srache sein. Das rdfs:label entspricht ’Vorname Nachname’, d.h. dem Wikilabel, d.h. dem Titel der dazugehörigen Wikipedia-Seite (s. nächste Folie). 18/29 Python Dbpediaanfrage Dbpedia Figure: Ausschnitt der DBpediaseite einer Person: links stehen die Attribute, rechts die Werte. Die eine der abgefragten Eigenschaften, ’rdf:type’, ist unten zu sehen. (siehe [10], http://de.dbpedia.org/resource/...) 19/29 Python Mit Python XML editieren XML ergänzen (Schritt 5) Figure: Der ’person’-Knoten wird für jeden Menschen, der zu seinen ’company’-Knoten gefunden wurde, um jeweils einen ’knows’-Knoten ergänzt. Auch hierfür wurde das Paket etree benutzt. 20/29 Python Mit Python XML editieren Output Figure: Ausschnitt aus dem finalen XML-File. Die (potentiellen) Kontaktpersonen des jeweiligen MdB stehen in den ’knows’–Knoten. 21/29 Probleme und Hürden Probleme und Hürden Zugriff–Limits (wikipedia, dbpedia) Daten nicht verfügbar (Infobox Mapping für Firmen vs. Infoboxen von Musikbands) Daten in falschem Format (Plenarprotokolle in PDF, bzw. unformatiertem Text) Handelsregister → zu wenig Daten, keine API 22/29 weitere Aufgaben Überblick weitere Aufgaben ALLE Label für Suchanfrage von Wikipedia zurückerhalten (siehe Mediawiki: continue) Lebensdaten von knows-Personen müssen sich mit denen des MdB überschneiden! (Disambiguieren) Encoding! (auch wichtig für Visualisierung des Graphen, csv) Graph visualisieren (mit welchen Personen ist MdB x über seine Arbeit verknüpft?) Plenarprotokolle (text) in xml/xces o.ä. transformieren Redebeiträge einzelner MdBs aus ↑ zu MdB-Datei hinzufügen Videoschnitte von ↑ zu MdB-Datei hinzufügen 23/29 weitere Aufgaben Plenarprotokolle Plenarprotokolle: kurzer Einblick in TEI Die Plenarprotokolle liegen nur in unstrukturiertem Text vor. Die Text Encoding Initative (TEI) hat Codierungsformate für verschiedene Textsorten entwickelt. Plenumsdiskussion → große Ähnlichkeit zu Theaterstück: (Redner = Sprecher, Zwischenrufe = Regieanweisung, etc) Daher: TEI-Drama 24/29 weitere Aufgaben Plenarprotokolle Plenarprotokolle in TEI-drama Figure: Bsp. von für Dramen gedachtem TEI-Drama auf Plenarprotokoll. 25/29 Ressourcen Ressourcen I [1] Abgeordnetenwatch: http://www.abgeordnetenwatch.de/, (12.01.2015) [2] Bundestagsradar: http://www.spiegel.de/flash/flash-22868.html, (12.01.2015) [3] XML Parser: http://www.saxonica.com/, (12.01.2015) [4] ElementTree Overview: http://effbot.org/zone/element-index.htm, (12.01.2015) 26/29 Ressourcen Ressourcen II [5] A Pythonic wrapper for the Wikipedia API: https://github.com/goldsmith/Wikipedia, (12.01.2015) [6] RDFLib is a Python library for working with RDF: https://github.com/RDFLib/rdflib, (12.01.2015) [7] SPARQL Endpoint interface to Python (1.6.4): http://rdflib.github.io/sparqlwrapper/, (12.01.2015) [8] Text Encoding Initiative: http://www.tei-c.org/index.xml, (12.01.2015) [9] Deutsche Wikipedia: http://de.wikipedia.org/wiki/ (12.01.2015) 27/29 Ressourcen Ressourcen III [10] Deutsche Dbpedia: http://de.dbpedia.org/ (12.01.2015) 28/29 Open Data Projekte Links zu Open Data Projekten http://www.bundestag.de/xml/mdb/index.xml (12.01.2015) http://www.bundestag.de/plenarprotokolle (12.01.2015) http://bundestube.de/ (12.01.2015) http://offenesparlament.de/ (12.01.2015) http://parser.theyworkforyou.com/members.html (wie ↑, UK), (12.01.2015) http://www.opensecrets.org/resources/ (wie ↑, US), (12.01.2015) http://teibyexample.org/modules/TBED05v00.htm (12.01.2015) 29/29