Wer klatscht für wen im Bundestag?

Seit dieser Wahlperiode können die Plenarsitzungen des Bundestages als strukturierte Daten im XML-Format heruntergeladen werden. Dieser Umstand hat mich neugierig gemacht und ich wollte schauen welche interessanten Informationen aus diesen Daten erschlossen werden können. Ich habe einige Bundestagsdebatten gesehen und faszinierend war für mich wer für wen klatscht. Ich fragte mich ob wohl die AfD überhaupt Beifall bekommt und wenn ja von wem. Gibt es Parteien die sich gegenseitig mehr Applaus geben?

In den Daten der Plenarsitzungen sind Kommentare aus dem Publikum erfasst, hierbei wird auch der Beifall mit aufgeschrieben. Es wird unterschieden zwischen der gesamten, einigen Abgeordneten oder eines einzelnen Abgeordneten einer Fraktion. Alle von mir genutzten Daten sind unter http://www.bundestag.de/service/opendata zu finden. Die berücksichtigten Daten sind alle Plenarsitzungen von beginn der Legislaturperiode bis zum 22.3.2018.

Vorbereitung

Um die Daten besser erforschen zu können wurden die Daten in eine Datenbank überführt. Das unten aufgeführte Entity-Relationship-Diagramm wurde von mir eigenst erstellt um die für mich interessanten Aspekte der Sitzungen ablegen zu können.

Datenbank Modell für Plenarsitzungen im Bundestag

Eine Rede hat einen Redner der Mitglied einer Fraktion ist. Die Rede gehört zu einem Tagesordnungspunkt von denen mehrere in einer Sitzung abgehandelt werden. Eine Rede wird in mehrere Absätze untergliedert zwischen denen Reaktionen in Form von Zurufen, Applaus oder Bemerkung des Bundestagspräsidenten oder einem seiner Vertreter auftreten können.
Da bereits eine MySql Datenbank auf meinem System vorhanden war wurde diese benutzt. Von MySql wird ein Python Interface angeboten das ärgerlicherweise seit langer Zeit (2015) nicht mehr überholt wurde. So ist die höchste nutzbare Python Version 3.45 und das Interface lässt sich auch nur hinzufügen wenn der Windows Installer genutzt wurde. Somit war eine einfache Nutzung zusammen mit Anaconda nicht möglich. Zum Glück gibt es andere Packages die ebenfalls in der Lage sind mit MySql zu kommunizieren hierbei möchte ich pymysql hervorheben da die API fast identisch ist und ich den gesamten Programmcode praktisch nicht überarbeiten musste nachdem ich auf dieses Package umgestiegen bin.
Die Daten konnte nun in die von mir erstellten Tabellen überführt werden.

Ergebnisse

Nun zum interessanten Teil dieses Beitrags.

Jede Fraktion klatscht für sich

Die Diagramme zeigen in Blau Applaus von der gesamten Fraktion und in Orange Applaus von einem bis einigen Abgeordneten. Zu sehen ist das jede Fraktion für sich am meisten klatscht, was auch nachvollziehbar ist. Zu erwarten war auch das die AfD von den anderen Fraktionen wenig bis gar keinen Applaus bekommt. Die Stellen an denen Applaus gegeben wurde lassen sich nicht zwangsläufig als Zustimmung interpretieren, so ist es auch möglich das Bemerkungen aus dem Publikum mit Applaus bedacht werden. Bei der weiteren Untersuchung der Daten ist eine weitere Diskriminierung des Beifalls möglicherweise machbar.
Die LINKE klatscht am liebsten für die GRÜNEN und die SPD, bekommt allerdings nicht so viel Beifall zurück. Somit sind beide Fraktionen am rechten und linken Ende des politischen Spektrums Außenseiter. Auch merkwürdig ist, dass die GRÜNEN wenn sie Beifall geben fast ausschließlich gemeinsam applaudieren.
Interessanterweise bekommen CDU/CSU am meisten Beifall von sich und anderen Fraktionen. Dies lässt sich nicht unmittelbar damit erklären das hier die meisten Sitze vergeben wurden. Jede andere Fraktion könnte ebenso viel für die eigenen Abgeordneten klatschen nur tun sie dies nicht. Die FDP scheint sich noch immer als Bruder im Geiste mit der CDU/CSU zu verstehen, von ihr bekommt die CDU/CSU am meisten Applaus.

Die meist applaudierten Reden

