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:
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:
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
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().
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:
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 inte bara vektorn för ett specifikt dokument, utan även 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 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.
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