Word Cloud
Daarom
Om mijn website wat content te geven leek het mij wel leuk om een wordcloud toe te voegen. Deze wordcloud gebruikt mijn CV pagina als bron en gebruikt de URL om de tekst te 'scrapen'. Vervolgens wordt met behulp van de Natural Language Toolkit (NLTK) de tekst ontdaan van de stopwoorden (de, het, een, etc.) zodat de relevante woorden overblijven. Deze woorden worden dan groter naarmate ze vaker voorkomen in de tekst.
Maar om het nog wat leuker te maken heb ik mijn foto gebruikt en de contouren van mijn hoofd gebruikt als de grens waar binnen de woorden moeten worden opgetekend. Vervolgens heb ik de foto in 2 lagen opgebouwd; mijn hoofd als achtergrond en de woorden uit de website op de voorgrond.
Hieronder het resultaat
En de uitleg van het gebruikte Python programma
import requests
from bs4 import BeautifulSoup
from nltk.corpus import stopwords
from nltk.tokenize import sent_tokenize, word_tokenize
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
requests wordt gebruikt om de URL op te vragen
BeautifulSoup wordt gebruikt om de HTML te parsen
nltk wordt gebruikt om de tekst te interpreteren en de stopwoorden te herkennen
wordcloud wordt gebruikt om de overgebleven woorden te rangschikken
matplotlib wordt gebruikt om de wordcloud te plotten op het scherm
PIL wordt gebruikt om een image te kunnen openen
numpy wordt gebruikt om het image als array beschikbaar te krijgen
request = requests.get('https://jhmvdh.home.xs4all.nl/indexeng.html')
soup = BeautifulSoup(request.text, 'html.parser')
De webpagina wordt opgevraagd en de HTML gescraped
content= soup.find("div", attrs= {"class" : "w3-content w3-margin-top"})
text = content.get_text()
# break into lines and remove leading and trailing space on each
lines = (line.strip() for line in text.splitlines())
# break multi-headlines into lines
chunks = (phrase.strip() for line in lines for phrase in line.split(" "))
# drop blank lines
text = 'n'.join(chunk for chunk in chunks if chunk)
#download and print the stop words for the English language
stop_words = set(stopwords.words('english'))
#tokenise the data set
words = word_tokenize(text)
# removes punctuation and numbers
wordsFiltered = [word.lower() for word in words if word.isalpha()]
# remove stop words from tokenised data set
filtered_words = [word for word in wordsFiltered if word not in stopwords.words('english')]
# remove some additional words (fixed)
not_in =["Aegon", "aegon", "within"]
for word in list(filtered_words):
   if word in not_in:
      filtered_words.remove(word)
# add some additional words (little cheating to get the attention)
add_in =["Jos", "Jos", "Jos", "Jos", "Jos","CRM", "CRM", "CV", "CV","CV" ]
for word in list(add_in):
   filtered_words.append(word)
De woorden worden omgezet naar een hanteerbare, gefilterde lijst
mask = np.array(Image.open('jos_selfie.jpg'))
wc = WordCloud(mask=mask, background_color="white",
      max_words=2000, max_font_size=256,
      random_state=42, width=mask.shape[1],
      height=mask.shape[0])
wc.generate(' '.join(filtered_words))
plt.imshow(wc, interpolation="bilinear")
plt.axis('off')
plt.show()
wc.to_file("image.jpg")
De wordcloud wordt gecreeerd op basis van het masker van de foto.
Vervolgens wordt de wordcloud als foto (jpg) aangemaakt.
Zelf ook een wordcloud hebben maar vindt je zelf maken te lastig? Ik maak hem voor je als relatiegeschenk :)
Stuur me je verzoek en vermeldt ook de URL van jouw site in het bericht.