Bag of Words
Sveip for å vise menyen
Bag of words (BoW)-modellen representerer dokumenter som vektorer der hver dimensjon tilsvarer et unikt ord. Hver dimensjon kan enten representere tilstedeværelse 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 vises 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 til effektiv representasjon og behandling av data med høy andel nullverdier, og sparer minne og beregningsressurser ved kun å lagre de ikke-nulle elementene.
For å lage en frekvensbasert bag of words-modell, er det bare å fjerne parameteren binary=True siden standardverdien for denne 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 ut et array 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 å spesifisere 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