Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Bag of Words | Grundläggande Textmodeller
Introduktion till NLP med Python

Bag of Words

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.

Här är ett exempel på hur samma mening (dokument) representeras av varje typ:

bild

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

Implementering av BoW-modellen är en enkel process, särskilt med hjälp av sklearn (scikit-learn)-biblioteket och dess CountVectorizer-klass.

Här är 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())
Kodbeskrivning
expand arrow
from sklearn.feature_extraction.text import CountVectorizer

Denna rad importerar klassen CountVectorizer från 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.',
]

Dessa rader definierar en lista med namnet corpus som innehåller tre sträng-element. Varje sträng är ett textdokument.

vectorizer = CountVectorizer(binary=True)

Denna rad skapar en instans av klassen CountVectorizer. Parametern binary=True anger att modellen ska använda binära räkningar.

bow_matrix = vectorizer.fit_transform(corpus)

Metoden anpassar först modellen till datan, lär sig vokabulären från korpuset och transformerar sedan textdokumenten till en gles matris av tokenräkningar (bag of words-matris).

print(bow_matrix.toarray())

Denna rad konverterar den glesa matrisen bow_matrix till en tät array (numpy.ndarray) med hjälp av .toarray()-metoden och skriver ut den.

Varje rad i matrisen motsvarar ett dokument, och varje kolumn motsvarar ett token (ord). För att visuellt representera detta omvandlade vi denna glesa matris till en tät 2D-array med hjälp av metoden .toarray().

Note
Läs mer

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 för den är 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())

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:

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 denna representation kan vi nu enkelt komma åt inte bara vektorn för ett specifikt dokument, utan även vektorn för ett specifikt 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}")

Eftersom varje unikt ord motsvarar en kolumn är det lika enkelt att komma åt en ordvektor som att komma åt en kolumn i DataFrame genom att ange ordet (till exempel 'global'). Vi använder även attributet values för att få en array istället för en Series som resultat.

question-icon

Givet en BoW-matris, vad representerar de olika komponenterna i denna matris?

Rows:
Columns:

A particular element of the matrix:

Klicka eller dra`n`släpp objekt och fyll i luckorna

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 3

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 3. Kapitel 3
some-alt