Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Bag of Words | Grunnleggende Tekstmodeller
Introduksjon til NLP med Python

Bag of Words

Sveip for å vise menyen

Forståelse av BoW-modellen

Bag of words (BoW)-modellen representerer dokumenter som vektorer der hver dimensjon tilsvarer et unikt ord. Hver dimensjon kan enten representere tilstedeværelsen av et ord i dokumentet (1 hvis til stede, 0 hvis fraværende) eller dets frekvens (antall forekomster av ordet). Derfor kan BoW-modeller være enten binære eller frekvensbaserte.

Her er et eksempel på hvordan den samme setningen (dokumentet) representeres av hver type:

bilde

En binær modell representerer dette dokumentet som vektoren [1, 1, 1], mens en frekvensbasert modell representerer det som [2, 1, 2], hvor ordets frekvens tas med i betraktningen.

BoW-implementering

Implementering av BoW-modellen er en enkel prosess, spesielt med hjelp av sklearn (scikit-learn)-biblioteket og klassen CountVectorizer.

Her er en implementering av binær bag of words-modell:

12345678910111213
from 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())
Kodebeskrivelse
expand arrow
from sklearn.feature_extraction.text import CountVectorizer

Denne linjen importerer klassen CountVectorizer fra sklearn.

corpus = [
    'Global climate change poses significant risks to global ecosystems.',
    'Global warming and climate change demand urgent action.',
    'Sustainable environmental practices support environmental conservation.',
]

Disse linjene definerer en liste kalt corpus som inneholder tre streng-elementer. Hver streng er et tekstdokument.

vectorizer = CountVectorizer(binary=True)

Denne linjen oppretter en instans av klassen CountVectorizer. Parameteren binary=True spesifiserer at modellen skal bruke binære tellinger.

bow_matrix = vectorizer.fit_transform(corpus)

Metoden tilpasser først modellen til dataene, lærer vokabularet til korpuset, og transformerer deretter tekst- dokumentene til en sparsom matrise av token-tellinger (bag of words-matrise).

print(bow_matrix.toarray())

Denne linjen konverterer den sparse matrisen bow_matrix til et tettere array (numpy.ndarray) ved å bruke .toarray()-metoden og skriver det ut.

Hver rad i matrisen tilsvarer et dokument, og hver kolonne et token (ord). For å kunne representere dette visuelt, konverterte vi denne spredte matrisen til et tett 2D-array ved å bruke .toarray()-metoden.

Note
Les mer

En spredt matrise er en matrise der de fleste elementene er null. Den brukes til å effektivt representere og behandle data med et høyt antall nullverdier, og sparer minne og beregningsressurser ved kun å lagre de ikke-nulle elementene.

For å lage en frekvensbasert bag of words-modell, trenger vi bare å fjerne parameteren binary=True siden standardverdien for den er False:

1234567891011
from 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())

Konvertering av matrisen til en DataFrame

Det kan være svært praktisk å konvertere den resulterende bag of words-matrisen til en pandas DataFrame. I tillegg tilbyr CountVectorizer-instansen metoden get_feature_names_out(), som henter en matrise med unike ord (funksjonsnavn) brukt i modellen. Disse funksjonsnavnene kan deretter brukes som kolonner i DataFrame:

12345678910111213
from 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)

Med denne representasjonen kan vi nå enkelt få tilgang til ikke bare vektoren for et bestemt dokument, men også vektoren for et bestemt ord:

12345678910111213
from 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}")

Siden hvert unikt ord tilsvarer en kolonne, er det like enkelt å få tilgang til en ordvektor som å hente en kolonne i DataFrame ved å spesifisere ordet (for eksempel 'global'). Vi bruker også attributtet values for å få en matrise i stedet for en Series som resultat.

question-icon

Gitt en BoW-matrise, hva representerer de ulike komponentene i denne matrisen?

Rows:
Columns:

A particular element of the matrix:

Klikk eller dra`n`slipp elementer og fyll inn de tomme feltene

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 3

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Bag of Words

Forståelse av BoW-modellen

Bag of words (BoW)-modellen representerer dokumenter som vektorer der hver dimensjon tilsvarer et unikt ord. Hver dimensjon kan enten representere tilstedeværelsen av et ord i dokumentet (1 hvis til stede, 0 hvis fraværende) eller dets frekvens (antall forekomster av ordet). Derfor kan BoW-modeller være enten binære eller frekvensbaserte.

Her er et eksempel på hvordan den samme setningen (dokumentet) representeres av hver type:

bilde

En binær modell representerer dette dokumentet som vektoren [1, 1, 1], mens en frekvensbasert modell representerer det som [2, 1, 2], hvor ordets frekvens tas med i betraktningen.

BoW-implementering

Implementering av BoW-modellen er en enkel prosess, spesielt med hjelp av sklearn (scikit-learn)-biblioteket og klassen CountVectorizer.

Her er en implementering av binær bag of words-modell:

12345678910111213
from 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())
Kodebeskrivelse
expand arrow
from sklearn.feature_extraction.text import CountVectorizer

Denne linjen importerer klassen CountVectorizer fra sklearn.

corpus = [
    'Global climate change poses significant risks to global ecosystems.',
    'Global warming and climate change demand urgent action.',
    'Sustainable environmental practices support environmental conservation.',
]

Disse linjene definerer en liste kalt corpus som inneholder tre streng-elementer. Hver streng er et tekstdokument.

vectorizer = CountVectorizer(binary=True)

Denne linjen oppretter en instans av klassen CountVectorizer. Parameteren binary=True spesifiserer at modellen skal bruke binære tellinger.

bow_matrix = vectorizer.fit_transform(corpus)

Metoden tilpasser først modellen til dataene, lærer vokabularet til korpuset, og transformerer deretter tekst- dokumentene til en sparsom matrise av token-tellinger (bag of words-matrise).

print(bow_matrix.toarray())

Denne linjen konverterer den sparse matrisen bow_matrix til et tettere array (numpy.ndarray) ved å bruke .toarray()-metoden og skriver det ut.

Hver rad i matrisen tilsvarer et dokument, og hver kolonne et token (ord). For å kunne representere dette visuelt, konverterte vi denne spredte matrisen til et tett 2D-array ved å bruke .toarray()-metoden.

Note
Les mer

En spredt matrise er en matrise der de fleste elementene er null. Den brukes til å effektivt representere og behandle data med et høyt antall nullverdier, og sparer minne og beregningsressurser ved kun å lagre de ikke-nulle elementene.

For å lage en frekvensbasert bag of words-modell, trenger vi bare å fjerne parameteren binary=True siden standardverdien for den er False:

1234567891011
from 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())

Konvertering av matrisen til en DataFrame

Det kan være svært praktisk å konvertere den resulterende bag of words-matrisen til en pandas DataFrame. I tillegg tilbyr CountVectorizer-instansen metoden get_feature_names_out(), som henter en matrise med unike ord (funksjonsnavn) brukt i modellen. Disse funksjonsnavnene kan deretter brukes som kolonner i DataFrame:

12345678910111213
from 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)

Med denne representasjonen kan vi nå enkelt få tilgang til ikke bare vektoren for et bestemt dokument, men også vektoren for et bestemt ord:

12345678910111213
from 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}")

Siden hvert unikt ord tilsvarer en kolonne, er det like enkelt å få tilgang til en ordvektor som å hente en kolonne i DataFrame ved å spesifisere ordet (for eksempel 'global'). Vi bruker også attributtet values for å få en matrise i stedet for en Series som resultat.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 3
some-alt