Erste Schritte mit R / Teil I

Arbeiten mit R an »Schau heimwärts, Engel!« von Thomas Wolfe

Meine ersten Anfängerschritte mit der Programmiersprache R mache ich anhand des 1929 von Thomas Wolfe autobiografisch geschriebenen Romans Schau heimwärts, Engel!

Weil ich mich künstlerisch mit dem lettischen Farbtafel-Maler Mark Rothko befasse, analysiere ich die deutsche Übersetzung des autobiographischen Romans Schau heimwärts, Engel! von Thomas Wolfe? Was hat das eine mit dem anderen zu tun?

Das ist eine kurze und prägnante Geschichte: Spätestens als ich anfing, mich für die biographischen Daten von Mark Rothko zu interessieren, der als Marcus Rothkowitz in Daugavpils, Lettland geboren wurde, fing ich an, sein Leben und die Berührungspunkte mit der ihn möglicherweise umgebenden Realität textlich aufzuarbeiten. Zufällig sah ich den Film Genius – Die tausend Seiten einer Freundschaft (Link) und fing, wegen des nachhaltigen Eindrucks, den dieser Film auf mich machte, an Bücher von Thomas Wolfe zu lesen. Dabei assoziierte ich Textstellen aus Wolfes Romanen mit den tatsächlichen und hypothetischen Lebenserlebnissen von Mark Rothko. Ich finde, dass Wolfe die perfekten Worte für mögliche Erlebnisse von Rothko gefunden hat. Wolfes lavastrom-ähnlicher Sprache wohnt ähnlich den Bildern von Mark Rothko eine immense Kraft inne, mit ihr schreibt er den Dingen um uns herum einen massiven und eindrücklichen Einfluss auf unser Leben zu. Seine Sprache, sein sprachlicher Reichtum haben mich sehr beeindruckt und einen großen Eindruck auf mich gemacht.

Thomas Wolfe

Thomas Wolfe war ein amerikanischer Schriftsteller und wurde als letztes von acht Kindern 1900 in Ashville, North Carolina, als Sohn einer irisch-schottischen Mutter und eines pennsylvaniadeutschen Steinmetzen geboren. Bereits mit 38 Jahren verstarb Wolfe an Gehirntuberkolose.

Da ist Thomas Wolfe, ein Junge von, ich glaube, dreißig oder weniger Jahren, dessen einziger Roman Look Homeward, Angel an die Seite unserer besten Literaturwerke gestellt werden kann, eine kolossalische Schöpfung von tiefer Lebenslust.

Quelle Zitat: Sinclair Lewis

Bei der Lektüre des Buches bin ich dann auf viele Begriffe gestoßen, die ich heute nicht mehr kenne oder verstehe. Dies sind zum Teil sprachliche Eigenheiten des Übersetzers, als auch literarische Verweise auf Literatur, Theater und Operette, die uns heute völlig fremd sind, da sie in unserem Bildungskanon nicht mehr vorkommen oder allerhöchstens einmal zitiert werden, ohne dass wir wüssten, worauf sich diese Verweise beziehen. Als Beispiel möchte ich nur - ganz wahllos -
perkolieren, Gargantua, Lord-Fauntleroy-Locken oder bukolische Wildnis nennen. Eine Hilfestellung und begleitende Erläuterung zu vielen dieser Begriffe werde ich in einem anderen Beitrag aufschreiben

Das brachte mich schlussendlich dazu an dem Text Schau heimwärts, Engel! von Thomas Wolfe meine erste Textanlyse mit R durchzuführen. Der zu Grunde liegende Text der deutschen Übersetzung des postum mit dem Georg-Büchner-Preis geehrten Hans Schiebelhuth ist im Projekt Gutenberg online verfügbar.

Thomas Wolfe

Hier war Neuland.
Ihm wurde leicht ums Herz.

Quelle: Thomas Wolfe, Schau heimwärts, Engel!, Rowohlt Verlag GmbH, Hamburg 1954

Diese Dokumentation meiner ersten Schritte mit R wendet sich ausdrücklich an Anfänger und soll diese ermutigen R als Basis für ein möglicherweise noch besseres Textverständnis zu nutzen. Ich stehe noch ganz am Anfang und lasse mich treiben, wohin meine Laune und meine Recherchen mich lenken.

