Ga naar hoofdinhoud

Latent Semantic Analysis met Python

In deze tutorial leer je hoe je verborgen onderwerpen in documenten ontdekt met Latent Semantic Analysis in Python.
Bijgewerkt 2 okt 2026  · 11 min lezen

Verken met AI

ChatGPTClaudePerplexity

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.

diagram

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.

diagram

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.

Latent Semantic Analysis

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.

factor
  • 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)
lijngrafiek

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.

Onderwerpen
Python
Data Science

Python-cursussen

{count, plural, one {Cursus} other {Cursussen}}

Introductie tot Python

{hours} uur
7.1M
Leer de basis van data-analyse met Python in 4 uur. Deze online cursus laat je kennismaken met de Python-interface en populaire pakketten.
Bekijk detailsRight Arrow
Start Cursus
Meer bekijkenRight Arrow
Gerelateerd

{count, plural, one {blog} other {blogs}}

AI vanaf nul leren in 2026: een complete gids van de experts

Ontdek alles wat je moet weten om in 2026 AI te leren, van tips om te beginnen tot handige resources en inzichten van industrie-experts.
Adel Nehme's photo

Adel Nehme

15 min

Meer BekijkenMeer Bekijken