Wat zegt u?! Tekstanalyse in Python

In de dagelijkse praktijk kletsen we heel wat af, maar voor computers is dat niet altijd te begrijpen. Het analyseren van tekst is een leuk vakgebied binnen Data Science. Er zijn diverse pakketten beschikbaar in Python, deze blog introduceert er een aantal. Voorbeeld toepassingen zijn teksten scannen, offertes vertalen, callcenter notities analyseren en social media analyses.

Tokenization

Okee, tekst analyseren, daar gaan we! Heb je inmiddels ook genoeg van ‘Hello World!‘ en ‘The quick brown fox jumps over the lazy dog.‘? Scrape wat reviews of nieuwsartikelen en stop dat in een variabele: txt.

Je traject begint al snel met data preparatie. Wil je alle woorden analyseren? Alleen woorden, of ook getallen? En wat te doen met leestekens? Er is keuze genoeg en met str.replace kom je een heel eind. Lastiger is het verwijderen van stopwoorden, denk aan de, het, een, te, met, etc. Dit proces noem je ‘tokenization’, het opknippen van tekst in woorden. Veel tutorials gebruiken Engelse versies, onderstaand package bevat ook een Nederlandse versie:

from nltk.corpus import stopwords
stop_words=set(stopwords.words("dutch"))
print(stop_words)

In de volgende alinea’s worden deze stopwoorden uitgesloten van verdere analyse. Er is uiteraard nog veel meer mogelijk in preparatie, zoals ‘stemming‘ en ‘lemmatization‘. Dit heb ik voor nu buiten beschouwing gelaten. In het kort komt het er op neer dat vergelijkbare woorden samen genomen worden. Denk aan car, cars, cars’, car’s wat allemaal ‘car’ wordt, of playing, plays, played wat allemaal ‘play’ wordt. Beide opties zijn beschikbaar in het nltk package, NLTK staat voor ‘Natural Language Toolkit‘.

CountVectorizer

De meest basale vorm van analyseren (of features aanmaken voor een model) is woorden tellen. Dit wordt veel toegepast in de bekende ‘wordclouds’. Globaal ziet dat er als volgt uit:

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
vectorizer.fit(txt)
print(vectorizer.vocabulary_)

Eerst maak je de vectorizer aan, daarna pas je hem toe op je txt. Met vocabulary_ krijg je te zien welke set aan woorden is opgebouwd en hoe vaak elk woord voorkwam. Wil je een vocabulary opbouwen met specifieke woorden? Laat de .fit dan los op enkel de woorden die je wilt gebruiken. Vervolgens kun je dit loslaten op elke nieuwe tekst met ‘transform’ en elk woord als kolom toevoegen aan je dataset met als waarde de count.

txt_word_features = vectorizer.transform(txt)
vectorizer.get_feature_names()
feature_scores = pd.DataFrame(txt_word_features.todense(), columns=vectorizer.get_feature_names())

Uiteraard kun je veel settings maken, waaronder het uitsluiten van de eerder aangemaakte stopwoorden. Hieronder de uitgebreide versie:

vectorizer = CountVectorizer(stop_words=stop_words, analyzer='word', ngram_range=(1, 1), max_df=1.0, min_df=1, max_features=None)
  • stop_words kun je instellen op ‘english’ of onze eerder aangemaakte stop_words aanroepen.
  • N-grams gaat over het aantal woorden dat gecombineerd wordt. Soms is het analyseren van combi’s van meerdere woorden heel waardevol.
  • min_df geeft een percentage weer hoe vaak een woord voor moet komen in afzonderlijke documenten. Bijvoorbeeld: 0.66 geeft weer dat het woord in minimaal 66% van de documenten voor moet komen, voordat deze aan het vocubulary wordt toegevoegd.
  • max_df doet hetzelfde maar dan aan de bovenkant. Woorden die te vaak voorkomen in documenten worden uitgesloten. Dit is een goede aanvulling op de stopwoorden.

TfidfVectorizer

Een andere vorm van vectorizing is TfidfVectorizer. Deze methode geeft strafpunten als een woord te vaak voorkomt in documenten. De score in je kolom is dus geen count meer, maar een soort weging. Hoe vaker een woord voorkomt, hoe meer gewicht het krijgt. Komt het echter te vaak voor, wordt het gewicht verlaagd. Op deze manier geef je relatief meer waarde aan woorden die minder vaak voorkomen en daarmee juist heel voorspellend kunnen zijn. In het Engels heet dit ‘Term Frequency – Inverse Document Frequency’. Daar komen dus die letters vandaan: Tfidf 🙂

vectorizer = TfidfVectorizer(stop_words=stop_words, sublinear_tf=True, strip_accents='unicode', analyzer='word', token_pattern=r'\w{2,}', ngram_range=(1, 3), max_features=None, min_df=0.01)

De settings zijn nagenoeg hetzelfde. Hier heb ik alleen toegevoegd dat woorden uit minimaal 2 karakters dienen te bestaan met token_pattern=r’\w{2,}’.

Sentiment analyse

Soms is het handig om specifieke woorden te tellen of te scoren, zoals bovenstaande technieken doen. Soms wil je echter ook weten wat het sentiment is van een tekst. Dit is eigenlijk een afgeleide van bovenstaande, waarbij woorden een sentimentsscore mee krijgen. Onderstaand pakket weet dit (in beperkte mate) ook voor de Nederlandse taal uit te voeren.

from pattern.nl import sentiment
sentiment('Wat een geweldig boek, echt een aanrader!')

De uitkomst hiervan is: (0.6166666666666667, 0.6)

  • Het eerste cijfer is de polarity, lopend van -1 tot 1 -> de as van negatief tot positief.
  • Het tweede cijfer is de subjectivity, lopend van 0 tot 1.

Je kunt zelf een grens bepalen voor het neutrale gebied, bijvoorbeeld -0.2 tot +0.2. De subjectivity heb ik verder niet gebruikt.

Wrap up

Er is veel te leren rondom tekst analyse. In deze blog heb ik de basis principes laten zien van stopwoorden verwijderen, vectorization en sentiment analyse. Het is geen uitgebreid document of handleiding, maar een mooi vertrekpunt voor je eigen project!

Geef een reactie

Gelieve met een van deze methodes in te loggen om je reactie te plaatsen:

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit /  Bijwerken )

Google photo

Je reageert onder je Google account. Log uit /  Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log uit /  Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit /  Bijwerken )

Verbinden met %s