Der Text

Der Anfang

Im ersten Schritt habe ich aus den vierzig Kapiteln des Buches eine einzige Datei erstellt.

Diese habe ich schauheimwaertsengel.txt genannt.

Zunächst möchte ich nicht mit RStudio arbeiten sondern nur mit der einfachen R-Konsole.

Was ist R?

R ist ein System für statistische Berechnungen und Grafiken. Es besteht aus einer Programmiersprache und einer Laufzeitumgebung mit Grafiken, einem Debugger, Zugriff auf bestimmte Systemfunktionen und der Möglichkeit, in Skriptdateien gespeicherte Programme auszuführen.

R ist modular aufgebaut, das heißt zusätzlich zu den bereits enthaltenen Packages mit Basisfunktionen lassen sich noch über 2500 weitere Pakete installieren.

Woher bekomme ich R?

R kann auf der Projektseite von R heruntergeladen werden. Ich habe die 64-bit-Version installiert.

Erste Schritte

Ich möchte vorausschicken: Ich bin absoluter Anfänger in R. Ich freue mich über jeden Kommentar, der mir hilft umständliche Herangehensweisen eines Anfängers in intelligentere Handlungen und Denkweisen zu transformieren. Da ich kein designender Programmierer sondern programmierender Designer bin, habe ich keinen wirklichen Programmiersprachen-Background, was es mir manchmal schwer macht, bestimmte Beispiele aus Netzfunden für meine Zwecke zu adaptieren.

Bei meinen ersten Schritten habe ich mich an dieser Videoserie von Jalayer Academy orientiert. Vielen Dank für dieses sehr verständliche Tutorial.

Nach der Installation starte ich R und finde diesen Screen vor: Die R Konsole.

In R arbeitet eins mit Objekten und Befehlen (Kommandos). Als erstes finden wir heraus, wo unser Arbeitsverzeichnis liegt. Dazu nutzen wir den Befehl getwd() - get working directory.

getwd()
[1] "C:/Users/benutzer/Documents"
Wo liegt das Arbeitsverzeichnis?

Dieses können wir mit setwd() ändern. Alle meine R-Projekte liegen auf C im Ordner R. Da ich an den Texten von Wolfe arbeite, habe ich das Verzeichnis r-wolfe genannt. Bei setzen von Arbeitsverzeichnissen sollte eins darauf achten, dass das Verzeichnis auch existiert.

Wir schreiben also und prüfen dann gleich noch einmal:

setwd("C:/R/r-wolfe")
getwd()
[1] "C:/R/r-wolfe"
Eigenes Arbeitsverzeichnis definieren.

Perfekt. Alle Dateien, die wir als Objekte laden oder speichern liegen nun in C:/R/r-wolfe. Mit dir() können wir uns alle Dateien im Arbeitsverzeichnis anzeigen lassen. 

dir()
[1] "auszug.txt"    "schauheimwaertsengel.txt"
Welche Dateien liegen im Arbeitsverzeichnis?

Das Verzeichnis enthält zwei Dateien: auszug.txt und den vollständigen Text schauheimwaertsengel.txt. Die Anwendung aller Kommandos auf beide Texte dient der besseren Veranschaulichung, die Text- und Codingbeispiele lassen sich besser mit dem kurzen Text aus der Datei auszug.txt darstellen. Der vollständige Text von Schau heimwärts, Engel! enthält mehr als 1,2 Millionen Zeichen und fast 10.000 Zeilen. Aus urheberrechtlicher Vorsicht bitte ich jeden, sich diesen Text selbst zusammenzustellen.

Um den Text in R bearbeiten zu können, lade ich ihn als Objekt in R. Dabei hatte ich zunächst einige Probleme mit den Umlauten. 

Als erstes möchte ich mir den Text von auszug.txt einmal in der Konsole anzeigen lassen. Bitte auf die Groß- und Kleinschreibung von Kommandos in R achten!

Schauen wir es uns einmal an.