Die 6 Reden mit dem meisten Applaus wurden herausgefiltert und genauer betrachtet. Unter den sechs Reden sind zwei von Frauen und 4 von Männern. Bei 4 dieser Reden handelt es sich um Anträge der AfD. In jeder dieser Reden wird die AfD thematisiert, in den 4 Reden zu den Anträgen der AfD ist dies quasi notwendig da über diesen Antrag diskutiert wird. In den anderen beiden Reden über Antisemitismus und Rechtsextremismus, ohne Antrag der AfD, wird diese allerdings häufiger als Negativbeispiel erwähnt.
Jedes Thema mit der Ausnahme von vielleicht „Deutsch als Landessprache“ ist ein brisantes, bei dem eine emotionale Debatte vorstellbar ist. Die Rede von Herrn Saathoff, zum Thema „Deutsch als Landessprache“ wurde auf Plattdeutsch gehalten dies mag zu dem vermehrten Beifall aber auch womöglich zum geringerem Verständnis beigetragen haben.
Wie auch schon in Summe für alle Reden applaudiert hier immer die gesamte Fraktion für den eigenen Redner, mit einer kleinen Ausnahme für Nadine Schön die von ihrer Fraktion nicht die ganzen 100% Beifall bekommen hat. Herausragen tun außerdem die Reden von Özdemir und von Notz die beide sehr laut und aggressiv in Richtung AfD gerichtet wurden.

79 mal Beifall für Kerstin Griese(CDU/CSU) am 18.1.2018 Thema: Antisemitismus

71 mal Beifall für Cem Özdemir(GRÜNE) am 22.2.2018 Thema: Deniz Yücel

61 mal Beifall für Konstantin von Notz(GRÜNE) am 23.2.2018 Thema: Rechtsextremismus

64 mal Beifall für Nadine Schön(CDU/CSU) am 18.1.2018 Thema: Gleichberechtigung Frauen

57 mal Beifall für Alexander Throm(CDU/CSU) am 22.2.2018 Thema: Denis Yücel

58 mal Beifall für Johann Saathoff(SPD) am 2.3.2018 Thema: Deutsch als Landessprache

Fazit

Die Daten der Bundestagssitzungen sind durch das strukturierte Datenformat nun sehr gut statistisch auszuwerten. Der Einsatz einer relationalen Datenbank war für diesen Anwendungsfall zweckmäßig und funktionierte Reibungslos. Die Verbindung mit Python war einfach und Resultate auf Anfragen aus der Datenbank konnten bequem und schnell weiterverarbeitet werden.
Die Ergebnisse sind nachvollziehbar, es hat wenige Überraschungen gegeben. Das LINKE und AfD beide von den anderen Fraktionen weniger mit Beifall bedacht werden haben sich wahrscheinlich viele gedacht. Das Rezept für gute Reden scheint zum einen das Thema zu sein und zum anderen ist es auch hilfreich gegen die AfD zu wettern.
Es steht vielleicht aus das auch ältere Daten in das neue Format überführt werden, in diesem Fall würden wesentlich mehr Daten zur Verfügung stehen und eine chronologische Analyse wäre denkbar. Die Daten die bisher zur Verfügung stehen sind durchaus auch noch auf anderem Wege zu erschließen. Beispielsweise kann ich mir vorstellen das Abgeordnete mit einem Direktmandat weniger Beifall bekommen als Abgeordnete mit einem Listenplatz. Um dies zu belegen müsste man allerdings die Daten über die Platzvergabe noch einfließen lassen. Außerdem wäre es auch interessant zu schauen was gesagt wurde hier könnte man sentiment analysis machen und so auch Reden bewerten. Eine weitere spannende Idee wäre, per markov-chain einen Reden-Generator zu erstellen der dann für jede Fraktion mehr oder minder sinnvolle Reden produziert.
Die Aussichten sind also vielfältig und ich kann mir gut vorstellen mit den Daten weiter zu arbeiten, da der Kraftakt der Übertragung in eine Datenbank bereits geleistet ist. Die weitere Integration von neuen Daten kann also auf Knopfdruck geschehen und die Zeit kann intensiv mit der Analyse und Visualisierung der Daten verbracht werden.

Streamlining der Lerndaten-Generierung

In diesem Beitrag möchte ich zeigen wie die Erstellung der Lerndaten für das Deep-Learning Modell effizient durchgeführt werden kann. Anhand der unteren Abbildung werde ich alle Schritte kurz erläutern. Pipeline für Lerndaten Generierung

Virtual-Box

