hatsa schreef op dinsdag 19 april 2016 @ 08:01:
Er is hoe dan ook geen kant-en-klare oplossing. Pattern is eenvoudig te implementeren en kan phrases als "leuk boek" wel als positief classificeren, en is daarom een leuk tooltje. POS-tagging op tweets wil je waarschijnlijk ook niet proberen, het doet het beter op iets langere net grammaticaal correcte zinnen als krantenberichten en wikipediapagina's. Frog kan wat beter omgaan met slordige/korte taal, maar daar zit zover ik weet geen sentimentanalyse in.
Merk bij tweets vooral dat een enkel woord enorm zwaar weegt, uiteraard omdat tweets zo kort zijn. Als je naar de resultaten kijkt snap je dus wel waar de sentiment score op gebaseerd is, maar het komt vaak niet overeen met het gevoel dat je zelf hebt bij de tweet. Verder heb je best wat stappen nodig om de tekst een beetje op te schonen (verwijderen van links, series van tags, afkortingen, etc).
Verder is sentimentanalyse erg domeinspecifiek (iets dat in het ene domein een positieve uiting is, kan in een ander domein zomaar negatief zijn). Daarnaast zijn uitingen ook nog heel persoonsafhankelijk. Zeker met tweets, omdat die ook heel erg op contextinformatie hangen. Exact dezelfde tweet kan getweet worden door Geert Wilders of Marianne Thieme, maar het sentiment is totaal verschillend. Mensen kunnen interpreteren welke bedoeling erachter zit, dat het een steek onder water is, of gewoon sarcasme. En dan heb je ook nog uitingen waar wel sentiment in zit, maar nooit door woordenlijsten zal worden gevonden. "Dat mens moet terug naar de basisschool" is duidelijk negatief, maar er zit geen negatief woord in.
Qua domein: hiervoor zou je eigenlijk een corpus moeten hebben van het domein waar je in geinteresseerd bent, maar ik heb nog niet uitgevogeld hoe je zo'n corpus op kunt bouwen. Pattern gebruikt (Senti)WordNet, dus daar maar eens naar kijken.
Dat je nuances zoals ironie of sarcasme mist valt denk ik niet te voorkomen, maar als je maar genoeg tweets hebt is het de vraag of dat echt impact heeft. Het gaat dan meer om de grote lijnen. Wel is het lastig de 'impact' te schatten. Bijvoorbeeld 'mijn examen economie ging echt goed' vs 'De economie gaat weer de goede kant op'. De eerste tweet is persoonlijk en waarschijnlijk minder relevant dan de tweede, maar probeer dat maar eens te achterhalen.
Nog los van het feit dat je makkelijk in niet al teveel woorden veel sentimenten kunt uiten: "Mooie film, maar wel een verschrikkelijk traag begin. Ondanks dat [acteur x] enorm slecht heeft geacteerd, was het wel de moeite waard om doorheen te kijken". Welke range neem je dan? Hele tekst, zin, zinsdeel, woord?
Als je de hele tekst erin gooit, krijg je een score voor de hele tekst. Uiteraard zou je ook op zinnen kunnen scoren. Het liefste zou je natuurlijk op onderwerp scoren (film, acteur), maar dat lijkt me nogal lastig (zelfs met POS tagging). Bij deze tekst zou er waarschijnlijk een min of meer neutrale score uit komen; dat is misschien niet eens heel onterecht in dit geval.
Je eigen teksten labelen en daar een model op trainen zou iig wel al een beter resultaat moeten opleveren dan pattern, maar is wel meer werk.
Hier heb ik ook over nagedacht, maar wat zou dan een goede optie zijn. Zelf dacht ik aan:
- Filteren van rommel (tags, links, etc)
- Woorden in de tweet als features (na omzetten van vervoegingen / meervoud)
- Woordparen (of n-grams) maken als features (bv voor 'niet leuk')
- Neuraal netwerk trainen op basis van die features
Nadeel is dat je een enorme bak gelabelde data nodig hebt hiervoor, gezien het forse aantal features. Uiteraard zou je het aantal woord-features kunnen beperken door een selectielijst te maken, maar dat is dan wel weer een beperking van je model...