readLines("auszug.txt")
[1] "Ein Engländer namens Gilbert Gaunt (was er später in Gant änderte, vermutlich ein Zugeständnis an die Aussprache der Yankees) war im Jahre 1837 auf einem Segler von Bristol nach Baltimore gekommen. "
[2] ""                                                                                                                                                                                                          
[3] "Den Wert eines Gasthauses, das er sich gekauft hatte, ließ er seine unfürsorgliche Kehle hinunterrollen." 
Sichtbar Probleme mit den Umlauten.

Der Inhalt des geladenen Dokumentes wird mit dem Kommando direkt in der Konsole angezeigt. Er hat 3 Zeilen und wir sehen sofort, dass die Sonderzeichen nicht korrekt geladen werden, da das UTF8-Format nicht richtig erkannt wurde.

Wenn wir das richtige Encoding angeben, ist das Problem aber schnell gelöst:

readLines("auszug.txt", encoding = "UTF-8")
[1] "Ein Engländer namens Gilbert Gaunt (was er später in Gant änderte, vermutlich ein Zugeständnis an die Aussprache der Yankees) war im Jahre 1837 auf einem Segler von Bristol nach Baltimore gekommen. "
[2] ""                                                                                                                                                                                                      
[3] "Den Wert eines Gasthauses, das er sich gekauft hatte, ließ er seine unfürsorgliche Kehle hinunterrollen." 
readLines() mit dem richtigen encoding="UTF-8.

Das sieht schon besser aus!
Um mit einem Kommando den Text aus der Datei auszug.txt einem Objekt namens auszug hinzuzufügen weisen nutzen wir <- . Das Objekt können wir uns dann ganz einfach mit auszug in der Konsole anzeigen lassen.

auszug <- readLines("auszug.txt", encoding = "UTF-8")
auszug
[1] "Ein Engländer namens Gilbert Gaunt (was er später in Gant änderte, vermutlich ein Zugeständnis an die Aussprache der Yankees) war im Jahre 1837 auf einem Segler von Bristol nach Baltimore gekommen. "
[2] ""                                                                                                                                                                                                      
[3] "Den Wert eines Gasthauses, das er sich gekauft hatte, ließ er seine unfürsorgliche Kehle hinunterrollen."  
Mit <- weisen wir ein Kommando einem Objekt zu.

Ebenso verfahren wir mit der Datei schauheimwaertsengel.txt, die wir in das Objekt wolfetext laden.

wolfetext <- readLines("schauheimwaertsengel.txt", encoding = "UTF-8")

Leerzeilen entfernen mit collapse()

Wie wir oben bei auszug gesehen haben, enthält das Objekt auszug einige Leerzeilen, die wir mit diesem Kommando entfernen.

auszug <- paste(auszug, collapse=' ') 
Leerzeilen mit collapse() entfernen.

Dabei ersetzen wir die Zeilen mit collapse() jeweils durch ein Leerzeichen. Eventuell doppelte Leerzeichen werden später entfernt. Das Ergebnis ist jetzt eine Zeile Text.

auszug
[1] "Ein Engländer namens Gilbert Gaunt (was er später in Gant änderte, vermutlich ein Zugeständnis an die Aussprache der Yankees) war im Jahre 1837 auf einem Segler von Bristol nach Baltimore gekommen.   Den Wert eines Gasthauses, das er sich gekauft hatte, ließ er seine unfürsorgliche Kehle hinunterrollen."
Das Objekt auszug auf eine Zeile reduziert.

Auf die Darstellung des Objektes wolfetext verzichte ich hier. Aber ich verfahre mit dem Text genau so wie mit auszug, das heißt ich ersetze alle Zeilen durch ein Leerzeichen mit collapse() und weise mit dem Kommando das Ergebnis wieder dem Objekt wolfetext zu.

wolfetext <- paste(wolfetext, collapse=' ') 
wolfetext enthält nun den kompletten Text aus Schau heimwärts, Engel!

Satzzeichen und Sonderzeichen entfernen mit gsub()

