Distant Reading

„We need distant reading, Franco Moretti argues, because its opposite, close reading, can’t uncover the true scope and nature of literature.“

Moretti ist der Meinung, Distant Reading muss Close Reading ersetzen, weil die Datenmengen zu groß werden und die Menge an Daten, die ein einzelner Mensch lesen kann, lächerlich ist im Vergleich zur Menge an Daten, die er eigentlich lesen müsste.

Andererseits ist Moretti aber daran gescheitert, reines „Distant Reading“ zu betreiben und daraus wirkliche Erkenntnisse zu gewinnen. Vielleicht liegt das daran, dass man Distant Reading doch mit Close Reading kombinieren muss, um einen wirklichen Einblick zu bekommen? Oder daran, dass Moretti seine Visualisierungen manuell erzeugt hat, und dadurch zu sehr von den eigenen Erwartungen getrieben war, als sich vom System überraschen zu lassen?

Und würde die „Visual Poe“ Visualisierung nicht beides anders machen? Da man durch die einzelnen Paragraphen „sliden“ kann, ist es einem auch möglich, einzelne Paragraphen genauer zu analysieren – vielleicht reichen Sample-Beispiele in Kombination mit dem Gesamtbild. Und auch das Automatisierte würde hier ganz anders ins Spiel kommen, da die Visualisierung eben von einem Programm und nicht händisch erzeugt wird.

Distant Reading

Zusätzliches Script zum Erstellen der POS-Tags

Da es 60-90 Sekunden dauert, alle Wörter aller Texte mit dem passenden Part-of-Speech-Tag zu taggen (noun, verb, etc.), war ich gezwungen, mich näher mit Corpora zu befassen und hab festgestellt, dass man mit der NLTK Library ganz einfach eigene Corpora laden kann.

Dafür braucht man nur .pos-Files mit den getaggten Wörtern. Daher gibt es jetzt ein weiteres Script, das die Text-Files durchgeht und für jedes Wort den dazugehörigen POS-Tag sucht und dann je Text ein pos-File schreibt. Dieses Script braucht man also nur laufen lassen, wenn sich etwas in den Textfiles ändert.

Die pos-Files werden im eigentlichen Script als TaggedCorpus geladen und können von überall aus zur Analyse verwendet werden.

Die Ladezeit des Haupt-Scripts reduziert sich dadurch wieder auf 0.5s

Zusätzliches Script zum Erstellen der POS-Tags

Extract Relations between 2 characters (first attempts)

Coming up with a grammar rule that finds relations:

grammar = r“““
DESC: {<PRP\$>+<JJ|VBD|VBN>?<NN>+}
REL: {<PRP>+<VBD|VBP|RB|VBN>*<IN>?<TO>?<PRP|PRP\$>+}
„““

Screen Shot 2015-09-26 at 12.07.12 PM

Screen Shot 2015-09-26 at 12.03.57 PM

second attempt, a little more possibilities:

grammar = r“““
REL: {<PRP>+<VBD|VBP|RB|VBN>+<IN>?<TO>?<PRP|PRP\$>+<RB>?<NN|NNS>?}
REL: {<PRP|NNP>+<CC>?<PRP|NNP>?<VB.|RB><NN|NNS>}
„““

Screen Shot 2015-09-26 at 1.27.39 PM

Screen Shot 2015-09-26 at 1.30.02 PM

third attempt; covers a lot of cases, so I will go with this one for now and may refine it later:

grammar = r“““
REL: {<PRP>+<VB.|RB|VBN>+<IN>?<TO>?<PRP|PRP\$|NNP>+<VB.>*<RB|IN|DT>*<VB.|JJ>*<NN|NNS|PRP|PRP\$>?}
REL: {<PRP|NNP>+<CC><PRP|NNP>?<VB.|RB><NN|NNS>}
„““

Screen Shot 2015-09-26 at 2.23.01 PM

Screen Shot 2015-09-26 at 2.29.32 PM

