Sentimentanalyse (of opinion mining) is het op een geautomatiseerde manier toewijzen van een sentiment aan een tekst. Het wordt onder meer toegepast om positieve en negatieve berichten op sociale media betreffende een bepaald product, persoon of bedrijf te capteren.
In deze oefening zullen we een eigen algoritme toepassen om het sentiment van film reviews te bepalen. We maken daarvoor gebruik van twee lijsten: een lijst met woorden met positieve connotatie en een lijst met woorden met een negatieve connotatie.
De lijsten zijn bewaard in twee eenvoudige tekstbestanden: positive.txt en negative.txt. De woorden staan elk op een afzonderlijke lijn. De woorden zijn in kleine letters.
De bestanden zijn beschikbaar in het working directory van Dodona.
Als je de oefening lokaal wilt maken (in PyCharm of in een Jupyter Notebook), dan moet je de bestanden downloaden en bewaren in dezelfde map als je .py of .ipynb bestand.
De bestanden kan je hier downloaden:
polarity_words
Schrijf een functie polarity_words met één argument: een string ("positive" of "negative").
De de functie leest het bestand positive.txt of negative.txt in en retourneert een lijst met alle woorden uit het tekstbestand.
>>> polarity_words('positive') ['a+', 'abound', 'abounds', 'abundance', 'abundant', ..., 'youthful', 'zeal', 'zenith', 'zest', 'zippy'] >>> polarity_words('negative') ['2-faced', '2-faces', 'abnormal', ..., 'zaps', 'zealot', 'zealous', 'zealously', 'zombie']
sentiment
Schrijf een functie sentiment met één argument: een tekst (string).
De functie splitst de zin op in woorden. De woorden in de tekst zijn gescheiden door zogenaamde whitespace characters (spatie, tab (\t) of regeleinde (\n).
Vervolgens zet de functie de woorden in kleine letters en verwijdert alle leestekens vooraan en achteraan elk woord. Leestekens binnen in een woord (zoals koppelteken of apostrophe) mogen blijven staan. Je mag ervan uitgaan dat enkel deze leestekens voorkomen: ! , . : ; ( ) en ?
Vervolgens telt de functie hoeveel positieve en negatieve woorden voorkomen in deze tekst. Als eenzelfde woord meer dan één keer voorkomt, dan telt het elke keer opnieuw.
De functie retourneert een string: "positive" indien er meer positieve dan negatieve woorden voorkomen in de teskt, "negative" als er meer negatieve dan positieve woorden voorkomen, "neutral" als er even veel positieve als negatieve woorden voorkomen.
>>> sentiment('Rubbish!') 'negative' >>> sentiment("I haven't seen such a good movie in a long long time.") 'positive' >>> sentiment('Boring... but with a happy ending.') 'neutral' >>> sentiment('Not bad at all!') 'negative'
Bron: Minqing Hu and Bing Liu, “Mining and summarizing customer reviews.”, Proceedings of the ACM SIGKDD International Conference on Knowledge Discovery & Data Mining (KDD-2004), Seattle, Washington, USA, Aug 22-25, 2004.