Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Bag of Words | Sezione
Elaborazione del Linguaggio Naturale

Bag of Words

Scorri per mostrare il menu

Il modello bag of words (BoW) rappresenta i documenti come vettori in cui ogni dimensione corrisponde a una parola unica. Ogni dimensione può rappresentare la presenza di una parola all'interno del documento (1 se presente, 0 se assente) oppure la sua frequenza (conteggio delle occorrenze della parola). Pertanto, i modelli BoW possono essere sia binari che basati sulla frequenza.

Vediamo come la stessa frase (documento) viene rappresentata da ciascun tipo:

Un modello binario rappresenta questo documento come il vettore [1, 1, 1], mentre il modello basato sulla frequenza lo rappresenta come [2, 1, 2], tenendo conto della frequenza delle parole.

Implementazione di BoW

L'implementazione del modello BoW è un processo semplice, soprattutto con l'aiuto della libreria sklearn (scikit-learn) e della sua classe CountVectorizer.

Ecco un'implementazione del modello bag of words binario:

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())

Ogni riga della matrice corrisponde a un documento e ogni colonna a un token (parola). Per rappresentarla visivamente, questa matrice sparsa è stata convertita in un array 2D denso utilizzando il metodo .toarray().

Note
Approfondisci

Una matrice sparsa è una matrice in cui la maggior parte degli elementi è pari a zero. Viene utilizzata per rappresentare e processare in modo efficiente dati con un elevato numero di valori zero, risparmiando memoria e risorse computazionali memorizzando solo gli elementi diversi da zero.

Per creare un modello bag of words basato sulla frequenza, è sufficiente rimuovere il parametro binary=True poiché il valore predefinito è 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())

Conversione della matrice in un DataFrame

Può essere molto utile convertire la matrice bag of words risultante in un DataFrame di pandas. Inoltre, l'istanza di CountVectorizer offre il metodo get_feature_names_out(), che restituisce un array di parole uniche (nomi delle feature) utilizzate nel modello. Questi nomi delle feature possono quindi essere utilizzati come colonne del 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)

Con questa rappresentazione, è ora possibile accedere facilmente non solo al vettore di un particolare documento, ma anche al vettore di una parola specifica:

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}")

Poiché ogni parola unica corrisponde a una colonna, accedere a un vettore di parole è semplice come accedere a una colonna nel DataFrame specificando la parola (ad esempio, 'global'). Si utilizza anche l'attributo values per ottenere un array invece di una Series come risultato.

question-icon

Data una matrice BoW, cosa rappresentano i diversi componenti di questa matrice?

Rows:
Columns:

A particular element of the matrix:

Clicca o trascina gli elementi e riempi gli spazi vuoti

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 1. Capitolo 20

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Sezione 1. Capitolo 20
some-alt