Unsere Texte enthalten neben vielen sogenannten Stop- oder Füllwörtern noch Satzzeichen. Diese lassen sich mit Regular Expressions am einfachsten entfernen. Regular Expressions sind eine magische Angelegenheit für sich, eine gute Einführung in Regular Expressions habe ich in diesem Tutorial und hier gefunden, eine recht vollständige Liste aller Ausdrücke findet sich unter anderem an dieser Stelle. Weitere Links: Regular Expressions in stringr, R Regular Expressions, Regular Expressions with The R Language.

Als erstes entfernen wir alle Satz- und Sonderzeichen und ersetzen sie mit Leerzeichen.

gsub(pattern="\\W", replace=" ", auszug)
[1] "Ein Engländer namens Gilbert Gaunt  was er später in Gant änderte  vermutlich ein Zugeständnis an die Aussprache der Yankees  war im Jahre 1837 auf einem Segler von Bristol nach Baltimore gekommen    Den Wert eines Gasthauses  das er sich gekauft hatte  ließ er seine unfürsorgliche Kehle hinunterrollen "
Satz- und Sonderzeichen entfernen.

Und wir sehen: Alle Satz- und Sonderzeichen wurden erfolgreich entfernt und durch Leerzeichen ersetzt.

Mit dem nächsten Kommando weisen wir die Ergebnisse der beiden Kommandos unseren beiden Objekten auszug und wolfetext zu. auszug und wolfetext enthalten jetzt Texte ohne Satz- und Sonderzeichen und ohne Leerzeilen.

auszug <- gsub(pattern="\\W", replace=" ", auszug)
wolfetext <- gsub(pattern="\\W", replace=" ", wolfetext)
Objekten werden die Ergebnisse der Kommandos zugewiesen.

Auch alle Ziffern werden jetzt alle entfernt mit

auszug <- gsub(pattern="\\d", replace=" ", auszug)
wolfetext <- gsub(pattern="\\d", replace=" ", wolfetext)
Ziffern mit der RegEx \\d entfernen.

Für eine bessere Verarbeitung der Texte werden jetzt alle Wörter im Text mit der Funktion tolower() in Kleinschreibung umgewandelt.

tolower(auszug)
[1] "ein engländer namens gilbert gaunt  was er später in gant änderte  vermutlich ein zugeständnis an die aussprache der yankees  war im jahre      auf einem segler von bristol nach baltimore gekommen    den wert eines gasthauses  das er sich gekauft hatte  ließ er seine unfürsorgliche kehle hinunterrollen "
Kleinschreiben mit tolower().

Und das Kommando weisen wir jetzt wieder auszug und wolfetext zu.

auszug <- tolower(auszug)
wolfetext <- tolower(wolfetext)
auszug und wolfetext sind jetzt vollständig kleingeschrieben.

Jetzt entfernen wir noch alle Zeichenketten mit der Länge 1 aus unseren Texten und weisen das Kommando direkt wieder dem Objekt auszug zu. Ebenso verfahren wir mit wolfetext. Dies geschieht mit der RegEx \\b[A-z]\\b{1}.

auszug <- gsub(pattern="\\b[A-z]\\b{1}", replace=" ", auszug)
wolfetext <- gsub(pattern="\\b[A-z]\\b{1}", replace=" ", wolfetext )
Kurze Zeichenketten entfernen.

Die beiden Objekte auszug und wolfetext möchte ich jetzt gerne vor der Weiterverarbeitung einmal sichern. Dies geschieht mit der Funktion write.table()

write.table(auszug, "auszug-lower.txt", sep="\t")
write.table(wolfetext, "schauheimwaertsengel-lower.txt", sep="\t")
Vor der Weiterverarbeitung eine Zwischensicherung.

Unser Arbeitsverzeichnis enthält jetzt 4 Dateien.  Die Dateien auszug-lower.txt und schauheimwaertsengel-lower.txt enthalten den Originaltext ohne Leerzeilen, ohne Satzzeichen und ohne Ziffern oder 1-teilige Zeichenketten.

dir()
[1] "auszug-lower.txt" "auszug.txt" "schauheimwaertsengel.txt" "schauheimwaertsengel-lower.txt" 
Überblick über das Arbeitsverzeichnis.

Packages in R

