Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Bag of Words | Modelli di Testo di Base
Introduzione a NLP con Python

Bag of Words

Scorri per mostrare il menu

Comprendere il modello BoW

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:

immagine

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 BoW

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

Di seguito un'implementazione del modello binario bag of words:

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())
Descrizione del codice
expand arrow
from sklearn.feature_extraction.text import CountVectorizer

Questa riga importa la classe CountVectorizer da 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.',
]

Queste righe definiscono una lista chiamata corpus che contiene tre elementi di tipo stringa. Ogni stringa rappresenta un documento di testo.

vectorizer = CountVectorizer(binary=True)

Questa riga crea un'istanza della classe CountVectorizer. Il parametro binary=True specifica che il modello deve utilizzare conteggi binari.

bow_matrix = vectorizer.fit_transform(corpus)

Il metodo prima adatta il modello ai dati, apprendendo il vocabolario del corpus, e poi trasforma i documenti di testo in una matrice sparsa di conteggi di token (matrice bag of words).

print(bow_matrix.toarray())

Questa riga converte la matrice sparsa bow_matrix in un array denso (numpy.ndarray) utilizzando il metodo .toarray() e lo stampa.

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

Note
Approfondisci

Una matrice sparsa è una matrice in cui la maggior parte degli elementi è zero. Viene utilizzata per rappresentare e processare in modo efficiente dati con un alto volume 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, basta 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 pandas DataFrame. 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 poi 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 al vettore di una parola è semplice come accedere a una colonna nel DataFrame specificando la parola (ad esempio, 'global'). Si utilizza inoltre 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 3. Capitolo 3

Chieda ad AI

expand

Chieda ad AI

ChatGPT

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

Bag of Words

Comprendere il modello BoW

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:

immagine

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 BoW

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

Di seguito un'implementazione del modello binario bag of words:

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())
Descrizione del codice
expand arrow
from sklearn.feature_extraction.text import CountVectorizer

Questa riga importa la classe CountVectorizer da 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.',
]

Queste righe definiscono una lista chiamata corpus che contiene tre elementi di tipo stringa. Ogni stringa rappresenta un documento di testo.

vectorizer = CountVectorizer(binary=True)

Questa riga crea un'istanza della classe CountVectorizer. Il parametro binary=True specifica che il modello deve utilizzare conteggi binari.

bow_matrix = vectorizer.fit_transform(corpus)

Il metodo prima adatta il modello ai dati, apprendendo il vocabolario del corpus, e poi trasforma i documenti di testo in una matrice sparsa di conteggi di token (matrice bag of words).

print(bow_matrix.toarray())

Questa riga converte la matrice sparsa bow_matrix in un array denso (numpy.ndarray) utilizzando il metodo .toarray() e lo stampa.

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

Note
Approfondisci

Una matrice sparsa è una matrice in cui la maggior parte degli elementi è zero. Viene utilizzata per rappresentare e processare in modo efficiente dati con un alto volume 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, basta 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 pandas DataFrame. 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 poi 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 al vettore di una parola è semplice come accedere a una colonna nel DataFrame specificando la parola (ad esempio, 'global'). Si utilizza inoltre l'attributo values per ottenere un array invece di una Series come risultato.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 3
some-alt