Extract Relations between 2 characters (first attempts)

Python Update

successfully done:

  • scans folder with txt Files and generates tale-instance for each file
  • runs through XML and generates unique figures and narrators
  • runs through tale-instances and generates a layer for each paragraph
  • got nodebox module up and running (for visualization)

currently in progress:

  • go through each layer and generate an instance of a temporary character, if a unique character is found in this paragraph OPEN ISSUES: Ausnahmen abfangen, z.B. wenn „I“ in direkter Rede vorkommt, kann es auch eine andere Person sein und nicht der Erzähler; oder wenn nur possessiv-pronomen anstatt personalpronomen (my, her, his) — ERLEDIGT
  • for each temporary character, analyze their relations (narrator – character) — ERLEDIGT

„visualize.py“ currently displays a dot for every unique character and the narrator in the center:

Screen Shot 2015-09-22 at 10.51.11 AM

respectively all characters color-coded by gender:

Screen Shot 2015-09-22 at 3.09.36 PM

Python Update

Ziel Programmierung

4 Python Scripts:

  • Character Extraction:
    • Python-Script, das alle vorkommenden Charaktere sucht und als XML file speichert (wird nicht ausprogrammiert, sondern XML file manuell erzeugt)
  • Initializer:
    • generiert die Grundstruktur
  • Analyzer:
    • analysiert für jeden Absatz den Ich-Erzähler und vorkommende Personen
  • Visualizer:
    • generiert anhand der Daten die Visualisierung

Initializer:

  • für jede Kurzgeschichte (Ordner mit txt Files) wird eine Instanz der Klasse Tale erzeugt; Attribute: taleID, filename, paragraphs (String Array)
  • anhand des XML files werden Instanzen der Klasse Figure erzeugt (pro Character nur eine Instanz; unique characters); sind per ID erkennbar, werden per taleID der Geschichte zugeordnet; Attribute: charID, taleID, name, gender, also-known-as
  • je Paragraph wird eine Instanz der Klasse Layer erzeugt; per layerID erkennbar und über taleID zuordbar; Attribute: layerID, taleID, paragraph (als String)
  • je Paragraph werden temporäre Charaktere erzeugt: für jeden unique Charakter, der in einem Absatz vorkommt, wird eine Instanz der Klasse Figure_t erzeugt; Attribute: tempID, taleID, charID, layerID sowie später die Analyse-Ergebnisse

Analyzer:

  • als functions der temporären-character Klassen?!

Visualizer:

  • default Ansicht ist die Übersicht über alle Charaktere und alle Layers
  • per Slider kann layer für layer durchgegangen werden
  • pro Layer werden alle temporären Charaktere durchsucht und diejenigen angezeigt, die die jeweilige layerID haben
  • narrator
  • position figures
Ziel Programmierung

Überlegungen zur Programmierung

  • jeder Absatz (Paragraph) ist ein Schritt in der Zeit; in der Timeline werden für pro Schritt die Daten dargestellt, die in diesem Absatz ausgesagt werden
  • in der Gesamtübersicht ist jeder Absatz ein Layer, die übereinander gelegt werden
  • dabei beachten: was in der Timeline dargestellt werden kann, muss auch in der Gesamt-Übersicht visuell erkennbar sein
  • Wiederholungen müssen erkenntlich sein -> visuelle Sichtbarmachung von Änderung und Übereinstimmung

Technische Überlegungen:

  • am Anfang durch alle Stories loopen, um Anzahl von Paragraphs festzustellen
  • am Anfang durch alle Stories loopen, um alle vorkommenden Charaktere festzulegen; jeder Charakter bekommt ID, mit der dann die zeitlichen „Instanzen“ der Charaktere verbunden werden, um diese zu identifizieren
  • class Person ist Superklasse von class Narrator und class Character
  • array Layer ordnet jedem Zeitpunkt die jeweiligen Instanzen von Charakteren zu
Überlegungen zur Programmierung