{count, plural, one {Cursus} other {Cursussen}}
Onderwerpen ontdekken is nuttig voor verschillende doelen, zoals het clusteren van documenten, het organiseren van online beschikbare content voor informatieopvraag en aanbevelingen. Meerdere contentproviders en nieuwsorganisaties gebruiken topicmodellen om lezers artikelen aan te bevelen. Op dezelfde manier gebruiken wervingsbureaus ze om functieomschrijvingen te extraheren en te koppelen aan de vaardigheden van kandidaten. Kijk bijvoorbeeld naar de rol van data scientist, die draait om het extraheren van ‘kennis’ uit grote hoeveelheden verzamelde data. Meestal is die data ongestructureerd. Je hebt krachtige tools en technieken nodig om grote hoeveelheden ongestructureerde data te analyseren en te begrijpen.
Topic modeling is een textminingtechniek die methoden biedt om samenvoorkomende trefwoorden te identificeren en zo grote verzamelingen tekstuele informatie samen te vatten. Het helpt verborgen onderwerpen in documenten te ontdekken, de documenten met deze onderwerpen te annoteren en een grote hoeveelheid ongestructureerde data te organiseren.
Topic Modeling
Topic modeling ontdekt automatisch de verborgen thema’s in gegeven documenten. Het is een onbewaakt tekstanalytisch algoritme dat wordt gebruikt om groepen woorden in het gegeven document te vinden. Deze groepen woorden representeren een onderwerp. Het is mogelijk dat één document aan meerdere thema’s is gekoppeld. Een groep woorden als 'patient', 'doctor', 'disease', 'cancer' en 'health' vertegenwoordigt bijvoorbeeld het onderwerp 'healthcare'. Topic modeling is iets heel anders dan regelgebaseerd tekstzoeken met reguliere expressies.

Vergelijking tussen tekstclassificatie en topic modeling
Tekstclassificatie is een bewaakt machinelearningprobleem, waarbij een tekstdocument of artikel wordt ingedeeld in een vooraf gedefinieerde set klassen. Topic modeling is het proces van het ontdekken van groepen samenvoorkomende woorden in tekstdocumenten. Deze groepen gerelateerde woorden vormen "topics". Het is een vorm van onbewaakt leren, dus de set mogelijke onderwerpen is onbekend. Topic modeling kan worden gebruikt om het probleem van tekstclassificatie op te lossen. Topic modeling identificeert de onderwerpen die in een document aanwezig zijn, terwijl tekstclassificatie de tekst in één klasse indeelt.

Latent Semantic Analysis
LSA (Latent Semantic Analysis), ook bekend als LSI (Latent Semantic Index), gebruikt het bag-of-words (BoW) model, wat resulteert in een term-documentmatrix (voorkomen van termen in een document). Rijen vertegenwoordigen termen en kolommen vertegenwoordigen documenten. LSA leert latente onderwerpen door een matrixdecompositie uit te voeren op de document-term-matrix met Singular Value Decomposition. LSA wordt doorgaans gebruikt als techniek voor dimensiereductie of ruisreductie.

Singular Value Decomposition (SVD)
SVD is een matrixfactorisatiemethode die een matrix weergeeft als het product van twee matrices. Het biedt uiteenlopende, nuttige toepassingen in signaalverwerking, psychologie, sociologie, klimaat- en atmosferische wetenschap, statistiek en astronomie.

