Für analysefreudige Datendumpster*innen hält das Web diesertags an jeder zweiten Ecke einen kleinen Schatz bereit. Davor, sich die Hemdsärmel hochkrempeln und sich die Finger schmutzig machen zu müssen, ist mensch aber auch hier nicht gefeit. Das gilt um so mehr, wenn der Blick an einer übervollen Bio-Text-Tonne hängen bleibt, die das Dumpster*innenherz höher schlagen lässt. Wie der Zufall so will, steht eine dieser Tonnen direkt an der Einfahrt nach Springfield und über Hemdsärmel wissen die Simpsons Bände zu sprechen – genauer gesagt 158.315 Zeilen.

Rückblickend auf eine 27jährige Seriengeschichte und gestützt auf 28 Staffeln mit 616 Folgen, ließ sich im kleinen Städchen Springfield schon die Kulisse der ein oder anderen Analyse finden. Da sich aber auch im winzigsten Provinznest immer noch eine geschlossene Türe öffnen und noch ein unberührter Lichtschalter betätigen lässt, lädt Kaggle seit einigen Monaten dazu ein, sich vor Ort selbst mal genauer umzuschaun. In den bereitgestellten Daten tummeln sich 6.722 Charaktere an 4.459 Orten, die über 158.315 Textzeilen in 28 Staffeln und 600 Folgen miteinander in Interaktion treten.

Von kleinen und von größeren Übeln

Ein Blick auf die Episodenliste zeigt, dass die Daten bis auf die letzten 16 Folgen am aktuellsten Stand sind. Allerdings fehlt zu einigen Folgen das passende Skript. Betroffen sind davon die Episoden 424, 441, 447, 550 und alle ab 569. Angesichts der sonstigen Datenfülle stellen die vereinzelten Lücken aber kein Problem dar. Viel eher drehen da schon die verworrenen Datenwürste aus nicht-geschlossenen Anführungszeichen jeder weiteren Analyse den Strick. Auf diese Weise in sich verknotet, bleiben von den 600 Episoden-Datenzeilen nur mehr 238 übrig. Von den erwartbaren 158.315 Skriptzeilen, verlieren sich sogar 57.004 in diesem Geflecht und von ‚wohl strukturiert‘ kann dabei mit keinem Wort mehr die Rede sein.

Schelmische Verursacher dieses Sauhaufens sind – wie so oft – Rohtext-Spalten mit ihrer Hassliebe zum csv-Format: ungeschlossene Ketten von Anführungszeichen in Kombination mit Rohtext, der das Spaltentrennzeichen enthält. Damit finden sich zum Einen teils mehrere Datenzeilen in einer Zelle komprimiert, zum Anderen verschieben sich die Inhalte.

Was mensch sonntags halt so macht

Nachdem sich die manuelle Suche und Korrektur bei dieser Datenfülle recht schnell äußerst umständlich gestaltet, heißt es die ursprünglichen Reisepläne erst mal auf Eis zu legen. Als Trostpreis lockt stattdessen ein sonntäglicher Ausflug in die Regex-Welt. Das neue Reiseziel ist bekannt: zwei saubere Datensätze; der Weg dorthin gleicht vermutlich aber ein wenig einem mit Stolpersteinen gepflastertes Labyrinth aus Rohtextranken. Die richtige Regex-Blaupause im Gepäck, sollte aber auch das zielstrebige Durchqueren des Irrgartens kein hoffnungsloses Unterfangen werden. Zumindest spricht so die Zuversicht. Also ab zum Zeichner*innentisch für die freie Definition von Spaltengrenzen.

Copy to Clipboard
Copy to Clipboard

In der Hoffnung, dass mein fehlender Unterricht in geometrischem Zeichnen nicht allzu starken Eingang in meine Blaupause findet, gilt es die Enden der einzelnen Teilstück noch so zu kombinieren, dass – so die eigentlich triviale Aufgabe – für jede Spalte aus den einzelnen Datenzeilen-Strings immer nur genau jener Inhalt kopiert wird, der auch tatsächlich zur jeweiligen Spalte passt. Um als Match durchzugehen, muss ein Textausschnitt dazu von allen zuvor bereits verwendeten sowie von allen noch nachfolgenden Regex-Ausdrücken umschlossen sein. Um nicht in mühsame und fehleranfällige Kleinsarbeit an der Erschaffung von Regex-Monstern zu verfallen, bietet es sich hier geradezu an mit der Linken nach Abstraktion und mit der Rechten nach Iteration zu langen und [R] den Rest der Arbeit übernehmen zu lassen.

Copy to Clipboard

Einem ersten, prüfenden Blick scheinen die Ergebnisse standzuhalten: alle Zeilen sind vorhanden, alle Spalten im korrekten Format und die überwiegende Zahl der Zellen mit sinnhaften Werten befüllt. Kleinere Inkonsistenzen stechen zwar bei den Spalten raw_character_text, raw_location_text und spoken_words (eine Mischung aus raw_text und normalized_text … standardmäßig roh oder roher Standard … wie mensch’s nimmt) ins Auge. Da es sich dabei aber durchwegs um redundante Informationen handelt, sollte auch das kein allzu großer Stolperstein auf dem Weg durchs Labyrinth sein. Stattdessen lassen wir diese Spalten mit geringer Qualität einfach zurück. Sicherheitshalber lässt sich der Word Count auch nochmal anwerfen. Im Vergleich zur word_count-Spalte aus den Rohdaten liefert das weitgehend vergleichbare Ergebnisse und im Bereich von +/- einem Wort Abweichung auch leichte Verbesserungen. In dem Sinn: Springfield, ahoi!

Copy to Clipboard