einfache Wordcloud
Um ganz schnell und einfach eine Wordcloud zu erstellen, brauchen wir nur die Packages "wordcloud" und "matplotlib" in unser Pythonprojekt zu installieren.
In Kapitel - Python Projekt aufsetzen habe ich gezeigt,
wie man ein neues Pythonprojekt mit poetry aufsetzt
und in diesem Kapitel habe ich gezeigt,
wie wir ein Projekt so aufsetzen können, dass wir es mit poetry run start
ausführen können.
Nachdem wir mit poetry add wordcloud matplotlib
als Befehl in unserem Projekt ausgeführt haben,
können wir dies direkt als aller erstes ganz oben in unserer main.py
Datei importieren:
from wordcloud import WordCloud
import matplotlib.pyplot as plt
Hier importiere ich WordCloud
von dem Package wordcloud und
pyplot
von matplotlib, welches ich umbenenne zu plt
,
um später nicht immer pyplot
tippen zu müssen, sondern einfach nur plt
.
Um eine Wordcloud von etwas erstellen zu können,
brauchen wir das "etwas", zum Beispiel ein Buch.
Dafür habe ich mal das Buch "Japan an attempt at interpretation"
von Lafcadio als .txt
Datei aus dem Internet heruntergeladen
und in den Ordner "books" in meinem Projekt mit den Namen "lafcadio.txt" abgespeichert.
Sobald wir ein Buch oder irgendeinen anderen Text haben, müssen wir diesen erstmal in unser Programm lesen:
def main():
f = open("books/lafcadio.txt", "r")
book = f.read()
f.close()
Mit der Funktion open
geben wir den Pfad zu einer Datei, die wir sprichwörtlich "öffnen" wollen,
mit einem zweiten String, um den Betriebsystem zu sagen, dass wir vorhaben diese Datei zu lesen.
Mit 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.
Um jetzt eine Wordcloud zu erstellen, fügen wir diese Zeilen noch hinzu:
def main():
# ...
wordcloud = WordCloud().generate(book)
plt.imshow(wordcloud)
plt.show()
Mit WordCloud()
initialisieren wir eine WordCloud.
Die generate
Funktion generiert dann eine neue WordCloud mit dem Text,
den wir eben dieser "generate" Funktion geben.
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",
in dem Fall nur die eine Wordcloud,
die wir plt
gegeben haben, grafisch in einem neuen Fenster dargestellt.
Wenn wir jetzt poetry run start
in der Konsole ausführen,
dann sehen wir eine Wordcloud:
TODO: Bild
Diese Wordcloud sieht aber ein bisschen hässlig 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,
max_words = 200,
random_state = 5,
).generate(book)
# ...
Als erstes mache ich den Hintergrund weiß und
die Höhe und Weite zu 1000px,
damit unsere Wordcloud nicht nur größer ist,
sondern auch eine höhere Auflösung hat und nicht mehr so verschwommen aussieht.
Mit max_words
kann ich sagen wie viele Wörter ich in der Wordcloud maximal haben möchte.
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")
# ...
Der ganze Code
Am Ende sieht dann der ganze Code alles zusammen 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,
max_words = 200,
).generate(book)
wordcloud.to_file("output/cloud_simple.png")
plt.imshow(wordcloud)
plt.show()