Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

einfache Wordcloud

Hier in diesem Kapitel werde ich dir zeigen, wie wir ganz schnell und einfach eine Wordcloud von einem Buch generieren können. Dabei ist es egal welches Buch du dafür nimmst. Es sollte aber am Besten ein Englisches sein, da es Unterschiede zwischen Sprachen geben kann, auf die wir achten müssten, wenn wir damit eine Wordcloud erstellen wollen. Für meine Wordcloud benutzte ich "Japan: An Attempt at Interpretation" von Lafcadio Hearn, welches ich als .txt Datei aus dem Internet runtergeladen habe.

Zu aller erst erstelle ich ein neues Projekt, genau so wie wir es in Kapitel: Python Projekt aufsetzen gemacht haben. Die .txt Datei packe ich dann in ein neuen Ordner, namens "books", den ich in mein neuen Projekt erstellt habe. Mein Projekt, welches ich auch "simple_wordcloud" genannt habe, sieht dementsprechen jetzt so aus:

simple_wordcloud
├── books
│   └── lafcadio.txt
├── poetry.lock
├── pyproject.toml
├── README.md
├── src
│   └── simple_wordcloud
│       ├── __init__.py
│       └── main.py
└── tests
    └── __init__.py

Jetzt installieren wir noch alle Packages, die wir für eine Wordcloud brauchen werden:

peotry add wordcloud matplotlib

Nun können wir diese beiden Packages in unserem Code importieren:

simple_wordcloud/src/simple_wordcloud/main.py:

from wordcloud import WordCloud
import matplotlib.pyplot as plt

Hier habe ich WordCloud von dem Package wordcloud und pyplot von matplotlib importiert. Dabei habe ich pyplot zu plt umbenannt, damit ich später nicht immer pyplot komplett austippen muss, sondern einfach nur plt.

Als aller ersten Schritt müssen wir in der main Funktion unser Buch einlesen und als String in einer Variable erstmal zwischenspeichern.

simple_wordcloud/src/simple_wordcloud/main.py:

def main():
    f = open("books/lafcadio.txt", "r")
    book = f.read()
    f.close()

Mit der Funktion open geben wir den relativen Pfad innerhalb unseres Projektes zu einer Datei, die wir sprichwörtlich "öffnen" wollen. Mit "r" sagen wir, dass wir diese Datei nur lesen wollen und nicht vorhaben den Inhalt der Datei zu bearbeiten. Mit f.read() lesen wir dann den kompletten Inhalt der Datei als String. Und zum guten Schluss, schließen wir die geöffnete Datei, damit wir nicht unnötig Resourcen vom Computer blockieren, die auch andersweitig verwendet werden könnten.

Das wars auch schon fast. Jetzt können wir eine Wordcloud daraus erstellen.

simple_wordcloud/src/simple_wordcloud/main.py:

def main():
    f = open("books/lafcadio.txt", "r")
    book = f.read()
    f.close()

    wordcloud = WordCloud().generate(book)
    plt.imshow(wordcloud)
    plt.show()

Mit WordCloud() initialisieren wir eine WordCloud. Die generate Funktion generiert dann eine neue WordCloud aus dem Text, den wir ihr gegeben haben.

plt.imshow(wordcloud) nimmt die generierte Wordcloud und zeigt diese als ein Image grafisch dar, beziehungsweise wird die Wordcloud hier noch nicht gezeigt, sondern einer "Warteliste" hinzugefügt und mit plt.show() werden dann alle "Aufträge" von der "Warteliste" grafisch in einem neuen Fenster dargestellt.

Wenn wir jetzt poetry run start in der Konsole ausführen, dann sehen wir solch eine Wordcloud:

Diese Wordcloud sieht aber ein bisschen hässlich aus, oder?

Wir können der WordCloud noch mehr Informationen geben, um diese hübscher zu machen. Hier mal ein Beispiel:

def main():
    # ...

    wordcloud = WordCloud(
        background_color = "white",
        height = 1000,
        width = 1000,
    ).generate(book)
    
    # ...

Als erstes mache ich den Hintergrund weiß und die Höhe und Weite zu 1000px, damit unsere Wordcloud eine höhere Auflösung hat und nicht mehr so verschwommen aussieht.

Somit sieht unsere Wordcloud jetzt viel besser aus:

Speicher Wordcloud als .png

Mit plt.show() zeigen wir zwar die Wordcloud grafisch in einem Fenster und ich könnte jetzt davon ein Screenshot machen, um es zum Beispiel in meiner Hausarbeit zu verwenden, aber dies geht auch viel viel besser.

Die to_file Funktion von WordCloud erlaubt es uns, eine generierte WordCloud als png, jpg/jpeg, svg oder pdf abzuspeichern.

Zum Beispiel hier speichere ich die Wordcloud als png in den Ordner "ouput", den ich in meinen Projekt erstellt habe, ab:

def main():
    # ...

    wordcloud.to_file("output/cloud_simple.png")
    
    # ...

Am Ende sieht der ganze Code alles zusammen dann so aus:

from wordcloud import WordCloud
import matplotlib.pyplot as plt

def main():
    f = open("books/lafcadio.txt", "r")
    book = f.read()
    f.close()

    wordcloud = WordCloud(
        background_color = "white",
        height = 1000,
        width = 1000,
    ).generate(book)

    wordcloud.to_file("output/cloud_simple.png")

    plt.imshow(wordcloud)
    plt.show()