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 tilstede, 0 hvis fraværende) eller dets frekvens (antall forekomster). 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:
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 ved bruk av sklearn (scikit-learn)-biblioteket og klassen CountVectorizer.
Her er en implementasjon av binær bag of words-modell:
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())
Hver rad i matrisen tilsvarer et dokument, og hver kolonne til et token (ord). For å kunne vise dette visuelt, konverterte vi denne spredte matrisen til et tett 2D-array ved å bruke .toarray()-metoden.
En spredt matrise er en matrise der de fleste elementene er null. Den brukes for å representere og behandle data med et høyt volum av nullverdier på en effektiv måte, ved å kun lagre de ikke-null elementene og dermed spare minne og beregningsressurser.
For å lage en frekvensbasert bag of words-modell, trenger vi bare å fjerne parameteren binary=True, siden standardverdien for den er False:
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())
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 liste med unike ord (funksjonsnavn) brukt i modellen. Disse funksjonsnavnene kan deretter brukes som kolonner i DataFrame:
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)
Med denne representasjonen kan vi nå enkelt få tilgang til både vektoren for et bestemt dokument og vektoren for et bestemt ord:
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}")
Siden hvert unike ord tilsvarer en kolonne, er det like enkelt å få tilgang til en ordvektor som å få tilgang til en kolonne i DataFrame ved å angi ordet (for eksempel, 'global'). Vi bruker også attributtet values for å hente en matrise i stedet for en Series som resultat.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
Awesome!
Completion rate improved to 3.45
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 tilstede, 0 hvis fraværende) eller dets frekvens (antall forekomster). 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:
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 ved bruk av sklearn (scikit-learn)-biblioteket og klassen CountVectorizer.
Her er en implementasjon av binær bag of words-modell:
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())
Hver rad i matrisen tilsvarer et dokument, og hver kolonne til et token (ord). For å kunne vise dette visuelt, konverterte vi denne spredte matrisen til et tett 2D-array ved å bruke .toarray()-metoden.
En spredt matrise er en matrise der de fleste elementene er null. Den brukes for å representere og behandle data med et høyt volum av nullverdier på en effektiv måte, ved å kun lagre de ikke-null elementene og dermed spare minne og beregningsressurser.
For å lage en frekvensbasert bag of words-modell, trenger vi bare å fjerne parameteren binary=True, siden standardverdien for den er False:
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())
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 liste med unike ord (funksjonsnavn) brukt i modellen. Disse funksjonsnavnene kan deretter brukes som kolonner i DataFrame:
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)
Med denne representasjonen kan vi nå enkelt få tilgang til både vektoren for et bestemt dokument og vektoren for et bestemt ord:
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}")
Siden hvert unike ord tilsvarer en kolonne, er det like enkelt å få tilgang til en ordvektor som å få tilgang til en kolonne i DataFrame ved å angi ordet (for eksempel, 'global'). Vi bruker også attributtet values for å hente en matrise i stedet for en Series som resultat.
Takk for tilbakemeldingene dine!