Påse med Ord
Förståelse av BoW-modellen
Bag of words (BoW)-modellen representerar dokument som vektorer där varje dimension motsvarar ett unikt ord. Varje dimension kan antingen representera förekomsten av ett ord i dokumentet (1 om det finns, 0 om det saknas) eller dess frekvens (antal förekomster). Därför kan BoW-modeller vara antingen binära eller frekvensbaserade.
Låt oss titta på hur samma mening (dokument) representeras av varje typ:
En binär modell representerar detta dokument som vektorn [1, 1, 1], medan en frekvensbaserad modell representerar det som [2, 1, 2], där ordens frekvens tas med i beräkningen.
BoW-implementering
Att implementera BoW-modellen är en enkel process, särskilt med hjälp av biblioteket sklearn (scikit-learn) och dess klass CountVectorizer.
Här är en implementering av den binära bag of words-modellen:
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())
Varje rad i matrisen motsvarar ett dokument, och varje kolumn motsvarar ett token (ord). För att kunna visualisera detta omvandlade vi denna glesa matris till en tät tvådimensionell array med hjälp av metoden .toarray().
En gles matris är en matris där de flesta elementen är noll. Den används för att effektivt representera och bearbeta data med en hög andel nollvärden, vilket sparar minne och beräkningsresurser genom att endast lagra de icke-noll elementen.
För att skapa en frekvensbaserad bag-of-words-modell behöver vi bara ta bort parametern binary=True eftersom standardvärdet är 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())
Omvandla matrisen till en DataFrame
Det kan vara mycket praktiskt att omvandla den resulterande bag-of-words-matrisen till en pandas DataFrame. Dessutom erbjuder CountVectorizer-instansen metoden get_feature_names_out(), som hämtar en array av unika ord (funktionsnamn) som används i modellen. Dessa funktionsnamn kan sedan användas som kolumner 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 denna representation kan vi nu enkelt komma åt både vektorn för ett specifikt dokument och vektorn för ett specifikt 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}")
Eftersom varje unikt ord motsvarar en kolumn, är åtkomst till ett ordvektor lika enkelt som att komma åt en kolumn i DataFrame genom att ange ordet (till exempel 'global'). Vi använder även attributet values för att erhålla en array istället för en Series som resultat.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Awesome!
Completion rate improved to 3.45
Påse med Ord
Svep för att visa menyn
Förståelse av BoW-modellen
Bag of words (BoW)-modellen representerar dokument som vektorer där varje dimension motsvarar ett unikt ord. Varje dimension kan antingen representera förekomsten av ett ord i dokumentet (1 om det finns, 0 om det saknas) eller dess frekvens (antal förekomster). Därför kan BoW-modeller vara antingen binära eller frekvensbaserade.
Låt oss titta på hur samma mening (dokument) representeras av varje typ:
En binär modell representerar detta dokument som vektorn [1, 1, 1], medan en frekvensbaserad modell representerar det som [2, 1, 2], där ordens frekvens tas med i beräkningen.
BoW-implementering
Att implementera BoW-modellen är en enkel process, särskilt med hjälp av biblioteket sklearn (scikit-learn) och dess klass CountVectorizer.
Här är en implementering av den binära bag of words-modellen:
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())
Varje rad i matrisen motsvarar ett dokument, och varje kolumn motsvarar ett token (ord). För att kunna visualisera detta omvandlade vi denna glesa matris till en tät tvådimensionell array med hjälp av metoden .toarray().
En gles matris är en matris där de flesta elementen är noll. Den används för att effektivt representera och bearbeta data med en hög andel nollvärden, vilket sparar minne och beräkningsresurser genom att endast lagra de icke-noll elementen.
För att skapa en frekvensbaserad bag-of-words-modell behöver vi bara ta bort parametern binary=True eftersom standardvärdet är 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())
Omvandla matrisen till en DataFrame
Det kan vara mycket praktiskt att omvandla den resulterande bag-of-words-matrisen till en pandas DataFrame. Dessutom erbjuder CountVectorizer-instansen metoden get_feature_names_out(), som hämtar en array av unika ord (funktionsnamn) som används i modellen. Dessa funktionsnamn kan sedan användas som kolumner 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 denna representation kan vi nu enkelt komma åt både vektorn för ett specifikt dokument och vektorn för ett specifikt 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}")
Eftersom varje unikt ord motsvarar en kolumn, är åtkomst till ett ordvektor lika enkelt som att komma åt en kolumn i DataFrame genom att ange ordet (till exempel 'global'). Vi använder även attributet values för att erhålla en array istället för en Series som resultat.
Tack för dina kommentarer!