Sentiment Analysis on Tweets www.Twolitiek.nl
Een onderzoek uitgevoerd door eerstejaars informatiekundestudenten 2010-2011 van de Universiteit van Amsterdam ten dienste van het programma Project IK in de Praktijk.
Studenten
Begeleiding
Tim van Bremen (6304257)
Dr. Maarten Marx
Martijn van Tongeren (6288413)
Aitor Azcarate Onaindia
Walraaf Borkent (6350321)
Justin van Wees
Armand de Waard (6217206)
Bart de Goede
Nikki Winands (6088651)
28-01-2011
Inhoudsopgave Samenvatting
3
H1
| Inleiding
5
H2
| Operationalisering
7
- Hoofdvraag
5
- Hypothese
5
- Afbakening
5
- Definities
5
| Manier van werken & Evaluatie
9
- Database
9
- Handmatige analyse
9
- Analyse door gebruik van systeem
10
- Classifier
12
- Matrices
13
- Problemen
15
H3
- Probleem 1:
Sarcasme & Ironie
15
- Probleem 2:
Python modules met SQL Server
15
- Probleem 3:
Firewall
16
- Probleem 4:
Resttweets
16
- Probleem 5:
Time-Out van MySQL
17
- Probleem 6:
Datum & Loop
17
- Probleem 7:
Naive Bayes Classifier
17
H4
| Resultaten
18
H5
| Discussie
22
H6
| Conclusies
23
Referenties
24
Sentimental Analysis on Tweets www.Twolitiek.nl
2
Bijlagen
25
1. Pseudocode
25
2. Email wetenschappers Sarcasme Identifier
27
3. Selfassesment
28
4. Matrices
33
5. Logboeken
36
6. Reflectieverslag
41
7. Programmatuur
42
Sentimental Analysis on Tweets www.Twolitiek.nl
3
Samenvatting: In dit project ontwerpen we een systeem dat automatisch het sentiment op Twitter analyseert, gericht op de politiek in Nederland. Om te beginnen analyseren we handmatig 2500 aan de politiek gerelateerde Tweets. Door op deze manier te analyseren duiken er patronen en veelvoorkomende woorden op, die vaak het sentiment in een Tweet bepalen. Deze patronen en woorden gebruiken we om meerdere classifiers te maken die met algoritmes het sentiment proberen te bepalen. Ons automatische systeem analyseert de Tweets met deze verschillende classifiers, die weer gebruik maken van onder andere diverse sentimentwoordenlijsten. Om de Tweets te archiveren en resultaten te indexeren maken we gebruik van een database. Zo blijft de data langer bestaan, kan gemakkelijk met de gegevens gewerkt worden en is het systeem niet afhankelijk van de “houdbaarheid” van data op Twitter. We waarborgen de kwaliteit van onze resultaten door ons analyse-systeem te evalueren met behulp van de handmatig geanalyseerde politieke Tweets en door een vergelijking te stellen tussen debatresultaten en de door ons systeem bepaalde stemming op Twitter. Belangrijke data in de politiek van het afgelopen jaar zijn vergeleken met de grafieken die gebaseerd zijn op sentimentele Tweets van die datums. Hieruit kunnen we afleiden wat de mening is van het publiek. De uiteindelijke resultaten worden verwerkt in een website, waar gebruikers per partij en politicus het sentiment kunnen inzien. Dit wordt afgebeeld in verschillende grafieken.
Sentimental Analysis on Tweets www.Twolitiek.nl
4
H1
| Inleiding Tegenwoordig zijn de sociale media niet meer weg te denken uit de
samenleving. Sociale media geeft de gebruiker de mogelijkheid om met elkaar te communiceren, zich online te uiten en meningen te delen. Men kan aan zijn of haar behoefte voldoen, met name sociaal gedrag, zelfontplooiing en erkenning. Dit gebeurt onder andere op de sociaalnetwerksite1 Twitter. Twitter wordt als volgt beschreven op Wikipedia: “Twitter is een internetdienst waarmee gebruikers korte berichtjes publiceren. Het is een sociaalnetwerksite waarop men zichzelf, zoals bij Facebook, een profiel en een avatar kan aanmeten.”
Twitter is één van de meest gebruikte sociale-media-applicaties van dit moment. Mensen gebruiken deze website om hun mening over een bepaald onderwerp bekend te maken, of om simpelweg een update te geven van wat men aan het doen is. Twitter maakt gebruik van hashtags2. Men kan zelf hashtags aanmaken en gebruiken bij het plaatsen van een bericht. Er kan hier gezocht op worden, als resultaat worden dan Tweets3 van mensen getoond die deze hashtag bevatten. Op Twitter sturen gebruikers zogenaamde “Tweets” van maximaal 140 1
karakters. Dit kan via e-mail, SMS[4] via de Twitter-website zelf of met andere
applicaties van Twitter, Inc. Twitter is in de loop van de laatste twee jaar een enorme hype geworden, verschillende leeftijdscatogorieën en bevolkingsgroepen posten Tweets. De onderwerpen zijn zeer uiteenlopend, van een gebroken been tot aan wereldwijd nieuws. Een populair onderwerp onder de Twitterpopulatie is politiek. Ministers gebruiken Twitter als communicatiemiddel voor promotie van zichzelf en van hun partij. Na elke politieke bijeenkomst en/of event Tweeten de politici er op los om hun volgers op de hoogte te houden.
Sentimental Analysis on Tweets www.Twolitiek.nl
5
Om inzicht te krijgen hoe de Twitterpopulatie denkt over de politiek van Nederland, hebben wij een automatisch systeem ontworpen met de vraag of bepaalde politieke partijen en politici positief, negatief of neutraal worden gezien door de Twitteraars. Wij analyseren op sentiment, het gevoel van innerlijke beleving van een bepaalde gebeurtenis. Sentiment kan gemeten worden door woorden die gebruikers tweeten, waaruit opgemaakt kan worden of dit negatief of positief is. Uiteindelijk zal dit leiden tot een resultaat waaraan men kan zien hoe de Nederlandse populatie zou kunnen stemmen, waar positief en negatief naar wordt gekeken. Ook kan men met dit systeem concluderen welke politieke partij en/of persoon populair is onder de Twitteraars.
1
Een website die gebruikers een profiel aan laat maken, vervolgens kan dit gekoppeld worden aan de
profielen van anderen binnen hun sociaal netwerk. 2
Labels toevoegen aan je Tweet, om aan te geven wat het onderwerp is van je tweet, bijvoorbeeld
#dwdd (De Wereld Draait Door). 3
Post op Twitter van gebruikers
4
Short message service, een dienst om met behulp van mobiele telefonie korte berichten te versturen
of te ontvangen], IM[voetnoot: instand messenging, technologieen waarbij de berichten zo snel mogelijk worden overgebracht via netwerken met een open of gesloten protocol.
Sentimental Analysis on Tweets www.Twolitiek.nl
6
H2
| Operationalisering
Hoofdvraag: Is het mogelijk om binnen een bepaalde periode het sentiment over politici en politieke partijen op Twitter te bepalen, door Tweets te analyseren met een automatisch systeem?
Hypothese: Wij verwachten dat bij grote aantallen Tweets een redelijk accuraat beeld ontstaat van het sentiment over een politicus of partij. Onder redelijk accuraat verstaan wij dat onze resultaten een vergelijkbaar sentiment weergeven, als de stemming die in de media heerst bij speciale gebeurtenissen. Zo zal bij een politieke blunder een negatieve piek in het sentiment over de betrokken politicus te zien moeten zijn en vice versa. Dit is de verwachting, ook al zullen individuele Tweets niet altijd goed beoordeeld worden door een automatisch systeem. Door de onjuiste beoordeling van zowel positieve als negatieve Tweets, verwachten wij dat deze foutieve interpretaties elkaar enigszins opheffen bij het gebruik van grote aantallen Tweets, waardoor op basis van de overwegend juiste interpretaties alsnog een redelijk accuraat beeld kan ontstaan van een politicus of partij.
Afbakening: Wij hebben ervoor gekozen om ons systeem te beperken tot Tweets die gericht zijn op de politiek. Over de politiek is veel data en vergelijkingsmateriaal beschikbaar, bijvoorbeeld: media, peilingen, verkiezingsresultaten en dergelijke. Dit is onder andere een domein waarbinnen de meningen vaak veranderen. Hierdoor ontstaat een erg volatiel sentiment. Dit voorziet ons van vele ijkpunten om het systeem te evalueren.
Definities en metingen: Om te beoordelen of onze analyses inderdaad een redelijk accuraat beeld geven van het sentiment in Tweets, verzamelen we Tweets rond de data van oudere debatten. Vervolgens vergelijken we de resultaten van onze automatische analyse met de
Sentimental Analysis on Tweets www.Twolitiek.nl
7
peilingen en de uitslagen die rond die tijd in de media verschenen. Werd een bepaalde partij populairder na een debat? Of juist minder populair? Onze resultaten zullen dit dan ook moeten weergeven als een significant1 positiever of negatiever sentiment ten opzichte van de dag ervoor.
Tweets waarin afkortingen van partijen of de namen van een aantal politici voorkomen, worden opgeslagen in een database, Justin van Wees2 heeft ons met data voorzien van het afgelopen jaar. Voor de evaluatie hebben we zelf een script geschreven waarmee we unieke Tweets konden binnenhalen. Zo haalden we 2500 unieke Tweets binnen, op basis van 10 politiekgerelateerde termen. Deze Tweets hebben we met de hand geanalyseerd om een gouden corpus3 te creëren. Vervolgens programmeerden we een systeem dat Tweets automatisch kan analyseren en bepaalt of er een positief of negatief sentiment in zit. Dit sentiment bepaalden we met diverse classifiers4 die bijvoorbeeld gebruikmaken van woordenlijsten met positieve en negatieve woorden, onder andere uit onze gouden corpus. Het uiteindelijke doel is om een onbepaald aantal Tweets te kunnen analyseren en hierover het sentiment aan te geven.
1
Significant is het uitdrukken van de nauwkeurigheid in een meting Derdejaars student informatiekunde, Universiteit van Amsterdam 3 Wat is een gouden corpus, kort maar krachtig? 4 Een classifier is een functie die een klasse biedt als een output van een set van attributen die als input worden gebruikt. Een manier om een classifier te bouwen is om een set van gelabelde voorbeelden te nemen en om een regel dat een tag kan toewijzen aan een andere vorm van input data te definiëren. 2
Sentimental Analysis on Tweets www.Twolitiek.nl
8
H3
| Manier van werken & Evaluatie Om ons onderzoek te realiseren hebben we een handmatige analyses
uitgevoerd, een automatisch systeem ontworpen en vervolgens deze met elkaar vergeleken om te beoordelen hoe accuraat onze resultaten zijn. Het systeem gebruikt een database om de gegevens op te slaan.
Database Wij hebben een database ontworpen waar wij alle gegevens kunnen bewaren en toepassen. De database is voortgezet met het programma mySQL5. Python 6 wordt gebruikt als programmeertaal om classifiers te maken en data te verwerken. Wij gebruiken PHP7, om de resultaten vanuit de database weer te geven op de website. Deze database bestaat uit: -
Woordenlijsten
-
Scores per Tweet
-
Alle Tweets met bijbehorende tags van het afgelopen jaar (afgestemd op politiek)
-
Gemiddelde sentiment van politici/partij per dag,
-
Hoeveelheid tweets wordt aangegeven van politici en partijen
Handmatige analyse Wij zijn begonnen met het downloaden van 2500 Tweets, dit deden we door middel van een klein script, deze zag er zo uit “ cat zoeken.txt | while read LINE do for i in 1 2 3 4 5 6 7 8 9 do lynx 'http://search.twitter.com/search?q='$LINE'&rpp=100&lang=nl&page='$i --source | grep '<span .* class="msgtxt nl".*' | sed 's/<[^>]*>//g' | sed 's/&[^;]*;//g' | sed 's/[^:]*://' >>
5
MySQL is een open source relationele databasemanagementsysteem (RDBMS) Python is een krachtige programmeertaal, met efficiënte high-level datastructuren en een eenvoudige maar effectieve benadering van object-georiënteerd programmeren. 7 PHP is een scripttaal, die bedoeld is om op webservers dynamische webpagina's te creëren. 6
Sentimental Analysis on Tweets www.Twolitiek.nl
9
Tweetsres.txt done done
“ Nadat alle 2500 Tweets gedownload waren, hebben we deze in een Comma Separated Values(.csv)-file gezet. Deze konden we openen als spreadsheet, dit was erg handig voor de handmatige verwerking. In de spreadsheet hebben we meerdere kolommen aangemaakt: ●
voor de Tweets
●
objectief of subjectief
●
positief sentiment
●
negatief sentiment
●
aantonende sentiment woorden voor positief
●
aantonende sentiment woorden voor negatief
●
optioneel commentaar (eventueel voor sarcasme, ironie en negatieve ondertoon)
Doordat al deze Tweets met de hand zijn verwerkt, is de analyse zeer betrouwbaar. Dit is zogezegd onze gouden corpus. Als het automatische systeem hier goed mee overeenkomt, dan kan men zeggen dat ons systeem betrouwbaar is.
Een voorbeeld hoe sentiment wordt gedefinieerd: “Wilders was de beste debater vandaag in de Tweede Kamer” Het woord „beste‟ geeft hier een subjectieve mening, namelijk een positieve mening over de heer Wilders. De tag „beste‟ komt voor in de positieve woordenlijst in de database en wordt dus als positief gezien.
Analyse door gebruik van systeem Het systeem bestaat uit meerdere en uitgebreide scripts. Om te beginnen hebben we een pseudocode geschreven (zie bijlage 1), Deze is opgesteld om het overzicht in de code te kunnen houden. Door eerst het systeem globaal op te stellen in normale taal, is het makkelijker deze om te zetten in een geprogrammeerde, werkende omgeving.
Sentimental Analysis on Tweets www.Twolitiek.nl
10
Onderstaand een onderdeel van de pseudocode:
Voor elke tweet Maak tweets lowercase hak in losse woorden stop woorden in tweetarray ( array per tweet) vergelijk elk woord uit tweetarray met elk woord uit positiefarray for elk woord uit tweetarray matcht woord uit positief array if niet/geen voor matchende woord negatiefcounter + 1 else positiefcounter + 1
Er wordt aangegeven wat de code moet doen, en hoe het in zijn werk gaat. Door dit per stuk om te zetten in werkende code kan het overzicht bewaard worden en als er ergens een fout zit kan er vaak snel gezien worden waar het fout gaat.
Woordenlijsten Er zijn geen vaste woordenlijsten die afgestemd zijn op het sentiment van Twitter, dus hebben wij onze eigen dataset ontworpen. Eerder genoemd de handmatige woordenlijst, een lijst met tags die sentiment beschrijven van Twitter-rater en een lijst van Katja Hofmann en Valentin Jijcoun. Zij hebben zelf ook onderzoek gedaan naar sentiment. Onze handmatige lijst bestaat uit 1027 sentimentele woorden vanuit de gouden corpus, Twitter-rater bestaat uit 248 woorden en de lijst van Hofmann en Jijcoun bestaan uit 5274 woorden.
Classifier en matrix
Een classifier behoort tot de Unified Modeling Language (UML) elements, dit bevat een aantal gemeenschappelijke kenmerken zoals atttributen en methoden. Het is een abstract metaclass classification concept dat geschikt is als mechanisme om interfaces, classes, datatypes en components te laten zien. Een classifier beschrijft
Sentimental Analysis on Tweets www.Twolitiek.nl
11
een set van gevallen die gemeenschappelijke gedrags- en structurele kenmerken hebben. In de lineaire algebra is een matrix een rechthoekig getallenschema. Dit is een middel om samenhangende gegevens en hun bewerkingen op een systematische en overzichtelijke wijze weer te geven. Dit kan gebruikt worden als een meetinstrument om een classifier te testen. Vooraf, tijdens en na het gehele project wordt alles geëvalueerd, ook de classifier en resultaten uit de matrix. Met evalueren van informatie door het verzamelen, interpreteren en presenteren kan men de waarde van een proces bepalen.
Classifier De woordenlijsten worden doorgevoerd in verschillende methodes, de classifiers. Wij hebben vijf methodes gecreëerd die uiteindelijk, gecombineerd met de woordenlijsten, uitkomen op een totaal van zeventien classifiers. Iedere methode gebruikt een unieke combinatie van regels bij de beoordeling van het sentiment. De eerste methode telt alle woorden in de Tweets die voorkomen in de woordenlijsten uit onze database. De Tweets worden eerst beoordeeld op objectief en subjectief, vervolgens op positief en negatief met de som: sentiment = positief - negatief. De tweede methode controleert ook of de woorden voorkomen in onze woordenlijsten, maar berekent het sentiment anders. Namelijk ongeacht hoeveel sentimentele woorden erin voorkomen, is het laatste sentimentele woord altijd de doorslaggevende die het sentiment bepaald. De derde methode combineert beide methodes. In eerste instantie wordt op dezelfde manier beoordeeld als de in eerste methode, maar wanneer er een gelijk aantal positieve en negatieve woorden in de Tweet staan, wordt er alsnog een sentiment in bepaald door het laatste woord doorslaggevend te maken. Bijvoorbeeld als twee positieve en negatieve woorden voorkomen in de Tweet, geeft dit bij de eerste methode het resultaat nul, dus objectief. In de derde methode is dan het sentiment van het laatste woord doorslaggevend. Uit deze drie methodes hebben we de meest accurate methode gebruikt om extra regels toe te passen, dit was de derde methode. Eerst hebben wij een regel toegevoegd die de woorden “niet” en “geen” detecteert en het daaropvolgende woord een omgekeerde betekenis geeft. Bijvoorbeeld: “... is niet leuk..”. In de eerdere drie
Sentimental Analysis on Tweets www.Twolitiek.nl
12
methodes zou dit uitkomen als positief omdat het woord “leuk” er tussen staat. Met deze regel wordt “niet leuk” gezien als negatief. Zo ontstond de vierde methode. Als laatste hebben wij nog een regel toegepast in de derde methode met de handmatige woordenlijst, die zoekt naar links in de Tweets. In principe is elke Tweet met een link een objectief bericht, meestal zijn dit nieuwsberichten. Zo zorgt deze regel voor een betere beoordeling van subjectiviteit. Dit is de vijfde en laatste methode, die uiteindelijk gebruikt is om de Tweets te beoordelen. De Tweets die uit de database komen, worden “gereinigd”. Leestekens worden verwijderd en alles wordt “lower-case” gemaakt om vervolgens een array alleen van losse woorden over te laten blijven om de sentimentwoorden te vergelijken. Dit doen we zodat alle woorden in de Tweets vergeleken kunnen worden uit de woordenlijsten.
Matrix Om de classifiers te vergelijken in kwaliteit hebben wij het meetinstrument, de matrix, gebruikt. Een relevante matrix voor onze resultaten, is de confusion matrix. Dit type matrix is een visualisatie tool. Elke rij van de matrix toont de instanties van de predicted class (classifier). Elke kolom toont de instanties van de actual class (gouden corpus). Als een matrix niet in balans is, dus als de getallen van verschillende classes te veel van elkaar verschillen. Dan is er sprake van een error rate in de classifier die niet representatief van de “true performance” van de classifier is. Deze misclassification error rate is te berekenen door de volgende formule toe te passen:
Elk model moet meer voorspellende “macht” hebben dan het standaard model, een perfect model met 0 error rate bestaat niet in de praktijk. Een perfect model ziet er als volgt uit:
Sentimental Analysis on Tweets www.Twolitiek.nl
13
Objectief
Subjectief
Objectief
50
0
Subjectief
0
50
Alles wat objectief is, wordt ook als objectief gezien door de classifier, en vice versa voor subjectief. Het doel is natuurlijk wel om altijd naar een perfect model te streven, zo min mogelijk errors in de classifier. Als de getallen in de diagonale lijn, van linksboven naar rechtsonder, veel hoger zijn in vergelijking met de andere getallen in de matrix, betekent dit dat de classifier grotendeels correct is. Uiteindelijk kan er met deze getallen een percentage worden berekend waardoor men kan concluderen of de classifier correct is of niet, het streven is gemiddeld rond de 70% of meer. Het beste model is het model dat een class het meest accuraat kan voorspellen van een nieuwe “case”. Accuraat betekent dat er gestreefd wordt naar nauwkeurigheid. Men probeert fouten te voorkomen en ziet erop toe dat de taken binnen het model grondig, geordend en zorgvuldig wordt uitgevoerd. Het percentage van correctheid, bepaalt onder andere de accuraatheid.
Sentimental Analysis on Tweets www.Twolitiek.nl
14
Problemen Probleem 1: Sarcasme & ironie Om een goed inzicht te krijgen in ons automatisch sentiment-systeem, moeten wij eerst zelf een groot aantal Tweets analyseren om erachter te komen welke woorden er worden gebruikt in Tweets van gebruikers. Bepaalde Tweets werden op een sarcastische of ironische manier verwoord. Dit was het eerste probleem waar wij tegen aan liepen. Alleen door het te lezen kan men redeneren dat dit sarcastisch of ironisch is, of zelfs met een negatieve ondertoon. In dit soort Tweets komen bepaalde sentimentele woorden voor, die ook voorkomen in positieve of negatieve Tweets. Hierdoor is het moeilijk om deze woorden van elkaar te onderscheiden en in een hokje te plaatsen, of de keywords positief, negatief of neutraal zijn. Het automatisch herkennen van sarcasme en ironie blijft daarom nog steeds een uitdaging. Men zou dan een algoritme ontwerpen die bestaat uit een sarcasme identifier. Oren Tsur, Dmitry Davidov en Ari Rappoport hebben hier onderzoek naar gedaan, en zijn gaan experimenteren met een semi-supervised algorithme met de sarcasme identifier en pasten dit toe op 66000 reviews van Amazon. Ook zij hebben, net als wij, handmatig berichten van gebruikers geanalyseerd en percentages berekend wat wel of niet sarcastisch is. Dit geeft kwaliteit aan het systeem wat men wilt gebruiken, een gouden corpus. Om zelf een sarcasme identifier te ontwerpen hebben wij te weinig tijd (vier weken), daarom hadden wij de schrijvers van het artikel gemaild. Helaas was het niet mogelijk om de code te verkrijgen, het IP(intellectual property) is beveiligd door de universiteit en een van de onderzoekers is overleden(zie bijlage 3).
Probleem 2: Python modules met SQL server Een ander probleem kwamen wij tegen tijdens het programmeren van het systeem. Bij de installatie van de combinatie van Python en de module voor communicatie in Python met de SQL server, moest deze module eerst worden gecompileerd. Hier kwamen veel errors opduiken en aanvullende pakketten die geïnstalleerd moesten worden. Dit kostte veel tijd en moeite. Uiteindelijk hebben wij een pre-compiled
Sentimental Analysis on Tweets www.Twolitiek.nl
15
installatie bestand voor deze module op de website: http://www.lfd.uci.edu/~gohlke/pythonlibs/ gevonden. Als wij deze module niet hadden toegepast dan zou de code niet direct op de SQL server kunnen draaien, met uitzondering van de Linux machines van de Universiteit van Amsterdam zelf. Dit heeft enige vertraging bezorgt bij het verwerken van miljoenen Tweets.
Probleem 3: Firewall Verder had de server in het datacenter problemen, met name door overbelasting en te veel connecties voor de firewall. Door een andere firewall te gebruiken, de cisco pix8, kunnen wij alle grote scripts op de server zelf draaien (zonder Internet).
Probleem 4: Resttweets Bepaalde resterende Tweets waren moeilijk om te bepalen, om dit op te lossen gebruiken we het laatste sentimentwoord. Dit is het doorslaggevende woord dat bepaald welk sentiment het bericht heeft. Dit hebben we gedaan met de volgende snippet: if ( sentiment == 0 and ( positiviteit != 0 or negativiteit != 0 ) ): stop = 0 for woord in reversed(tweet): if ( stop != 1 ): for neg1 in neg: if ( woord in neg1 ): aantalnegTweets += 1 insert += "('" + str(row[1]) + "', -1)," stop = 1 for pos1 in pos: if ( woord in pos1 ): aantalneuTweets += 1 insert += "('" + str(row[1]) + "', 0)," stop = 1
8
Cisco pix, Private Internet eXchange, enterprise firewall
Sentimental Analysis on Tweets www.Twolitiek.nl
16
Probleem 5: Time-out van MySQL Er was een time-out van de MySQL database bij de verwerking van honderdduizenden Tweets tegelijk, om een volgende time-out te voorkomen hebben wij een counter ingesteld die de database in blokken van 100 000 Tweets update.
Probleem 6: Datum & Loop De gescoorde Tweets die werden verwerkt tot een dagelijks sentiment over een bepaalde tag waren lastig om een loop van te maken. Deze loop moest door de juiste dagen heen lopen en voor elke dag een score berekenen. Het was met name lastig omdat niet iedere dag over elke tag getweet wordt, en de datumkolom in de database ook een tijd bevat. Hierdoor selecteerde een unieke datum niet alleen enkele dagen maar ook dezelfde dagen met verschillende secondes/minuten. Om de dagen te kunnen bepalen waarop over een bepaalde tag getweet is, hebben we uiteindelijk toch een query kunnen ontwerpen: SELECT DISTINCT DATE( created_at ) FROM twitter_tweet INNER JOIN twitter_tweet_tag ON twitter_tweet.id = twitter_tweet_tag.twitter_tweet_id WHERE tag = 'Wilders' ORDER BY DATE( created_at )
Probleem 7: Naive Bayes Classifier Oorspronkelijk waren wij van plan ook een Naive Bayes classifier te gebruiken om machine-leren toe te passen op onze data. Allereerst gebruikten wij Weka, maar al snel werd dit vervangen door de NLTK module in Python, zodat we deze classifier binnen onze bestaande Python scripts konden gebruiken. Helaas bleek zelfs een dataset van 2500 tweets uit onze gouden corpus niet genoeg om deze classifier voldoende te trainen, en nam de berekening hiervan teveel tijd in beslag om nog toe te passen op alle 9,5 miljoen tweets in de database.
Sentimental Analysis on Tweets www.Twolitiek.nl
17
H4
| Resultaten Wij hebben Tweets geanalyseerd van drie grote debatten om onze kwaliteit te
testen. Op 23 Mei was er een RTL premierdebat. In dit debat gingen Jan-Peter Balkenende, Mark Rutte, Job Cohen en Geert Wilders met elkaar in debat over verschillende onderwerpen. In de avond was dit debat wereldwijd het meest getwitterde onderwerp. Volgens de kranten en peilingen was de winnaar van dit debat Mark Rutte (34%), Job Cohen werd tweede (23%) en Geert Wilders en Balkenende deelden de laatste plaats(18%). Wij zijn deze datum nagegaan met ons systeem en daar kwam uit dat er over Cohen het meest positief getwittert was. Er waren 3354 positieve Tweets over Cohen, over Rutte waren er 2807 positief. Wilders stond derde met 2270 positieve Tweets en over Balkenende werd het minst positief getwittert (1238 positieve tweets). Op 26 Mei was er een RTL Economisch lijsttrekkersdebat. Ook hier werd Rutte eerste, zowel volgens de kijkers als door experts, Halsema werd tweede en Roemer werd derde. Onze resultaten toonden aan dat Roemer de meeste positieve Tweets had (2822), Rutte stond tweede met 2223 positieve Tweets en Halsema werd derde met 1663 positieve Tweets. (Zie figuur 1.1) Ten slotte was er op 8 Juni het verkiezingsdebat op Nederland 1, dit was de dag voor de verkiezingen. Bij dit debat was volgens het opiniepaneel van EenVandaag Wilders de winnaar (21%). Cohen werd tweede(1), Halsema werd derde(18,7%) en Rutte werd vierde(17%). Toen wij de Tweets van deze datum binnenhaalden kwam daar iets anders uit. Rutte werd volgens Twitter eerste met 2640 positieve Tweets. Wilders had er 2492, Halsema 2090 en Cohen 2077. De resultaten van Twitter komen niet exact overeen met de uitslagen van de media, dit kan verschillende oorzaken hebben. Uit onze resultaten kan er gesteld worden dat er (in het algemeen) over linkse politici meer positief getwittert wordt dan over rechtse politici. Dit zou kunnen komen
Sentimental Analysis on Tweets www.Twolitiek.nl
18
doordat er meer linkse stemmers/liefhebbers op Twitter zitten. Roemer werd volgens het aantal positieve Tweets gemakkelijk eerste, dit zou kunnen komen doordat Roemer vaak grappige opmerkingen plaatst in debatten, wat veel mensen amusant vinden en dat dan vervolgens op Twitter plaatsen. Volgens de analyse van het laatste debat was Rutte eerste, maar volgens het opiniepaneel was hij vierde. Zo zien we dat dit meer met de verkiezingsuitslag overeen kwam (behalve de hoge uitslag voor Halsema, Groenlinks heeft kennelijk veel steun op Twitter).
Op de website hebben wij onderstaande grafieken op de voorpagina gezet, omdat dit een goede weergave geeft van de werking van het systeem. De bovenste van de twee laat het totaal aantal Tweets over politieke partijen in de maand december zien. GroenLinks heeft hier een enorme uitschieter, iets na 15 December. Dit is op 17 December geweest, omdat Femke Halsema toen besloot om uit de kamer te gaan. Hier hebben veel mensen over getwittert zoals te zien is. De grafiek hieronder laat op dat moment wel een kleine stijging van het positieve sentiment zien, maar niet één die boven de gemiddelde amplitude uitkomt. Dit komt waarschijnlijk doordat toen zij vertrok, niet iedereen daar positief over was. Veel GroenLinks stemmers vonden het uiteraard ook betreurenswaardig toen zij vertok, en dat wordt als negatief beoordeeld door ons systeem. In de onderste grafiek is ook te zien dat aan het eind van het jaar het positieve sentiment bij elke partij stijgt. Dit komt doordat veel leden via Twitter namens hun partij iedereen een gelukkig nieuwjaar wenst, wat dus het positieve sentiment laat stijgen. Dit laat zien dat ons systeem werkt en dat het sentiment in Tweets beoordeeld kan worden door een automatisch systeem.
Sentimental Analysis on Tweets www.Twolitiek.nl
19
In bijlage 4 zijn al onze resultaten van de classifiers uitgewerkt in matrices. Hieruit kan worden opgemaakt dat onze percentages het gemiddelde doel (70%) hebben gehaald. Alles is berekend in verhouding tot de gouden corpus en eerdere resultaten van alle classifiers. Dus in de positieve en negatieve beoordeling worden door de classifier geen neutrale Tweets meegenomen. Een van de classifiers (classifier 5.1, zie bijlage 4) scoorde het hoogst en werkte het beste, deze gebruiken wij om alle Tweets te analyseren en te scoren op sentiment. Deze classifier zorgt ervoor dat ons systeem binnen een halve minuut 1000 Tweets kan analyseren en verwerken naar de website.
Sentimental Analysis on Tweets www.Twolitiek.nl
20
De objectieve en subjectieve bepaling kwam uit op een correctheid van 76% (1903 van de 2500 goed beoordeeld). En van de subjectieve resultaten, dus positief en negatieve bepaling, kwam er een score uit van 78% (434 van de 552 goed beoordeeld). In totaal is er 71% goed beoordeeld. 1783 van de 2500 Tweets van de handmatige beoordeling worden perfect beoordeeld door de classifier. Uiteindelijk berekenen wij met onze gouden corpus 43,9 % als negatief sentiment, waar de classifier 44,9 % beoordeeld van het aantal subjectieve Tweets en dit geldt natuurlijk vice versa voor positief. Dus er is maar 1% afwijking tussen gouden corpus en classifier. Ondanks dat wij erg streng zijn geweest in het beoordelen van sentiment is dit een hoge score.
Het uiteindelijke resultaat is te zien op de website www.Twolitiek.nl. De website geeft de gebruiker een politieke partij of politici te kiezen en daar een bepaalde grafiek bij te krijgen. De gebruiker heeft een keuze tussen verschillende soorten grafieken. De grafieken geven aan wat het sentiment is bij die betreffende politicus of partij. Dit wordt uitgedrukt in positief en negatief. Daarnaast kan men ook politicus en partijen met elkaar vergelijken en daarbij een grafiek krijgen. Op de website wordt een module weergegeven met de meest recente politieke Tweets, en zodra men een keuze heeft gemaakt voor een politicus of partij komen in de modulen Tweets over diegene te voorschijn. De gebruiker kan er ook voor kiezen om het resultaat te delen, dit is mogelijk met e-mail, Facebook, Twitter en LinkedIn.
Sentimental Analysis on Tweets www.Twolitiek.nl
21
H5 | Discussie Onze resultaten laten zien dat ons automatische systeem het sentiment in Tweets tot 71% accuraat kan beoordelen. Hoewel het merendeel van de Tweets dus goed beoordeeld zal worden, blijft er nog veel ruimte voor speling in het uiteindelijke sentiment. Tijdens de evaluatie kwamen wij erachter dat de classifiers het meeste moeite hebben om objectieve Tweets neutraal te beoordelen, veelal werden deze alsnog als subjectief gezien, en wat direct resulteert in een foutieve beoordeling. Dit wordt veroorzaakt doordat in objectieve berichten vaak toch sentimentvolle woorden staan, bijvoorbeeld in nieuwsberichten. Om hier goed inzicht in te krijgen werkten wij veel met de subjectief-objectief Error Rate vanuit de richting van de classifiers (zie percentages in Bijlage 4: Matrices). Dit is op twee manieren te verklaren. Ten eerste zijn wij wellicht zo af en toe te streng geweest in de gouden corpus, en is het mogelijk dat sommige berichten toch een vorm van sentiment bevatten. Ten tweede blijft het enorm lastig om een algoritme te ontwikkelen dat objectieve Tweets goed weet te onderscheiden van subjectieve Tweets. Een subjectief bericht is relatief gemakkelijk te classificeren in negatief of positief, door de sentimentvolle woorden te tellen, maar objectiviteitsbeoordeling vereist dat de lezer het zinsverband en de intentie van de gebruiker kan interpreteren. Hetzelfde geldt voor de beoordeling van sarcasme en ironie. In beide gevallen komt een algoritme vooralsnog niet in de buurt van de menselijke interpretatie. Gelukkig zullen over het algemeen de overwegend juiste interpretaties in onze resultaten waarschijnlijk de doorslag in het sentiment geven, versterkt door foute beoordelingen die elkaar opheffen, zoals tweemaal positief als negatief classificeren en tweemaal andersom. Dit blijkt ook uit de minieme afwijking van 1% in de sentimentbeoordeling van het systeem ten opzichte van een handmatige controle. Daarom beschouwen wij onze resultaten als betrouwbaar.
Sentimental Analysis on Tweets www.Twolitiek.nl
22
H6
| Conclusie Het doel in dit project was om, binnen een bepaalde periode, het sentiment te
kunnen bepalen over politici en partijen van de sociale netwerksite Twitter, door middel van een automatisch systeem. Allereerst hebben wij uitgebreid onderzoek gedaan door gelijkwaardige projecten te analyseren. Uiteindelijk hebben wij Tweets verzameld, deze geanalyseerd en zo woordenlijsten gecreëerd die vervolgens in een database terecht kwamen, en door classifiers gebruikt werden voor de sentimentbeoordeling van de berichten. Om Tweets te verwerken tot een accurate sentimentbeoordeling hebben wij meerdere classifiers getest en vergeleken. Zo kwamen wij tot een classifier die zoveel mogelijk subjectieve resultaten combineert met een zeer lage error rate. Deze classifier heeft ervoor gezorgd dat 71% van de Tweets goed wordt beoordeeld door het systeem. Na de beoordeling door deze classifier werden de resultaten verwerkt in de database, en vervolgens afgeleverd en grafisch weergegeven op de website. Het uiteindelijke resultaat is te zien op www.Twolitiek.nl. Op deze website kan de gebruiker een partij en/of politicus kiezen om daarvan het sentiment in te zien en eventueel te vergelijken. De classifiers zijn geëvalueerd doormiddel van matrices die afgestemd zijn op onze gouden corpus, dit is ons meetinstrument geweest. De objectieve en subjectieve bepaling kwam uit op een correctheid van 76%. De positieve/negatieve bepaling kwam uit op een correctheid van 78%. Het uiteindelijk berekende sentiment week maar 1% af van de handmatige beoordeling in de gouden corpus. De resultaten hebben wij gekoppeld aan verschillende belangrijke debatten en politieke gebeurtenissen en zodoende kunnen vergelijken met de media. Op deze data wordt er namelijk meer getweet over de politiek en dat is duidelijk te zien in de grafieken die worden afgebeeld op de website. Op meerdere punten in de grafieken komt ook het sentiment goed overeen met de werkelijkheid, zoals op 1 januari, wanneer men over het algemeen positief ingesteld is. Hieruit concluderen wij dat ons systeem een accuraat beeld visualiseert van het sentiment dat heerst over de politiek op Twitter.
Sentimental Analysis on Tweets www.Twolitiek.nl
23
Referenties Dhr. Maarten Marx, Aitor en Valentin Jijkoun hebben ons een steuntje in de rug en bepaalde tips gegeven. Dhr. Jijkoun heeft ons een exclusieve woordenlijst toegestuurd, Aitor heeft ons geholpen met NLTK module en Dhr. Marx was onze begeleider die een aantal tips heeft gegeven. Dit project is mede mogelijk gemaakt door deze personen.
Wij hebben veel van onze lijsten van Wikipedia, een uitgebreide encyclopedie op het internet. http://www.wikipedia.org http://www.compumine.com/web/public/newsletter/20071/precision-recall
Sentimental Analysis on Tweets www.Twolitiek.nl
24
Bijlagen Bijlage 1: Pseudocode
Maak array van positieve woorden ( positiefarray ) Maak array van negatieve woorden ( negatiefarray )
Maak array van positieve tweets ( positievetweetarray ) Maak array van negatieve tweets ( negatievetweetarray ) Maak array van neutrale tweets ( neutraletweetarray )
Voor elke tweet Maak tweets lowercase hak in losse woorden stop woorden in tweetarray ( array per tweet) vergelijk elk woord uit tweetarray met elk woord uit positiefarray for elk woord uit tweetarray matcht woord uit positief array if niet/geen voor matchende woord negatiefcounter + 1 else positiefcounter + 1 vergelijk elk woord uit tweetarray met elk woord uit negatiefarray for elk woord uit tweetarray matcht woord uit negatief array if niet/geen voor matchende woord positiefcounter+ 1 else negatiefcounter + 1 sentiment = positiefcounter - negatiefcounter if positiefcounter == 0 and negatiefcounter == 0 add tweet to neutral array if sentiment > 0
Sentimental Analysis on Tweets www.Twolitiek.nl
25
add tweet to positievetweetarray if sentiment < 0 add tweet to negatievetweetarray if sentiment == 0 add tweet to resttweetarray
for elke tweet in positievetweetarray insert tweetID + positief in SQL tabel for elke tweet in negatievetweetarray insert tweetID + negatief in SQL tabel for elke tweet in neutraletweetarray insert tweetID + neutraal in SQL tabel
Sentimental Analysis on Tweets www.Twolitiek.nl
26
Bijlage 2: e-mail naar Hebreeuwse studenten over een soortgelijk onderzoek On Wed, Jan 12, 2011 at 5:06 PM, Nikki Winands
wrote: Dear sir, We are five students of the University of Amsterdam, studying Computer Science. This month we are working on a project where we attempt to analyze sentiment on Twitter. So far we are making a lot of progress, but we are struggling to create an algorithm for Sarcasm Identification. We read your article: A Great Catchy Name: Semi-Supervised Recognition of Sarcastic Sentences in Online Product Reviews. Our question to you is, could you possibly share some more information about the Sarcasm identifier or (a part) of the code you used.
We would be very grateful, With kind regards,
Nikki Winands Walraaf Borkent Tim van Bremen Armand de Waard Martijn van Tongeren
Hi Nikki, thanks for your interest in our work. Unfortunately we cannot provide the code right now for two main reasons - 1) it is IP protected by the university. 2) Unfortunately, Dmitry, one of the researchers and developers has passed away. We are working on preparing a version that could be released but of course there are all the bureaucratic issues due the reasons above. I'll happy to assist in advice as long as time allows (it is a time of deadlines now so things are a bit hectic). Btw, if you are working with Maarten de Rijke or Halil Sima'an please send my regards.
Sentimental Analysis on Tweets www.Twolitiek.nl
27
Oren Bijlage 3: Selfassesment Sentiment analysis on Twitter Leden Walraaf Borkent Tim van Bremen Martijn van Tongeren Armand de Waard Nikki Winands Onderdelen 1 2 3 4 5 Eind A
B
Ideeen,suggestie Leiderschap,groeporganisatie Teamwork actieve participatie Documentatie
Walraaf
Tim
C
Martijn
D
Armand
E
Schaal 0 tot 2 2 tot 4 4 tot 6 6 tot 8 8 tot 10
Nikki
A B C D E A B C D E A B C D E A B C D E A B C
Subtotaal 8,18 8,25 8,31 8,0825 8,24 7,835 7,9 7,7 7,535 7,69 7,89 7,025 7,965 7,475 8,075 7,765 7,85 7,625 7,505 7,74 7,705 7,525 7,79
Sentimental Analysis on Tweets www.Twolitiek.nl
Zeer slecht Slecht Matig Goed Zeer goed
Totaal
8,2125
7,732
7,686
7,697
28
D E
Naam Walraaf Tim Martijn Armand Nikki
966,4
932,3
Onderdelen Ideeen,suggestie, 1 actieveparticipatie Leiderschap, 2 groeporganisatie 3 Teamwork 4 Programmeren 5 Verslaggeving
B
C
D
E
7,558
Aantal punten wk1 Aantal punten wk2 Aantal punten wk3 Aantal punten wk4 Gemiddeld aantal punten 194,7 201,1 203,2 214 203,25 196,8 187,3 192 197,1 193,3 190,9 183 193,3 201,4 192,15 191,8 183,5 195,1 199,3 192,425 192,2 177,4 192,7 193,5 188,95
Totaal
Week 1 A
7,27 7,5
Walraaf
Tim
Martijn
Armand
Nikki
976,3
1005,3
970,075
Schaal
A B C D E A B C D E A B C D E A B C D E A B
1 7,8 7 8,5 8 8 9 8 8 8 8 7,5 6 8 7 7,5 7 7,5 7,5 7 7 7,6 8
0 tot 2
Zeer slecht
2 tot 4 4 tot 6 6 tot 8 8 tot 10
Slecht Matig Goed Zeer goed
2
3 8,4 7,5 9 8 9 7 8 8 8 7,5 8,2 6 8 7,5 8 7,5 7 7 7 7,5 7 7,5
4 8,3 7,5 8 8,5 8 8 7,5 8,5 7,8 8 8,4 7 7 7 8 7,8 7,5 8 8 8 8 7
5 8,4 8 8 8,3 8 7,5 7,5 8,5 8 8 8,5 7 8,5 8 8 8,5 8 9 7,5 9 7 7
Sentimental Analysis on Tweets www.Twolitiek.nl
6 6 7 6,5 7 8 6,5 8 7 8,5 7 7 9 7,8 9 7,5 6,5 8 8 8,5 9 9
Subtotaal 7,78 7,2 8,1 7,86 8 7,9 7,5 8,2 7,76 8 7,92 6,6 8,1 7,46 8,1 7,66 7,3 7,9 7,5 8 7,72 7,7
Totaal
totaal aantal punten
7,788
194,7
7,872
196,8
7,636
190,9
7,672
191,8
29
C D E
7,5 7 6,5
Onderdelen Ideeen,suggestie, 1 actieveparticipatie Leiderschap, 2 groeporganisatie 3 Teamwork 4 Programmeren 5 Verslaggeving
Week 2 A
B
C
D
E
Walraaf
Tim
Martijn
Armand
Nikki
7,5 7 7,5
9 7,6 7
7,5 7 7
9 9 9
8,1 7,52 7,4
7,688
192,2
Schaal
A B C D E A B C D E A B C D E A B C D E A B C D E
1 7,8 9 9 8 8,5 8,3 8 7,5 8 7 7 7 7 7,3 8 7,5 8 7 7 7 7,3 7 6,8 6 7
0 tot 2
Zeer slecht
2 tot 4 4 tot 6 6 tot 8 8 tot 10
Slecht Matig Goed Zeer goed
2
3 8 9 8,5 8,3 9 7 8 7 7 7 8 7 7 7 6,5 7 8 6,5 7 6,5 6,5 7 6,5 6,8 6,5
4 8 8 8 8 7 7,5 8 8 7,7 7,8 8,2 7,5 8 7 8 8 8 7,5 7,5 8 7 7 7,5 6 7
8,5 9 8 8 8,5 8 8,5 9 8 8,5 6,5 6 6 6 6 8 9 9 7 9 6,5 6 6 6 6,5
Sentimental Analysis on Tweets www.Twolitiek.nl
5 7,5 7,5 6,7 6,5 6,8 6 7,5 6 6 6 8 8 9 8 9 6,5 7 5,5 6 6 9 9 9,5 8 9
Subtotaal 7,96 8,5 8,04 7,76 7,96 7,36 8 7,5 7,34 7,26 7,54 7,1 7,4 7,06 7,5 7,4 8 7,1 6,9 7,3 7,26 7,2 7,26 6,56 7,2
Totaal
Totaal aantal punten
8,044
201,1
7,492
187,3
7,32
183
7,34
183,5
7,096
177,4
30
Onderdelen Ideeen,suggestie, 1 actieveparticipatie Leiderschap, 2 groeporganisatie 3 Teamwork 4 Programmeren 5 Verslaggeving
Week 3 A
B
C
Walraaf
Tim
Martijn
D
Armand
E
Nikki
Schaal
A B C D E A B C D E A B C D E A B C D E A B C D E
1 8,5 8,5 9 8,5 8 8,5 8,5 8 8 9 8,1 6,5 8 7 8 8,1 8 8 8 8 8 7,5 8,5 7 8
0 tot 2
Zeer slecht
2 tot 4 4 tot 6 6 tot 8 8 tot 10
Slecht Matig Goed Zeer goed
2
3 8,5 8,5 9 8,5 9 7 8 7 7 7,5 8 6,5 8 8,7 8 7,3 8 7,5 7,5 7,8 7,3 7,5 7 7 7,5
4 8,5 8,5 8,5 8 8,5 8,5 8,5 8 7 7 8 8,5 7,5 9 8,7 9 8,5 8 8,5 8 8 8,5 7 9 8 9
5 8,7 9 8,5 9 8,5 8,5 8,5 8,5 9 6 6 6 6 6 9 8,5 9 8,5 9 6 6 6 6 6
Sentimental Analysis on Tweets www.Twolitiek.nl
8 8 8 8 8 7 7 6 6 6 8,8 8 9 8,5 9,5 6,5 7 6 6,4 6 9,4 9 9,5 9 9
Subtotaal 8,44 8,5 8,6 8,25 8,5 7,9 8 7,3 7,3 7,9 7,88 6,9 8 7,78 8,1 7,88 7,9 7,8 7,68 7,76 7,84 7,4 8 7,4 7,9
Totaal
Totaal aantal punten
8,458
203,2
7,68
192
7,732
193,3
7,804
195,1
7,708
192,7
31
Onderdelen Ideeen,suggestie, 1 actieveparticipatie Leiderschap, 2 groeporganisatie 3 Teamwork 4 Programmeren 5 Verslaggeving
Week 4 A
B
C
Schaal
1 Walraaf
Tim
Martijn
D
Armand
E
Nikki
A B C D E A B C D E A B C D E A B C D E A B C D E
8 8,5 8 8 8 8 8,5 8,5 7,8 8 8,3 7,5 8,5 7,5 8,5 8,5 8,5 8 8 7,5 8 7,5 8 7,5 7,5
0 tot 2
Zeer slecht
2 tot 4 4 tot 6 6 tot 8 8 tot 10
Slecht Matig Goed Zeer goed
2
3 9 9 9 9 9 7 7,5 7,5 7 7 7,8 7 7,8 7 8 7,6 7,5 7,5 7,7 8 7 7,5 7 7 7
4 8,2 8,5 8 8,3 8 9,5 8 8 8,4 8 8 8 9 8 9 8,5 8,5 8 8 8 8,5 8 8,5 8 8
9 9 9 9 9 9 9 9 9 8 8 6,5 7,5 6,5 8 9 9 9 9 9 7 7 6 6,5 6
Sentimental Analysis on Tweets www.Twolitiek.nl
5 8,5 9 8,5 8 8,5 7,4 7,5 6 6,5 7 9 8,5 9 9 9,5 7 7,5 6 7 7 9,5 9 9,5 9 9
Subtotaal 8,54 8,8 8,5 8,46 8,5 8,18 8,1 7,8 7,74 7,6 8,22 7,5 8,36 7,6 8,6 8,12 8,2 7,7 7,94 7,9 8 7,8 7,8 7,6 7,5
Totaal
Totaal aantal punten
8,56
214
7,884
197,1
8,056
201,4
7,972
199,3
7,74
193,5
32
Bijlage 4: Matrices
hand neg 1.1
pos 191 109
neg pos
13 272
hand neg
pos 32 58
neg pos
9 151
pos 239 57
neg pos
1.4
pos 144 111
neg pos
hand neg 3.1
pos 233 123
neg pos Totaal
hand neg 3.2
pos 100 55
neg pos Totaal
hand neg 3.3
neg
pos 259
hand neg
pos 208 85
Error Rate
12 263
Totaal
17,1%
hand neg
pos 38 51
Error Rate
11 148
Totaal
0,25
hand neg
Error Rate
39
59 206 35,2%
4,2 neg pos 26,6%
Error Rate
Totaal
Error Rate
34 145
pos 170 145
neg pos
4,1 neg pos 23,1%
39 269 0,2
hand neg
Error Rate
31 279
Error Rate
Totaal
2.4 31,9%
pos 262 91
neg pos
Error Rate
Totaal
25 154 25,1%
hand neg 2.3
47 193
Error Rate
Totaal
13,8% hand neg
pos 96 59
neg pos
Error Rate
Totaal
26 284 0,24
hand neg 2.2
21 252
Error Rate
Totaal
26,8% hand neg
pos 222 134
neg pos
Error Rate
Totaal
1.3
2.1 20,85%
Totaal
1.2
hand neg
Error Rate
4,3 neg
Sentimental Analysis on Tweets www.Twolitiek.nl
pos 208
Error Rate
11
33
94
pos
269
Totaal
20,1%
hand neg 3.4
pos 170 145
neg pos
65 200
pos 215 82
5,3 neg pos
obj 585 169
sub obj
hand sub
obj 250 504
sub obj
hand sub
obj 569 185
sub obj
hand sub
Totaal
34,9%
obj 495 894
hand sub
Error Rate
2.1
obj 334 420
sub obj
28,8%
hand sub
obj 661 93
sub obj
29,2%
hand sub sub obj Totaal
Sentimental Analysis on Tweets www.Twolitiek.nl
Error Rate
637 49,1% 1109
Totaal
2.4
Error Rate
300 47,3% 1446
Totaal
Error Rate
0,5 69,8%
hand sub
2.3
Error Rate
666 1080
Totaal
Error Rate
259 34,4% 852 46,1%
obj 666 88
sub obj
Error Rate
557 49,5% 1189 29,7%
Totaal
sub obj
Totaal
172 40,8% 2.2 1574 0,27
Totaal
1.4
34 197
Error Rate
612 51,1% 1134 31,2%
Totaal
1.3
118 135
4,4 neg pos
Error Rate
21,4%
hand sub
1.2
pos
36 219
Totaal
1.1
16,5%
hand neg
36,2%
hand neg
264
Totaal
Error Rate
Totaal
82
pos
obj 580 174
Error Rate
1010 63,5% 736 47,4%
34
hand sub 3.1
obj 666 88
sub obj
666 1080
Totaal
obj 334 420
sub obj
3.3
obj 661 93
sub obj
obj 580 174
sub obj
5,3 sub obj
obj 552 202
Error Rate
173 41,1% 1573 27,2%
hand sub 4.3
obj 565 189
sub obj
Error Rate
505 47,2% 1241
Totaal
27,8%
hand sub
Error Rate
4.4
47,4%
hand sub
248 506
sub obj
Error Rate
1010 63,5% 736
Totaal
obj
Totaal
29,2%
hand sub 3.4
4.2
637 49,1% 1109
Totaal
532 48,4% 1214 28,7%
hand sub
Error Rate
28,8%
hand sub
Error Rate
Totaal
300 47,3% 1446
Totaal
obj 568 186
4,1 sub obj
0,5 69,8%
hand sub 3.2
hand sub
Error Rate
sub obj
obj 484 270
Error Rate
890 64,8% 856
Totaal
46,4%
Error Rate
397 41,8% 1349 0,76
Sentimental Analysis on Tweets www.Twolitiek.nl
35
Bijlage 5: Logboeken Maandag 03-01-2011 Vandaag zijn we voor het eerst bij elkaar gekomen na de vakantie. Voor ons gesprek met meneer Marx namen we eerst de doelen van het project door en bedachten we hoe we het project willen gaan realiseren. We hebben onze wiki gelanceerd en daar onze Bio‟s opgezet. Morgen moeten we presenteren, dus bereidden samen een powerpoint presentatie voor in google docs. Voor het gouden corpus moeten we 2500 tweets handmatig analyseren, we hebben een script geschreven om deze tweets te vergaren en vervolgens een begin gemaakt met het analyseren.
Dinsdag 04-01-2011 We begonnen de dag met het verbeteren van de wiki. Het doel van ons project hebben we duidelijker online gezet, zodat anderen ook kunnen zien waar we mee bezig zijn en wat onze doelen zijn. We zijn verder gegaan met het analyseren van tweets en analyseerden andere websites die op twitter sentiment beoordelen. Dit doen we om te begrijpen op welke manier de andere analyse-sites tweets beoordelen. Bij Walraaf thuis staat nu een testserver waar we de datadump van Justin in hebben geïmporteerd.
Woensdag 05-01-2011 Alle 2500 tweets zijn handmatig geanalyseerd. We zijn begonnen met het schrijven van de pseudocode van ons systeem, dit is handig zodat we straks de echte code makkelijker kunnen ontwikkelen. Samen brainstormden we alvast om een pakkende domeinnaam voor onze website te verzinnen. De grootste kanshebbers zijn twittimental en twolitiek. Ook hebben we vandaag Python en een MySQLdb module op de testserver geïnstalleerd en een begin gemaakt van de python programmacode.
Sentimental Analysis on Tweets www.Twolitiek.nl
36
Donderdag 06-01-2011: Eerst analyseerden we het voorbeeldverslag dat op blackboard stond. Op basis daarvan hebben we het skelet van ons eigen verslag alvast gemaakt en zijn we aan onze inleiding begonnen. We zijn verder gegaan met het python script om de tweets te beoordelen, en we importeerden de gouden corpus in de sql-database. Daarnaast hebben we de presentatie voor morgen voorbereid.
Vrijdag 07-01-2011: Vandaag gaven we eerst onze presentatie en daarna zijn we weer aan de slag gegaan met de basis van het verslag en formuleerden we onze vraagstelling. Het script voor tweetbeoordeling is nu bijna afgerond, en er is een start gemaakt in pseudocode voor de verwerking van de beoordeling in de database.
Zaterdag 08-01-2011: Armand is de hele dag in het datacenter geweest om zijn server operationeel te krijgen en de bestanden van de testserver over te zetten.
Maandag 10-01-2011: Deze week zijn we begonnen door verder te werken aan de programmacode en pseudocode. We werkten de wiki verder bij en zochten informatie over het Naive Bayes classifier-model. Daarna hebben we verschillende wetenschappelijke artikelen gelezen die over sarcasme gaan. De inleiding voor het eindverslag is bijna afgeschreven en de eerste versie van de vraagstelling is ook klaar.
Dinsdag 11-01-2011: Na ons gesprek met meneer Marx hebben we onze Wiki, onze planning en ons logboek bijgewerkt. Na een aantal aanwijzingen van meneer Marx en overleg in ons groepje hebben we de vraagstelling verbeterd.
Sentimental Analysis on Tweets www.Twolitiek.nl
37
Vandaag schreven we verder een nieuwe pseudocode voor een script dat voor de uiteindelijke verwerking van data naar een dagelijkse score gebruikt zal worden. Om deze scores straks te kunnen verwerken pasten we de database alvast aan met extra tabellen.
Woensdag 12-01-2011: We zijn de dag begonnen met een duidelijke dagplanning. Daarna gingen we verder met de pythoncode en werkten we het MoSCoW principe beter uit. De definitieve domeinnaam is gekozen, het wordt www.twolitiek.nl. De wiki-pagina hebben we helemaal opgeschoond, er is nu meer structuur in aangebracht zodat het geheel overzichtelijker is.
Donderdag 13-01-2011: Vandaag hebben we besproken hoe we de layout van de website willen hebben. We zijn gaan werken aan de PHP code die de resultaten moet gaan weergeven op de website. In het verslag begonnen we aan de probleemdocumentatie. Daarnaast is ook de positieve en negatieve woordenlijst gecontroleerd en door ons gecorrigeerd, hier zaten een aantal foutjes in (leestekens werden bijvoorbeeld vervormd naar vreemde letters).
Vrijdag 14-01-2011: Eerst hebben we de resterende onderdelen van de presentatie voorbereid en meteen daarna gepresenteerd. Gezamelijk hebben we een planning voor week 3 bedacht en zijn we begonnen Weka te bestuderen. We zijn ook verder gegaan met de PHP code die de weergave van de resultaten gaat realiseren.
Maandag 17-01-2011: We hebben ons extra gefocust op de kern van ons project: de classifiers. De php code werd ook weer uitgebreid voor de website. Tenslotte zijn we verder gegaan aan het eindverslag en hebben gezamelijk alle code nog eens doorgenomen.
Dinsdag 18-01-2011:
Sentimental Analysis on Tweets www.Twolitiek.nl
38
De dag begon met een gesprek met mr. Marx en Aitor. Op hun aanraden zijn we nog beter gaan kijken naar de betrouwbaarheid van onze classifier. We hebben een nieuwe woordenlijst toegevoegd uit een positief en negatief woordenboek. Het eindverslag vordert aardig, en in plaats van Weka zijn we voor machineleer gaan kijken naar NLTK, een python module.
Woensdag 19-01-2011: Vandaag hebben we de woordenlijst van Valentin Jijkoen en Katja Hofmann ontvangen. Hier staan ongeveer 6500 woorden in die sentiment beschrijven. Deze hebben we verwerkt en we zijn verder gegaan met de classifiers. De website is weer een beetje verbeterd en begint nu echt vorm te krijgen. De NLTK naive bayes classifier kan nu toegepast worden op tweets uit onze database. Ook hebben we grote politieke debatten opgezocht en gekeken wie de winnaar was volgens de media.
Donderdag 20-01-2011: De een-na-laatste presentatiedag, waarbij alle groepjes hun vorderingen lieten zien. We zijn daarna verder gegaan met de classifiers en de PHP code. Het stuk van de politieke debatten is verwerkt in het eindverslag.
Vrijdag 21-01-2011: Vandaag hebben we veel tijd besteed aan het maken van confusion matrixes en het uitrekenen van resultaten. Een aantal extra regels werden bedacht op basis van de resultaten om een nog hogere accuratie te behalen. Ook hebben we het skelet van het eindverslag voorbereid.
Maandag 24-01-2011: We zijn vandaag begonnen met een gesprek met meneer Marx. Bij elke politici op de website staat nu een tabel met personalia. Daarnaast zijn we druk bezig geweest in het weekend en maandag om de hele database te laten scoren door de classifier en de resultaten te verwerken.
Dinsdag 25-01-2011:
Sentimental Analysis on Tweets www.Twolitiek.nl
39
Zowel de website als het eindverslag kregen vandaag veel aandacht. Bij politieke partijen is nu informatie over de partij aanwezig en er kan nu aangegeven worden welke types grafieken er weergegeven worden. Artikelen zijn verzameld om alles over onze classifiers en matrices wetenschappelijk onderbouwd te kunnen schrijven.
Woensdag 26-01-2011: De uiteindelijke resultaten van onze classifiers met matrices zijn berekend. Dit is volledig uitgelegd en uitgewerkt. Debatten en andere opmerkelijke politieke gebeurtenissen in de media zijn vergeleken met grafieken en beschreven. De website werd grafisch verbeterd en de grafieken zijn nu volledig interactief en kunnen diverse partijen en politici met elkaar vergelijken.
Donderdag 27-01-2011: Het eindverslag is volledig afgemaakt, gecorrigeerd, afbeeldingen werden toegevoegd en alle documenten en bijlagen geïnterpoleerd. De website is gelanceerd en alle laatste verbeteringen doorgevoerd.
Sentimental Analysis on Tweets www.Twolitiek.nl
40
Bijlage 6: Zelfreflectie
Omdat wij bij dit project veel hebben samengewerkt en dit voor meerdere van ons een nieuwe manier van werken is, hebben we besloten om ook een reflectieverslag toe te voegen, die onze kijk op het (samen)werk weergeeft. Wij hebben op een goede en prettige manier kunnen samenwerken. Na een half jaar college volgen en opdrachten te maken, was dit een aangename manier om deze periode af te sluiten. Met de zelfstandige manier van werken was er veel ruimte voor eigen inbreng en konden wij onze ideeën realiseren. Als er enkele problemen waren, konden wij terecht bij onze begeleider mr. Marx. Een nadeel van dit project was de tijdslimiet. Wij hebben in de loop der tijd meerdere ideeën gekregen om ons project en website verder uit te breiden. Helaas is hier niet genoeg tijd voor geweest. Wellicht dat wij enige aanpassingen zullen maken in onze eigen tijd om alsnog de ideeën uit te kunnen werken. De samenwerking van onze groep verliep goed. Dagelijks zijn wij bij elkaar gekomen om te werken aan het project (van 9 tot 5). Dit vond plaats in een gereserveerde werkruimte op het Science Park. Wij konden op deze manier snel met elkaar overleggen en elkaar corrigeren waar nodig was. De inzet per persoon was zeer hoog, taken waren goed verdeeld en iedereen kon daarmee overweg. Het gemiddelde aantal uur wat per week is besteed aan het project is ruim boven de voorgeschreven 200 uur. Dit is met name ook een motief om elkaar een hoge beoordeling te geven in het Self Assessment. Desalniettemin waren deze dagen zo nu en dan frustrerend met name door concentratieproblemen en deadlinestress. In de toekomst zijn er nog vele projecten, en wij zullen dan uiteraard weer samenwerken. Ondanks alles, zijn wij ontzettend trots op het eindresultaat en hopen dat er in de toekomst veel gebruik wordt gemaakt van www.Twolitiek.nl
Sentimental Analysis on Tweets www.Twolitiek.nl
41
Bijlage 7: Programmatuur
De zip-file bevat de volgende bestanden:
Folder Scripts: delete.py
// Schoont de resultaten database van duplicaten
insert_results.py
// Verwerkt de scores naar tags en dag-resultaten
matrices_handsub.py
// Maakt matrices voor subjectief/objectief (percentages vanuit corpus gezien)
matrices_posneg.py
// Maakt matrices voor positief/negatief (+percentages)
matrices_sub.py
// Maakt matrices voor subjectief/objectief (percentages vanuit classifier gezien)
score_sentiment.py
// Beoordeeld de tweets in de database en slaat de score op
Folder Site: (bevat alle bestanden voor de website, enkele uitgelicht) index.php
// De hoofdpagina
Politici.php
// Pagina om resultaten te zien over politici
Partijen.php
// Pagina om resultaten te zien over partijen
OverOns.php
// Geeft wat informatie over de groep en het project
Data.php
// Pagina die de beoordeling laat zien van tweets
image.php
// Script om de lijngrafieken interactief weer te geven
Folder Woordenlijsten: twitter-rater.csv
// Woordenlijst van twitter-rater
total control.csv
// Onze eigen woordenlijst
hofmannJijcoun.csv
// Woordenlijst van Hofmann en Jijcoun
Sentimental Analysis on Tweets www.Twolitiek.nl
42