Shakespeare und die Shell

Während meines Talks auf der PROKOM ergaben sich einige interessante Gespräche. Dabei kann wir abends nach dem EM-Fussball auch darauf zu sprechen, dass Microsoft mit dem Anniversary Update von Windows 10 ein Linux-Subsystem und damit auch auf “offiziellem” Weg die Möglichkeit einführt, die bash und andere Tools zu benutzen. Darauf musste ich ja nur 33 Jahre warten. ;-)

Ein Thema war dabei, dass viele Analyseansätze dem aktuellen “big data”-Trend folgen und dabei oft vergessen wird, dass genau die Shell-Tools von Unix und Linux viele Möglichkeiten bieten, Daten mit erstaunlicher Flexibilität und enormer Geschwindigkeit zu analysieren. Wie schnell, zeigt ein sehr interessanter Post von Adam Drake, bei dem eine Pipeline aus find, xargs und mawk 235x schneller als eine Hadoop-Implementierung ist.

Dabei fiel mir ein Beispiel ein, dass ich vor Jahren im Netz gefunden und etwas umgebaut habe, um schnell und iterativ zu zeigen, warum das Unix-Konzept von “do one thing and do it well” und der Möglichkeit, Pipelines aus Kommandos zu bauen, so erfolgreich ist. Lassen Sie uns doch einfach die 25 häufigsten Wörter feststellen, die im Text von Shakespeare’s “Much Ado About Nothing” vorkommen.

Das folgende Shell-Script eignet sich sehr gut für den Unterrricht bzw. die Einführung für Neulinge in die bash und die entsprechenden Tools, da sich die Lösung Schritt für Schritt iterativ direkt in der Konsole entwickeln lässt.

Zuerst benötigen wir natürlich den Text des Barden. Den gibt es im Netz, aber Sie können die Textdatei mit dem Inhalt von “much ado about nothing” hier herunter laden. Entpacken Sie die Datei und legen Sie die Datei muchado.txt in ein Verzeichnis.

Jetzt zum ersten Schritt: wie benötigen ein Wort pro Zeile. Dazu ersetzen wir jeden Leerraum mit einem Zeilenumbruch (mit Hilfe von tr):

cat muchado.txt | tr '[:blank:]'  '\n'

Nun entfernen wir alle Satzzeichen und auch alle Apostrophe aus dem Textstrom (ebenfalls wieder mit tr):

cat muchado.txt | tr '[:blank:]'  '\n' \
 | tr -d '[:punct:]' \
 | tr -d "'"  

Damit der Vergleich der Worte einfacher wird, wandeln wir alles in Kleinbuchstaben (Sie sehen, tr kann eine ganze Menge!):

cat muchado.txt | tr '[:blank:]'  '\n' \
 | tr -d '[:punct:]' \
 | tr -d "'"  \
 | tr '[:upper:]' '[:lower:]'  

Der nächste Schritt verwendet grep, um leere Zeilen zu entfernen:

cat muchado.txt | tr '[:blank:]'  '\n' \
 | tr -d '[:punct:]' \
 | tr -d "'"  \
 | tr '[:upper:]' '[:lower:]'  \
 | grep -e '^$' -v  

Zum Abschluss sortieren wir den Textstrom und zählen dann die Wortfrequenz (uniq -c benötigt einen sortierten Input):

cat muchado.txt | tr '[:blank:]'  '\n' \
 | tr -d '[:punct:]' \
 | tr -d "'"  \
 | tr '[:upper:]' '[:lower:]'  \
 | grep -e '^$' -v  \
 | sort  \
 | uniq -c 

So weit, so gut. Wir benötigen die häufigsten Wörter, daher müssen wir diese Ausgabe numerisch absteigend sortieren:

cat muchado.txt | tr '[:blank:]'  '\n' \
 | tr -d '[:punct:]' \
 | tr -d "'"  \
 | tr '[:upper:]' '[:lower:]'  \
 | grep -e '^$' -v  \
 | sort  \
 | uniq -c \
 | sort -nr 

Alles, was jetzt noch fehlt, ist die Begrenzung der Ausgabe auf die ersten 25 Zeilen, dann sind wir fertig:

cat muchado.txt | tr '[:blank:]'  '\n'   \
 | tr -d '[:punct:]' \
 | tr -d "'"  \
 | tr '[:upper:]' '[:lower:]'  \
 | grep -e '^$' -v  \
 | sort  \
 | uniq -c \
 | sort -nr  \
 | head -n 25

Ein schönes Beispiel für eine erste Einführung in “data science on the command line” und für die Flexibilität und den Nutzen von Pipelines und von auf die Erledigung einer Aufgabe entworfenen Werkzeugen. Shakepeare analysieren als Einzeiler …

NB: Wer weitere Ideen und Beispiele für die Nutzung der shell und ihrer Tools für Linguisten haben möchte, wird hier fündig

Share Kommentieren
X

Ich habe einen Kommentar zum Artikel

Sie können die Kommentarfunktion ohne die Speicherung personenbezogener Daten nutzen. Schreiben Sie Ihren Kommentar und klicken Sie auf "Abschicken", der Versand erfolgt per Mail von meinem Auftritt aus an mich zur Prüfung. Dieser Versand und die Übertragung Ihres Kommentars ist zur Erfüllung der von Ihnen mit dem Klick auf "Abschicken" ersichtlichen Absicht technisch notwendig und bedarf keiner weiteren Einwilligung.

Wichtiger Hinweis: Sie haben keinen Anspruch auf die Veröffentlichung Ihres Kommentars. Jeder hier eingegebene Kommentar wird zuerst geprüft. Ich behalte mir die Entscheidung vor, welche Kommentare ich als Ergänzung an den Artikel anfüge.