<jupyter_start><jupyter_text>AI-MODEL VOOR SENTIMENTANALYSE      In deze notebook zal je bij gegeven teksten (de data) onderzoek doen naar sentimentwoorden m.b.v. kunstmatige intelligentie (KI of AI). Je zal immers een machine learning-model gebruiken. Dit model werd getraind met geannoteerde teksten en kan met grote nauwkeurigheid een tekst tokeniseren en van elk token de part-of-speech tag en het lemma bepalen. Je gebruikt een regelgebaseerd AI-systeem om het sentiment van de gegeven tekst te bepalen.  In de vorige notebook, 'Regelgebaseerde sentimentanalyse', maakte je kennis met de principes van een regelgebaseerde sentimentanalyse:  -  Je maakt gebruik van een (bestaand) **lexicon** of woordenboek met daarin woorden gekoppeld aan hun **polariteit** (positief, negatief of neutraal). -  Voor je sentimentwoorden uit een lexicon kunt matchen met de data moet je de data inlezen en **voorverwerken (preprocessing)**. -  Veelvoorkomende preprocessing stappen zijn **lowercasing**, **tokenisering**, **part-of-speech tagging** en  **lemmatisering**. In de vorige notebook waren nog niet alle stappen geautomatiseerd. Lemmatisering en part-of-speech tagging moesten manueel gebeuren.  In deze notebook zal je de uitvoer van de sentimentanalyse volledig automatiseren. Je zal m.a.w. de computer het werk laten doen: de computer zal de data voorverwerken met een machine learning-model (ML-model), en met een regelgebaseerd AI-systeem de tokens matchen met het gegeven lexicon en een eindbeslissing nemen over het sentiment van de gegeven tekst.   Modules, model en lexicon inladen  Voor je aan de slag gaat, voorzie je eerst de nodige tools:-  Je importeert de nodige modules (dit hoef je maar één keer te doen). Deze modules bevatten functies en methodes die jouw onderzoek zullen vergemakkelijken. Er zijn immers reeds zaken voorgeprogrammeerd, waardoor jij met vrij eenvoudige instructies kunt werken.-  Je laadt een machine learning-model in om straks te gebruiken.-  Je leest ook al een sentimentlexicon in. Voer daartoe de drie code-cellen hieronder uit. De code in deze cellen hoef je niet te begrijpen.<jupyter_code># modules importeren
import pickle                     # voor lexicon
from colorama import Fore, Back   # om in kleur te kunnen tonen
import spacy                      # voor machine learning-model voor voorverwerking
# machine learning-model inladen
nlp = spacy.load("nl_core_news_sm")    # nlp staat voor Natural Language Processing
# lexicon inlezen, bestand 'new_lexicondict.pickle' bevat sentimentlexicon 
with open("data/new_lexicondict.pickle", "rb") as file: 
    lexicon = pickle.load(file)<jupyter_output><empty_output><jupyter_text>Zo, je bent klaar voor stap 1: de data inlezen en bekijken.              1. De data inlezen      Voor deze opdracht zal je werken met dezelfde **klantenreview** als in de notebook 'Regelgebaseerde sentimentanalyse'.  Stap 1: voer de volgende code-cel uit om de review in te lezen en vervolgens te bekijken.<jupyter_code>review = "Nieuw concept in Gent, maar dat kan volgens mij toch beter. De meeste cornflakes waren gewoon de basic soorten. Ook wat duur voor de hoeveelheid die je krijgt, vooral met de toppings zijn ze zuinig. En als je ontbijt aanbiedt, geef de mensen dan toch ook wat meer keuze voor hun koffie."
print(review)<jupyter_output><empty_output><jupyter_text>Je bent klaar voor stap 2. In wat volgt laat je de computer al de voorverwerking op de review uitvoeren: lowercasing hadden we al geautomatiseerd in 'Regelgebaseerde sentimentanalyse'. Die code neem je over.  Je moet geen spaties toevoegen in de tekst, want het machine learning-model zorgt voor het tokeniseren. Ook het part-of-speech taggen en lemmatiseren worden nu geautomatiseerd m.b.v. het model.             2. Preprocessing       Lowercasing<jupyter_code># zet tekst van review om naar tekst in kleine letters
review_kleineletters = review.lower()<jupyter_output><empty_output><jupyter_text>Tokenisering, part-of-speech taggen en lemmatisering De review **tokeniseren** en aan elk token een **part-of-speech** en een **lemma** toekennen, gebeurt automatisch met behulp van een daarvoor getraind model met een accuraatheid van 93 %! Je voert daarvoor de review (in kleine letters) in in het ML-model `nlp`.<jupyter_code># review in kleine letters in model voeren
review_voorverwerkt = nlp(review_kleineletters)<jupyter_output><empty_output><jupyter_text>Van de review zijn nu de tokens bepaald en van elk token is het woord (of leesteken) zelf, de woordsoort (part-of-speech tag) en de woordenboekvorm (lemma) opgeslagen in een object waarnaar wordt verwezen door `review_voorverwerkt`.      Je kan nu de kenmerken van tokens opvragen: het woord/leesteken via de instructie `token.text`, de woordsoort via `token.pos_` en de woordenboekvorm via `token.lemma_`.  Van elk token de woordsoort en de woordenboekvorm tonen<jupyter_code># tokens
for token in review_voorverwerkt:
    print(token.text)
# part-of-speech tag van elk token
for token in review_voorverwerkt:
    print(token.text + ": " + token.pos_)
# lemma van elk token
for token in review_voorverwerkt:
    print(token.text + ": " + token.lemma_)<jupyter_output><empty_output><jupyter_text>Maak lijsten van de tokens, lemma's en part-of-speech tags. In 'Regelgebaseerde sentimentanalyse' waren de lijsten van de lemma's en part-of-speech tags manueel opgemaakt. Nu kan dit automatisch omdat alle nodige info verzameld is in het object waarnaar de variabele `review_voorverwerkt` verwijst.<jupyter_code># oplijsten