- M is een m×m-matrix
- U is een m×n linkersinguliere matrix
- Σ is een n×n-diagonaalmatrix met niet-negatieve reële getallen.
- V is een m×n rechtersinguliere matrix
- V* is een n×m-matrix, de getransponeerde van V.
Identiteitsmatrix: Een vierkante matrix waarin alle elementen op de hoofddiagonaal enen zijn en alle andere elementen nullen.
Diagonale matrix: Een matrix waarin alle elementen buiten de hoofddiagonaal nul zijn.
Singuliere matrix: Een matrix is singulier als de determinant 0 is, ofwel een vierkante matrix die geen inverse heeft.
Het optimale aantal onderwerpen bepalen
Wat is de beste manier om k (het aantal onderwerpen) te bepalen bij topic modeling? Het identificeren van het optimale aantal onderwerpen in de gegeven corpus is een uitdagende taak. We kunnen de volgende opties gebruiken om het optimale aantal onderwerpen te bepalen:
- Eén manier is om elk onderwerp als een cluster te beschouwen en de effectiviteit van een cluster te meten met de Silhouette-coëfficiënt.
- De maat voor topiccoherentie is een realistische maat om het aantal onderwerpen te identificeren.
Topiccoherentie is een veelgebruikte metriek om topicmodellen te evalueren. Het gebruikt latente-variabe-modellen. Elk gegenereerd onderwerp heeft een lijst met woorden. Bij de maat voor topiccoherentie bereken je het gemiddelde of de mediaan van paarsgewijze woordovereenkomstscores van de woorden binnen een onderwerp. Een hoge topiccoherentiescore duidt op een goed topicmodel.
LSA implementeren met Gensim
Importeer de vereiste library
#import modules
import os.path
from gensim import corpora
from gensim.models import LsiModel
from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
from gensim.models.coherencemodel import CoherenceModel
import matplotlib.pyplot as plt
Data laden
Laten we eerst een functie maken om articles.csv te laden. Je kunt de data hier downloaden.
def load_data(path,file_name):
"""
Input : path and file_name
Purpose: loading text file
Output : list of paragraphs/documents and
title(initial 100 words considred as title of document)
"""
documents_list = []
titles=[]
with open( os.path.join(path, file_name) ,"r") as fin:
for line in fin.readlines():
text = line.strip()
documents_list.append(text)
print("Total Number of Documents:",len(documents_list))
titles.append( text[0:min(len(text),100)] )
return documents_list,titles
Data preprocessen
Na de laadfunctie moet je de tekst preprocessen. De volgende stappen worden genomen om de tekst te preprocessen:
- Tokenize de tekstartikelen
- Verwijder stopwoorden
- Voer stemming uit op de tekst
def preprocess_data(doc_set):
"""
Input : docuemnt list
Purpose: preprocess text (tokenize, removing stopwords, and stemming)
Output : preprocessed text
"""
# initialize regex tokenizer
tokenizer = RegexpTokenizer(r'\w+')
# create English stop words list
en_stop = set(stopwords.words('english'))
# Create p_stemmer of class PorterStemmer
p_stemmer = PorterStemmer()
# list for tokenized documents in loop
texts = []
# loop through document list
for i in doc_set:
# clean and tokenize document string
raw = i.lower()
tokens = tokenizer.tokenize(raw)
# remove stop words from tokens
stopped_tokens = [i for i in tokens if not i in en_stop]
# stem tokens
stemmed_tokens = [p_stemmer.stem(i) for i in stopped_tokens]
# add tokens to list
texts.append(stemmed_tokens)
return texts
Corpus voorbereiden
De volgende stap is het voorbereiden van de corpus. Hierbij maak je een document-term-matrix en een woordenboek van termen.
def prepare_corpus(doc_clean):
"""
Input : clean document
Purpose: create term dictionary of our courpus and Converting list of documents (corpus) into Document Term Matrix
Output : term dictionary and Document Term Matrix
"""
# Creating the term dictionary of our courpus, where every unique term is assigned an index. dictionary = corpora.Dictionary(doc_clean)
dictionary = corpora.Dictionary(doc_clean)
# Converting list of documents (corpus) into Document Term Matrix using dictionary prepared above.
doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean]
# generate LDA model
return dictionary,doc_term_matrix
Maak een LSA-model met Gensim
Na het creëren van de corpus kun je een model genereren met LSA.
def create_gensim_lsa_model(doc_clean,number_of_topics,words):
"""
Input : clean document, number of topics and number of words associated with each topic
Purpose: create LSA model using gensim
Output : return LSA model
"""
dictionary,doc_term_matrix=prepare_corpus(doc_clean)
# generate LSA model
lsamodel = LsiModel(doc_term_matrix, num_topics=number_of_topics, id2word = dictionary) # train model
print(lsamodel.print_topics(num_topics=number_of_topics, num_words=words))
return lsamodel
Bepaal het aantal onderwerpen
Er is nog een extra stap nodig om de resultaten te optimaliseren door een optimaal aantal onderwerpen te bepalen. Hier genereer je coherentiescores om een optimaal aantal onderwerpen te bepalen.
def compute_coherence_values(dictionary, doc_term_matrix, doc_clean, stop, start=2, step=3):
"""
Input : dictionary : Gensim dictionary
corpus : Gensim corpus
texts : List of input texts
stop : Max num of topics
purpose : Compute c_v coherence for various number of topics
Output : model_list : List of LSA topic models
coherence_values : Coherence values corresponding to the LDA model with respective number of topics
"""
coherence_values = []
model_list = []
for num_topics in range(start, stop, step):
# generate LSA model
model = LsiModel(doc_term_matrix, num_topics=number_of_topics, id2word = dictionary) # train model
model_list.append(model)
coherencemodel = CoherenceModel(model=model, texts=doc_clean, dictionary=dictionary, coherence='c_v')
coherence_values.append(coherencemodel.get_coherence())
return model_list, coherence_values
Laten we de waarden van de coherentiescore plotten.
def plot_graph(doc_clean,start, stop, step):
dictionary,doc_term_matrix=prepare_corpus(doc_clean)
model_list, coherence_values = compute_coherence_values(dictionary, doc_term_matrix,doc_clean,
stop, start, step)
# Show graph
x = range(start, stop, step)
plt.plot(x, coherence_values)
plt.xlabel("Number of Topics")
plt.ylabel("Coherence score")
plt.legend(("coherence_values"), loc='best')
plt.show()
start,stop,step=2,12,1
plot_graph(clean_text,start,stop,step)