Es wurde sich dafür entschieden zwei weitere Instanzen der Virtuellen Maschiene zu erstellen da der Prozessor, trotz Zuweisung aller Kerne, nicht vollständig ausgelastet wurde. Es handelt sich dabei um eine 2-fach geklonte Virtuelle Maschine die zuvor mit den notwendigen Packages für makehuman ausgestatte wurde. Die drei Instanzen greifen auf die selbe virtuelle Festplatte zu und haben alle Zugriff auf einen gemeinsamen Sharedfolder, in den im weiteren Verlauf die Modelle abgespeichert werden. Die Verbindung mit dem Sharedfolder wird mit folgendem Befehl etabliert.

sudo mount -t vboxsf <Name des Ordners> <Pfad zum Ordner in diesem System>

In jeder Instanz wird anschließend eine modifizierte Variante des makehuman Scripts gestartet. Das Script wurde so verändert, dass ein zufälliger 32 Zeichen langer String als Dateinamen festgelegt wird. Dies war notwendig um eine parallele Ausführung zu ermöglichen und eine einfachere Wiederaufnahme der Generierung zu gewährleisten.

Batch-Script

Nun werden kontinuierlich Modelle im Sharedfolder abgelegt die nach und nach in Lerndaten umgewandelt werden können. Hierzu wird ein einfaches Batch-Script benutzt.

:loop
blender --background --python <Pfad zum Script für die Lerndaten Generierung>
<Pfad zum Powershellscript>/renameoutput.ps1
goto loop

Mit diesem Script wird Blender gestartet und das Script aus dem vorherigen Beitrag wird ausgeführt. Nachdem Blender beendet wurde wird ein Powershellscript gestartet welches die Outputdaten verändert. Die Dateinamen werden von Blender mit ‚0001‘ ergänzt um zu zeigen das dies der erste Frame ist. Diese Namenskonvetion konnte nicht abgeändert werden, mit dem Script werden die Dateinamen um die unnötige Erweiterung gekürzt. Im Anschluss wird Blender erneut gestartet. Das Blender-Script wurde erweitert so, dass alle vorhanden Modelle im Ordner erkannt und in Blender verarbeitet werden können.

Blender

Es gab einige Änderungen im Blender-Script die notwendig waren um einen reibungslosen Ablauf zu gewährleisten. Zunächst musste, da wie erwähnt die Namen der Modelle geändert wurden, der Aufruf der einzelnen Modelle abgeändert werden. Hierzu wurde eine Liste aller Dateien mit der Endung .mhx2 erstellt und durchiteriert. Nachdem eine Datei geladen und zu Lerndaten verabeitet wurde, wird sie verschoben in den Ordner ‚./done‘.

Eine weitere Änderung war notwendig damit Blender nicht immer mehr Arbeitsspeicher einfordert. Da die Modelle anscheinend nicht durch Entfernen in der Szene vollständig gelöscht werden sondern weiter im Arbeitspeicher gehalten werden, wird die Szene nach 500 geladenen Modellen neu geladen. So wird der Arbeitsspeicher geleert und das System kann so lange wie es beliebt laufen.

base_path = 'D:/makehumanModels/'

models = glob.glob(base_path + '*.mhx2')

for x, fp in enumerate(models):

    if (x % 500) == 0:
        bpy.ops.wm.open_mainfile(filepath='D:/Dropbox/Studium/Master Informatik/Master Thema/Grundprojekt/material/empty.blend')
        generateDepthmapNodes()

    else:
        clearScene()

    importModel(fp)
    generateInput(fp)
    generateOutput(fp)
    os.chdir(base_path)
    print('move ' + os.path.basename(fp) + ' '+  base_path + 'done')
    os.system('move ' + os.path.basename(fp) + ' ' + base_path + 'done')

Zusammenfassung

Es wurde gezeigt wie mehrere Instanzen unter VirtualBox genutzt werden können um parallel Modelle zu generieren. Mit einem Batch-Script wird Blender wiederholt aufgerufen um die Modelle weiter zu Lerndaten umzuformen. So entsteht eine Pipeline die einen 4 Kern-Prozessor vollständig auslastet und kontinuierlich Lerndaten generiert.
Mit dieser Konstruktion wird ca. alle 3 Sekunden ein Modell generiert und ungefähr im gleichen Zeitraum zu Lerndaten weiterentwickelt. In einer Nacht (ca. 9 Std) wurden so 12.610 Modelle generiert und weiterverarbeitet. In Zukunft werden die Modelle noch differenzierter erstellt werden und diese Pipeline wird dazu beitragen authentische Modelle in entsprechender Menge zu erzeugen um bessere Ergebnisse für das Deep-Learning Modell zu ermöglichen.