Bag-of-Words
Inzicht in het BoW-model
Het bag of words (BoW) model stelt documenten voor als vectoren waarbij elke dimensie overeenkomt met een uniek woord. Elke dimensie kan ofwel de aanwezigheid van een woord binnen het document weergeven (1 indien aanwezig, 0 indien afwezig) of de frequentie (aantal keren dat het woord voorkomt). BoW-modellen kunnen dus zowel binair als frequentie-gebaseerd zijn.
Hier volgt een voorbeeld van hoe dezelfde zin (document) door elk type wordt weergegeven:
Een binair model stelt dit document voor als de vector [1, 1, 1], terwijl het frequentie-gebaseerde model het weergeeft als [2, 1, 2], waarbij rekening wordt gehouden met de woordfrequentie.
BoW-implementatie
Het implementeren van het BoW-model is een eenvoudig proces, vooral met behulp van de sklearn (scikit-learn) bibliotheek en de CountVectorizer klasse.
Hier volgt een implementatie van het binaire bag of words-model:
12345678910111213from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] # Create a binary Bag of Words model vectorizer = CountVectorizer(binary=True) # Generate a BoW matrix bow_matrix = vectorizer.fit_transform(corpus) # Convert a sparse matrix into a dense array print(bow_matrix.toarray())
Elke rij in de matrix komt overeen met een document en elke kolom met een token (woord). Om dit visueel weer te geven, hebben we deze sparse matrix omgezet in een dense 2D-array met behulp van de .toarray()-methode.
Een sparse matrix is een matrix waarin de meeste elementen nul zijn. Deze wordt gebruikt om efficiënt gegevens met veel nulwaarden weer te geven en te verwerken, waarbij geheugen en rekenkracht worden bespaard door alleen de niet-nul elementen op te slaan.
Om een frequentiegebaseerd bag-of-words-model te creëren, hoeft enkel de parameter binary=True verwijderd te worden, aangezien de standaardwaarde hiervoor False is:
1234567891011from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] # Create a frequency-based Bag of Words model vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) print(bow_matrix.toarray())
De matrix omzetten naar een DataFrame
Het kan erg handig zijn om de resulterende bag-of-words-matrix om te zetten naar een pandas DataFrame. Daarnaast biedt de CountVectorizer-instantie de methode get_feature_names_out(), waarmee een array van unieke woorden (feature names) die in het model zijn gebruikt, wordt opgehaald. Deze feature names kunnen vervolgens als kolommen van de DataFrame worden gebruikt:
12345678910111213from sklearn.feature_extraction.text import CountVectorizer import pandas as pd corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) # Convert a sparse matrix to a DataFrame bow_df = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out()) print(bow_df)
Met deze representatie is het nu eenvoudig mogelijk om niet alleen de vector voor een specifiek document te benaderen, maar ook de vector van een specifiek woord:
12345678910111213from sklearn.feature_extraction.text import CountVectorizer import pandas as pd corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) bow_df = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out()) # Print the vector for 'global' as a NumPy array print(f"Vector for the word 'global': {bow_df['global'].values}")
Aangezien elk uniek woord overeenkomt met een kolom, is het opvragen van een woordvector eenvoudigweg het opvragen van een kolom in de DataFrame door het woord te specificeren (bijvoorbeeld 'global'). We gebruiken ook het values attribuut om een array te verkrijgen in plaats van een Series als resultaat.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Can you explain the difference between binary and frequency-based BoW models in more detail?
How does the CountVectorizer handle punctuation and capitalization?
Can you show how to access the vector for a different word in the DataFrame?
Awesome!
Completion rate improved to 3.45
Bag-of-Words
Veeg om het menu te tonen
Inzicht in het BoW-model
Het bag of words (BoW) model stelt documenten voor als vectoren waarbij elke dimensie overeenkomt met een uniek woord. Elke dimensie kan ofwel de aanwezigheid van een woord binnen het document weergeven (1 indien aanwezig, 0 indien afwezig) of de frequentie (aantal keren dat het woord voorkomt). BoW-modellen kunnen dus zowel binair als frequentie-gebaseerd zijn.
Hier volgt een voorbeeld van hoe dezelfde zin (document) door elk type wordt weergegeven:
Een binair model stelt dit document voor als de vector [1, 1, 1], terwijl het frequentie-gebaseerde model het weergeeft als [2, 1, 2], waarbij rekening wordt gehouden met de woordfrequentie.
BoW-implementatie
Het implementeren van het BoW-model is een eenvoudig proces, vooral met behulp van de sklearn (scikit-learn) bibliotheek en de CountVectorizer klasse.
Hier volgt een implementatie van het binaire bag of words-model:
12345678910111213from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] # Create a binary Bag of Words model vectorizer = CountVectorizer(binary=True) # Generate a BoW matrix bow_matrix = vectorizer.fit_transform(corpus) # Convert a sparse matrix into a dense array print(bow_matrix.toarray())
Elke rij in de matrix komt overeen met een document en elke kolom met een token (woord). Om dit visueel weer te geven, hebben we deze sparse matrix omgezet in een dense 2D-array met behulp van de .toarray()-methode.
Een sparse matrix is een matrix waarin de meeste elementen nul zijn. Deze wordt gebruikt om efficiënt gegevens met veel nulwaarden weer te geven en te verwerken, waarbij geheugen en rekenkracht worden bespaard door alleen de niet-nul elementen op te slaan.
Om een frequentiegebaseerd bag-of-words-model te creëren, hoeft enkel de parameter binary=True verwijderd te worden, aangezien de standaardwaarde hiervoor False is:
1234567891011from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] # Create a frequency-based Bag of Words model vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) print(bow_matrix.toarray())
De matrix omzetten naar een DataFrame
Het kan erg handig zijn om de resulterende bag-of-words-matrix om te zetten naar een pandas DataFrame. Daarnaast biedt de CountVectorizer-instantie de methode get_feature_names_out(), waarmee een array van unieke woorden (feature names) die in het model zijn gebruikt, wordt opgehaald. Deze feature names kunnen vervolgens als kolommen van de DataFrame worden gebruikt:
12345678910111213from sklearn.feature_extraction.text import CountVectorizer import pandas as pd corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) # Convert a sparse matrix to a DataFrame bow_df = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out()) print(bow_df)
Met deze representatie is het nu eenvoudig mogelijk om niet alleen de vector voor een specifiek document te benaderen, maar ook de vector van een specifiek woord:
12345678910111213from sklearn.feature_extraction.text import CountVectorizer import pandas as pd corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) bow_df = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out()) # Print the vector for 'global' as a NumPy array print(f"Vector for the word 'global': {bow_df['global'].values}")
Aangezien elk uniek woord overeenkomt met een kolom, is het opvragen van een woordvector eenvoudigweg het opvragen van een kolom in de DataFrame door het woord te specificeren (bijvoorbeeld 'global'). We gebruiken ook het values attribuut om een array te verkrijgen in plaats van een Series als resultaat.
Bedankt voor je feedback!