Je vindt mensen van alle leeftijden op Twitter. Bovendien zorgen de korte berichten ervoor dat het zeer laagdrempelig is, waardoor mensen zeer vlot berichten (of tweets in het jargon) plaatsen. Dit maakt Twitter uitermate geschikt om trends in de bevolking op te volgen. Om onderzoekers te helpen biedt Twitter hiervoor een API aan. Dit is een manier om de website te bekijken zonder een browser te gebruiken en om de gegevens in een gestructureerde manier terug te krijgen, zodat ze gemakkelijker verwerkt kunnen worden door een computerprogramma.

Om trends te onderzoeken kan je bijvoorbeeld een frequentietabel opstellen van de woorden die gebruikt worden. Als je dit doet met de tweets die je krijgt door te zoeken naar een bepaalde term, dan verwacht je dat die zoekterm een hoge frequentie heeft en dat gerelateerde woorden ook vaak voorkomen.

Een klassieke manier om een frequentietabel voor te stellen op een manier die visueel interessant is voor het menselijke oog, is een woordenwolk. In een woordenwolk krijgen de woorden met een hogere frequentie een groter lettertype, waardoor ze ook gemakkelijker opvallen.

Hierboven zie je een voorbeeld van zo'n woordenwolk. Deze woordenwolk werd opgebouwd aan de hand van de resultaten voor de zoekterm 'word cloud'. Je ziet hier meteen ook dat zo'n frequentietabel gemakkelijk kan vollopen met zogehete stopwoorden, i.e., woorden die niet direct gerelateerd zijn aan de zoekterm, maar gewoon altijd vaak voorkomen in een bepaalde taal.

Voorbereiding

De zoek-API van Twitter kan je bereiken via de url http://search.twitter.com/search.json?q=zoekterm, waarbij je zoekterm vervangt door het specifieke woord dat je wil opzoeken. De API geeft dan de resultaten terug in JSON-formaat (JavaScript Object Notation). In principe heeft dit formaat niets met Python te maken, maar gelukkig wordt dit op exact dezelfde manier genoteerd als een geneste dictionary. Dit wil zeggen dat we de string gewoon met de functie eval kunnen interpreteren. Hierbij duiken er echter drie kleine problemen op: in JavaScript wordt None genoteerd als null, True als true en False als false. Als we echter drie variabelen aanmaken die die namen hebben en de corresponderende waarden bevatten, dan kunnen we zo'n resultaat in één keer verwerken. Hieronder zie je een voorbeeld van hoe dit kan gedaan worden. We gaan er hier vanuit dat de variabele resultaat de tekst bevat die je terugkrijgt van de API.

null, true, false = None, True, False
dictionary = eval(resultaat)

De dictionary die we hierboven hebben geconstrueerd, bevat een sleutel 'results' waarmee een lijst correspondeert. In die lijst zitten dictionaries die elk de tekst van een tweet bevatten verbonden met de sleutel 'text'.

Opgave

Schrijf een functie twitterwolk die één verplicht argument heeft en twee optionele argumenten. Het verplichte argument is de zoekterm waarop gezocht wordt. Deze zoekterm mag geen spaties bevatten. De functie geeft als resultaat een frequentietabel terug van de woorden in de tweets die teruggegeven worden voor die zoekterm. Een woord is hierbij een zo lang mogelijke opeenvolging van letters (ook met accenten), cijfers, het karakter # en het karakter @. Het eerste optionele argument heeft de naam stopwoorden en bevat een verzameling met de woorden die genegeerd moeten worden. Als dit argument niet opgegeven wordt, dan wordt de verzameling gebruikt die enkel de string 'RT' bevat (i.e. de afkorting die op Twitter wordt gebruikt om een retweet aan te duiden). Het tweede optionele argument heeft de naam aantal en bevat standaard de waarde 20. Dit is het aantal woorden dat opgenomen moet worden in de uiteindelijke frequentietabel. De frequentietabel bevat dan natuurlijk de woorden met de hoogste frequentie. Als er meerdere woorden zijn met hetzelfde aantal, dan wordt voorrang gegeven aan de woorden die alfabetisch eerst gerangschikt worden. Alle vergelijkingen van woorden moeten hoofdlettergevoelig gebeuren.

Voorbeeld

Door de veranderlijke inhoud die je terugkrijgt van de zoek-API van Twitter zal het niet mogelijk zijn om dit voorbeeld als DocTest te gebruiken.

>>> twitterwolk('geografie')
{
   'i': 39,
   'na': 48,
   'geografie': 82,
   'mi': 9,
   'nie': 17,
   'sie': 36,
   'in': 9,
   'mam': 12,
   'D': 8,
   'Geografie': 13,
   'a': 13,
   'ale': 9,
   'chemie': 7,
   'fizyke': 8,
   'historie': 12,
   'ja': 13,
   'to': 8,
   'uczyc': 9,
   'z': 14,
   'za': 8
}