Das stringr-Package und ein ganz klein wenig Statistik.

R-Pakete sind von der Community entwickelte Sammlungen von Funktionen und Datensätzen. Sie erhöhen die Leistungsfähigkeit von R, indem sie bestehende Basis-R-Funktionalitäten verbessern oder neue hinzufügen. (...) Kürzlich hat das offizielle Repository (CRAN) 10.000 veröffentlichte Pakete erreicht, und viele weitere sind über das Internet öffentlich zugänglich. (Quelle: https://www.datacamp.com/community/tutorials/r-packages-guide).

Da ich bestimmte Wörter zählen möchte, habe ich das Package stringr zuerst installiert. Packages installiert eins einfach über das Menü Pakete oder mit der Funktion install.packages()

install.packages("stringr")
Package stringr installieren.

Unter Umständen müssen wir im Popup-Fenster noch angeben, von welchem Server wir das Paket laden wollen, und wo es installiert werden soll. Und mit library() wird ein installiertes Package in den Arbeitsraum geladen. Ist das Package bereits installiert, muss es bei jeder Sesson zumindest geladen werden.

library(stringr)
Die library() Funktion lädt eine Bibliothek in die Konsole.
Wie häufig schreibt Wolfe

er oder sie?

Jetzt können wir ein paar Suchfunktionen auf unsere Texte loslassen. Ich fange einmal mit der Suche nach den Zeichenketten er und sie an, zunächst, damit das Ergebnis einfacher überprüfbar ist, mit dem Objekt auszug.

str_count(auszug, "er")
[1] 12
Suche nach er mit dem Ergebnis 12.

Wir erhalten 12 Treffer. Wenn wir uns auszug anschauen erkennen wir, dass später, engländer und zum Beispiel segler ebenfalls die Zeichenkette er enthalten. Wenn wir in unsere Suche noch zwei Leerzeichen einbauen, finden wir nur das Wort er.

str_count(auszug, " er ")
[1] 3
Echte er-Treffer.

Wir erhalten 3 Treffer, was auch korrekt ist. Für die Datei wolfetext ergeben sich 4946 Treffer für er und für sie 3901 Treffer. Das ist ein Verhältnis von 55,9 % zu 44,1 %. Nicht unbedingt ein verwunderliches Ergebnis bei einem autobiographischen Roman, der von einem männerdominierten männlichen Autor 1929 geschrieben wurde.

str_count(wolfetext, " er ")
[1] 4946
str_count(wolfetext, " sie ")
[1] 3901
Ergebnisse Vorkommen von er und sie im Text.

Die Suche lässt sich auch kombinieren:

str_count(wolfetext, c(" er "," sie "))
[1] 4946 3901
Kombinierte Suche.

Im nächsten Schritt möchte ich das Vorkommen der Protagonisten mengenmässig untersuchen, herausfinden, ob ich im Text eine Neigung zu bestimmten Modalverben feststellen kann. Desweiteren möchte ich alle Stop- beziehungsweise Füllwörter aus dem Text entfernen und am Ende gerne eine Wortwolke aus dem gesamten Text erstellen.

Das mache ich im zweiten Teil, der hoffentlich noch diese Woche hier erscheinen wird. 

Falls Ihr Anregungen oder Kritik für mich habt, lasst sie in den Kommentaren da! Und wenn Ihr gute Tipps für R-Anleitungen für mich habt, die sich speziell auf Textanalyse und Textmining habt, dann lasst sie ebenfalls gerne hier in den Kommentaren da. Ich lese auch sehr gerne, was Ihr schon mit R gemacht habt!

tl, dr;

Meine ersten Anfängerschritte mit mit der Programmiersprache R mache ich anhand des 1929 von Thomas Wolfe autobiografisch geschriebenen Romans Schau heimwärts, Engel!

Kommentare (0)


Schreibe einen Kommentar




Mit dem Absenden des Kommentars stimme ich zu, dass der genannte Name, die genannte E-Mail-Adresse von cronhill.de im Zusammenhang mit dem von mir verfassten Kommentar gespeichert wird. Die E-Mail-Adresse wird nicht veröffentlicht oder an Dritte weitergegeben.