Je kunt deze grafiek eenvoudig evalueren. Op de X-as staat het aantal onderwerpen en op de Y-as de coherentiescore. Van de aantallen onderwerpen heeft 7 de hoogste coherentiescore, dus het optimale aantal onderwerpen is 7.
Voer alle bovenstaande functies uit
# LSA Model
number_of_topics=7
words=10
document_list,titles=load_data("","articles.txt")
clean_text=preprocess_data(document_list)
model=create_gensim_lsa_model(clean_text,number_of_topics,words)
Total Number of Documents: 4551
[(0, '0.361*"trump" + 0.272*"say" + 0.233*"said" + 0.166*"would" + 0.160*"clinton" + 0.140*"peopl" + 0.136*"one" + 0.126*"campaign" + 0.123*"year" + 0.110*"time"'), (1, '-0.389*"citi" + -0.370*"v" + -0.356*"h" + -0.355*"2016" + -0.354*"2017" + -0.164*"unit" + -0.159*"west" + -0.157*"manchest" + -0.116*"apr" + -0.112*"dec"'), (2, '0.612*"trump" + 0.264*"clinton" + -0.261*"eu" + -0.148*"say" + -0.137*"would" + 0.135*"donald" + -0.134*"leav" + -0.134*"uk" + 0.119*"republican" + -0.110*"cameron"'), (3, '-0.400*"min" + 0.261*"eu" + -0.183*"goal" + -0.152*"ball" + -0.132*"play" + 0.128*"said" + 0.128*"say" + -0.126*"leagu" + 0.122*"leav" + -0.122*"game"'), (4, '0.404*"bank" + -0.305*"eu" + -0.290*"min" + 0.189*"year" + -0.164*"leav" + -0.153*"cameron" + 0.143*"market" + 0.140*"rate" + -0.139*"vote" + -0.133*"say"'), (5, '0.310*"bank" + -0.307*"say" + -0.221*"peopl" + 0.203*"trump" + 0.166*"1" + 0.164*"min" + 0.163*"0" + 0.152*"eu" + 0.152*"market" + -0.138*"like"'), (6, '0.570*"say" + 0.237*"min" + -0.170*"vote" + 0.158*"govern" + -0.154*"poll" + 0.122*"tax" + 0.115*"statement" + 0.115*"bank" + 0.112*"budget" + -0.108*"one"')]
- Topic-1: "trump", "say", "said", "would", "clinton", "peopl", "one", "campaign","year","time" (Amerikaanse presidentsverkiezingen)
- Topic-2: "citi", "v", "h", "2016", "2017","unit", "west", "manchest","apr" ,"dec" (Engelse Premier League)
- Topic-3: "trump","clinton", "eu","say","would","donald","leav","uk" ,"republican" ,"cameron" (Amerikaanse presidentsverkiezingen, Brexit)
- Topic-4: "min","eu","goal","ball","play","said","say","leagu","leav","game" (Engelse Premier League)
- Topic-5: "bank","eu","min","year","leav","cameron","market","rate","vote","say" (Brexit en marktomstandigheden)
- Topic-6: "bank","say","peopl","trump","1" ,"min" ,"eu","market" ,"like" (Politieke situaties en marktomstandigheden)
- Topic-7: "say","min","vote","govern","poll","tax","statement","bank","budget","one" (Amerikaanse presidentsverkiezingen en financiële planning)
Hier zijn 7 onderwerpen ontdekt met Latent Semantic Analysis. Sommige zijn overlappende onderwerpen. Om meerdere betekenissen met hogere nauwkeurigheid vast te leggen, moeten we LDA (Latent Dirichlet Allocation) proberen. Dat laat ik als oefening aan jou over: probeer het met Gensim en deel je bevindingen.
Voor- en nadelen van LSA
Het LSA-algoritme is de eenvoudigste methode, gemakkelijk te begrijpen en te implementeren. Het levert ook betere resultaten op dan het vectorruimtemodel. Het is sneller dan andere beschikbare algoritmen, omdat het alleen de decompositie van de document-term-matrix omvat.
De dimensie van latente onderwerpen hangt af van de rang van de matrix, dus we kunnen die limiet niet overschrijden. De door LSA gedecomponeerde matrix is zeer dicht, waardoor het moeilijk is om afzonderlijke dimensies te indexeren. LSA kan meerdere betekenissen van woorden niet vastleggen. Het is niet eenvoudiger te implementeren dan LDA (Latent Dirichlet Allocation) en biedt lagere nauwkeurigheid dan LDA.
Use-cases van topic modeling
Eenvoudige toepassingen van deze techniek zijn documentclustering in tekstanalyse, aanbevelingssystemen en informatieopvraag. Meer gedetailleerde use-cases van topic modeling zijn:
- Samenvatten van cv’s: het kan recruiters helpen cv’s in één oogopslag te beoordelen. Zo kunnen ze de inspanning verminderen bij het filteren van stapels cv’s.
- Zoekmachineoptimalisatie: online artikelen, blogs en documenten kunnen eenvoudig worden getagd door onderwerpen en bijbehorende trefwoorden te identificeren, wat de zoekresultaten kan verbeteren.
- Optimalisatie van aanbevelingssystemen: aanbevelingssystemen fungeren als informatiefilter en adviseur op basis van het gebruikersprofiel en eerdere geschiedenis. Het kan helpen om niet-bezochte relevante content te ontdekken op basis van eerdere bezoeken.
- Verbeteren van klantenservice: relevante onderwerpen en bijbehorende trefwoorden in klantklachten en feedback ontdekken, bijvoorbeeld productspecificaties, servicespecificaties en informatie over afdeling en vestiging. Dergelijke informatie helpt een bedrijf om een klacht direct naar de juiste afdeling door te zetten.
- In de zorg kan topic modeling helpen om nuttige en waardevolle informatie te extraheren uit ongestructureerde medische rapporten. Deze informatie kan worden gebruikt voor patiëntbehandeling en medisch-wetenschappelijk onderzoek.
Conclusie
In deze tutorial heb je veel details over topic modeling behandeld. Je hebt geleerd wat topic modeling is, wat Latent Semantic Analysis is, hoe je bijbehorende modellen bouwt en hoe onderwerpen worden gegenereerd met LSA. Ook kwamen enkele basisconcepten aan bod, zoals Singular Value Decomposition en de topiccoherentiescore.
Hopelijk kun je nu topic modeling inzetten om je eigen datasets te analyseren. Bedankt voor het lezen!
Wil je meer leren over Python? Volg dan de DataCamp-cursus Case Studies in Statistical Thinking.