tokens = []
lemmas = []
postags = []
for token in review_voorverwerkt:
    tokens.append(token.text)      # voeg elk token toe aan lijst van tokens
    lemmas.append(token.lemma_)    # voeg elk lemma toe aan lijst van lemma's
    postags.append(token.pos_)     # voeg elke part-of-speech tag toe aan lijst van postags

# lijsten tonen
print("tokens:")
print(tokens)
print("lemma's:")
print(lemmas)
print("part-of-speech tags:")
print(postags)<jupyter_output><empty_output><jupyter_text>3. Sentiment lexicon matching      Nu de review *gepreprocessed* is, kan je het sentiment bepalen met behulp van het sentimentlexicon dat je ter beschikking hebt. Dit was reeds geautomatiseerd in 'Regelgebaseerde sentimentanalyse'. Je neemt de code van 'Regelgebaseerde sentimentanalyse' over.<jupyter_code># zoek matches met lexicon in review
lexiconmatches = []       # lege lijst, op te vullen met tokens van de lemma's gevonden in lexicon
polariteiten = []         # lege lijst, op te vullen met polariteiten van gevonden tokens 

# beschouw lemma's met overeenkomstige woordsoort en token
for lemma, postag, token in zip(lemmas, postags, tokens):
    if lemma in lexicon.keys() and postag in lexicon[lemma]["postag"]:  
            lexiconmatches.append(token)                      # overeenkomstig token toevoegen aan lijst lexiconmatches
            if postag == lexicon[lemma]["postag"][0]:
                polariteiten.append(lexicon[lemma]["polarity"][0])
            else:
                polariteiten.append(lexicon[lemma]["polarity"][1])
                # overeenkomstige polariteit toevoegen aan lijst polariteiten
    # lemma moet aanwezig zijn in lexicon
    # alleen wanneer het lemma en de POS-tag overeenkomen, is er een match (zie bv. 'fout' als ADJ en 'fout' als NOUN) 

# polariteit review
polariteit = sum(polariteiten)

# eindbeslissing voor deze review
if polariteit > 0:
    sentiment = "positief"
elif polariteit == 0:
    sentiment = "neutraal"
elif polariteit < 0:
    sentiment = "negatief"
print("De polariteit van de review is: " + str(polariteit))
print("Het sentiment van de review is " + sentiment + ".")<jupyter_output><empty_output><jupyter_text>4. Oefening: Sentiment lexicon matching op eigen review      Je kan dit ook doen voor een zelfgeschreven review en de output van het systeem vergelijken met je eigen annotatie.<jupyter_code># plaats zelfgeschreven review tussen aanhalingstekens, pas dus gegeven string aan
zelfgeschreven_review = "Hopelijk wordt dit een leuke notebook!"
# vul polariteit in tussen aanhalingstekens (positief, negatief, neutraal), pas dus ook hier gegeven string aan
label = "positief"

# volgende stappen: review tonen en nlp() erop toepassen
print(zelfgeschreven_review)
review = nlp(zelfgeschreven_review.lower())

# elk woord in review tonen met woordsoort en part-of-speech tag en opslaan in lijsten
tokens = []
lemmas = []
postags = []
for token in review:
    tokens.append(token.text)
    lemmas.append(token.lemma_)
    postags.append(token.pos_)

print("tokens:")
print(tokens)
print("lemma's:")
print(lemmas)
print("part-of-speech tags:")
print(postags)<jupyter_output><empty_output><jupyter_text>Nu de preprocessing klaar is, kan je opnieuw matches zoeken met het lexicon.<jupyter_code># zoek matches met lexicon in review
lexiconmatches = []       # lege lijst, op te vullen met tokens van de lemma's gevonden in lexicon
polariteiten = []         # lege lijst, op te vullen met polariteiten van gevonden tokens 

# beschouw lemma's met overeenkomstige woordsoort en token
for lemma, postag, token in zip(lemmas, postags, tokens):
    if lemma in lexicon.keys() and postag in lexicon[lemma]["postag"]:  
            lexiconmatches.append(token)                      # overeenkomstig token toevoegen aan lijst lexiconmatches
            if postag == lexicon[lemma]["postag"][0]:
                polariteiten.append(lexicon[lemma]["polarity"][0])
            else:
                polariteiten.append(lexicon[lemma]["polarity"][1])
                # overeenkomstige polariteit toevoegen aan lijst polariteiten
    # lemma moet aanwezig zijn in lexicon
    # alleen wanneer het lemma en de POS-tag overeenkomen, is er een match (zie bv. 'fout' als ADJ en 'fout' als NOUN) 

# polariteit review
polariteit = sum(polariteiten)

# eindbeslissing voor deze review
if polariteit > 0:
    sentiment = "positief"
elif polariteit == 0:
    sentiment = "neutraal"
elif polariteit < 0:
    sentiment = "negatief"
print("De polariteit van de review is: " + str(polariteit))
print("Het sentiment van de review is " + sentiment + ".")<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.07266094843734595, 'fraction_numerical': 0.002070393374741201, 'mean_word_length': 4.3473906167633105, 'pattern_counts': {'":': 2, '<': 39, '<?xml version=': 0, '>': 39, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '380804', 'license': 'CC0-1.0', 'n_tokens_mistral': 3393, 'n_tokens_neox': 3292, 'n_words': 1179, 'path': 'AIOpSchool/Chatbot/0300_SentimentanalyseModel.ipynb', 'repo_name': 'dwengovzw/PythonNotebooks', 'size': '10143'}