Bag of Words
Stryg for at vise menuen
Forståelse af BoW-modellen
Bag of words (BoW) modellen repræsenterer dokumenter som vektorer, hvor hver dimension svarer til et unikt ord. Hver dimension kan enten repræsentere tilstedeværelsen af et ord i dokumentet (1 hvis til stede, 0 hvis fraværende) eller dets frekvens (ordtælling). Derfor kan BoW-modeller være enten binære eller frekvensbaserede.
Her ses, hvordan den samme sætning (dokument) repræsenteres af hver type:
En binær model repræsenterer dette dokument som vektoren [1, 1, 1], mens en frekvensbaseret model repræsenterer det som [2, 1, 2], hvor ordets frekvens tages i betragtning.
BoW-implementering
Implementering af BoW-modellen er en ligetil proces, især med hjælp fra sklearn (scikit-learn)-biblioteket og dets CountVectorizer-klasse.
Her er en implementering af binær 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())
from sklearn.feature_extraction.text import CountVectorizer
Denne linje importerer CountVectorizer-klassen 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 linjer definerer en liste ved navn corpus, som indeholder tre streng-elementer. Hver streng er et
tekstdokument.
vectorizer = CountVectorizer(binary=True)
Denne linje opretter en instans af CountVectorizer-klassen. Parameteren binary=True
angiver, at modellen skal bruge binære tællinger.
bow_matrix = vectorizer.fit_transform(corpus)
Metoden tilpasser først modellen til dataene, lærer korpussens ordforråd og transformerer derefter tekst- dokumenterne til en sparsom matrix af token-tællinger (bag of words-matrix).
print(bow_matrix.toarray())
Denne linje konverterer den sparse matrix bow_matrix til et tæt array (numpy.ndarray)
ved hjælp af .toarray()-metoden og udskriver det.
Hver række i matricen svarer til et dokument, og hver kolonne til et token (ord). For at kunne repræsentere dette visuelt, konverterede vi denne sparse matrix til et tæt 2D-array ved hjælp af .toarray()-metoden.
En sparse matrix er en matrix, hvor de fleste elementer er nul. Den bruges til effektivt at repræsentere og behandle data med et stort antal nulværdier, hvilket sparer hukommelse og beregningsressourcer ved kun at gemme de ikke-nul elementer.
For at oprette en frekvensbaseret bag of words-model skal vi blot fjerne parameteren binary=True, da standardværdien 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 af matricen til en DataFrame
Det kan være meget praktisk at konvertere den resulterende bag of words-matrix til en pandas DataFrame. Desuden tilbyder CountVectorizer-instansen metoden get_feature_names_out(), som henter et array af unikke ord (feature names), der bruges i modellen. Disse feature names kan derefter bruges 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 repræsentation kan vi nu nemt få adgang til ikke kun vektoren for et bestemt dokument, men også 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}")
Da hvert unikt ord svarer til en kolonne, er det lige så enkelt at få adgang til en ordvektor som at tilgå en kolonne i DataFrame ved at angive ordet (for eksempel, 'global'). Vi bruger også attributten values for at få et array i stedet for en Series som resultat.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Bag of Words
Forståelse af BoW-modellen
Bag of words (BoW) modellen repræsenterer dokumenter som vektorer, hvor hver dimension svarer til et unikt ord. Hver dimension kan enten repræsentere tilstedeværelsen af et ord i dokumentet (1 hvis til stede, 0 hvis fraværende) eller dets frekvens (ordtælling). Derfor kan BoW-modeller være enten binære eller frekvensbaserede.
Her ses, hvordan den samme sætning (dokument) repræsenteres af hver type:
En binær model repræsenterer dette dokument som vektoren [1, 1, 1], mens en frekvensbaseret model repræsenterer det som [2, 1, 2], hvor ordets frekvens tages i betragtning.
BoW-implementering
Implementering af BoW-modellen er en ligetil proces, især med hjælp fra sklearn (scikit-learn)-biblioteket og dets CountVectorizer-klasse.
Her er en implementering af binær 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())
from sklearn.feature_extraction.text import CountVectorizer
Denne linje importerer CountVectorizer-klassen 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 linjer definerer en liste ved navn corpus, som indeholder tre streng-elementer. Hver streng er et
tekstdokument.
vectorizer = CountVectorizer(binary=True)
Denne linje opretter en instans af CountVectorizer-klassen. Parameteren binary=True
angiver, at modellen skal bruge binære tællinger.
bow_matrix = vectorizer.fit_transform(corpus)
Metoden tilpasser først modellen til dataene, lærer korpussens ordforråd og transformerer derefter tekst- dokumenterne til en sparsom matrix af token-tællinger (bag of words-matrix).
print(bow_matrix.toarray())
Denne linje konverterer den sparse matrix bow_matrix til et tæt array (numpy.ndarray)
ved hjælp af .toarray()-metoden og udskriver det.
Hver række i matricen svarer til et dokument, og hver kolonne til et token (ord). For at kunne repræsentere dette visuelt, konverterede vi denne sparse matrix til et tæt 2D-array ved hjælp af .toarray()-metoden.
En sparse matrix er en matrix, hvor de fleste elementer er nul. Den bruges til effektivt at repræsentere og behandle data med et stort antal nulværdier, hvilket sparer hukommelse og beregningsressourcer ved kun at gemme de ikke-nul elementer.
For at oprette en frekvensbaseret bag of words-model skal vi blot fjerne parameteren binary=True, da standardværdien 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 af matricen til en DataFrame
Det kan være meget praktisk at konvertere den resulterende bag of words-matrix til en pandas DataFrame. Desuden tilbyder CountVectorizer-instansen metoden get_feature_names_out(), som henter et array af unikke ord (feature names), der bruges i modellen. Disse feature names kan derefter bruges 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 repræsentation kan vi nu nemt få adgang til ikke kun vektoren for et bestemt dokument, men også 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}")
Da hvert unikt ord svarer til en kolonne, er det lige så enkelt at få adgang til en ordvektor som at tilgå en kolonne i DataFrame ved at angive ordet (for eksempel, 'global'). Vi bruger også attributten values for at få et array i stedet for en Series som resultat.
Tak for dine kommentarer!