Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Saco de Palavras | Modelos Básicos de Texto
Introdução ao PLN com Python

Saco de Palavras

Deslize para mostrar o menu

Compreendendo o Modelo BoW

O modelo bag of words (BoW) representa documentos como vetores em que cada dimensão corresponde a uma palavra única. Cada dimensão pode representar a presença de uma palavra no documento (1 se presente, 0 se ausente) ou sua frequência (contagem de palavras). Portanto, modelos BoW podem ser binários ou baseados em frequência.

Veja como a mesma frase (documento) é representada por cada tipo:

imagem

Um modelo binário representa este documento como o vetor [1, 1, 1], enquanto o modelo baseado em frequência o representa como [2, 1, 2], levando em consideração a frequência das palavras.

Implementação do BoW

A implementação do modelo BoW é um processo direto, especialmente com o auxílio da biblioteca sklearn (scikit-learn) e sua classe CountVectorizer.

A seguir, uma implementação do modelo de bag of words binário:

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())
Descrição do Código
expand arrow
from sklearn.feature_extraction.text import CountVectorizer

Esta linha importa a classe CountVectorizer do 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.',
]

Estas linhas definem uma lista chamada corpus que contém três elementos do tipo string. Cada string é um documento de texto.

vectorizer = CountVectorizer(binary=True)

Esta linha cria uma instância da classe CountVectorizer. O parâmetro binary=True especifica que o modelo deve usar contagens binárias.

bow_matrix = vectorizer.fit_transform(corpus)

O método primeiro ajusta o modelo aos dados, aprendendo o vocabulário do corpus, e depois transforma os documentos de texto em uma matriz esparsa de contagem de tokens (matriz bag of words).

print(bow_matrix.toarray())

Esta linha converte a matriz esparsa bow_matrix em um array denso (numpy.ndarray) usando o método .toarray() e o imprime.

Cada linha na matriz corresponde a um documento, e cada coluna a um token (palavra). Para representá-la visualmente, convertemos essa matriz esparsa em um array 2D denso usando o método .toarray().

Note
Estude Mais

Uma matriz esparsa é uma matriz na qual a maioria dos elementos é zero. Ela é utilizada para representar e processar dados com grande volume de valores zero de forma eficiente, economizando memória e recursos computacionais ao armazenar apenas os elementos diferentes de zero.

Para criar um modelo de bag of words baseado em frequência, basta remover o parâmetro binary=True, já que o valor padrão dele é 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())

Convertendo a Matriz para um DataFrame

Pode ser bastante conveniente converter a matriz resultante do bag of words em um DataFrame do DataFrame. Além disso, a instância do CountVectorizer oferece o método get_feature_names_out(), que recupera um array de palavras únicas (nomes das features) utilizadas no modelo. Esses nomes de features podem então ser usados como colunas do 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)

Com essa representação, agora é possível acessar facilmente não apenas o vetor de um documento específico, mas também o vetor de uma palavra específica:

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

Como cada palavra única corresponde a uma coluna, acessar o vetor de uma palavra é tão simples quanto acessar uma coluna no DataFrame especificando a palavra (por exemplo, 'global'). Também utilizamos o atributo values para obter um array em vez de um Series como resultado.

question-icon

Dada uma matriz BoW, o que representam os diferentes componentes dessa matriz?

Rows:
Columns:

A particular element of the matrix:

Click or drag`n`drop items and fill in the blanks

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 3

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Saco de Palavras

Compreendendo o Modelo BoW

O modelo bag of words (BoW) representa documentos como vetores em que cada dimensão corresponde a uma palavra única. Cada dimensão pode representar a presença de uma palavra no documento (1 se presente, 0 se ausente) ou sua frequência (contagem de palavras). Portanto, modelos BoW podem ser binários ou baseados em frequência.

Veja como a mesma frase (documento) é representada por cada tipo:

imagem

Um modelo binário representa este documento como o vetor [1, 1, 1], enquanto o modelo baseado em frequência o representa como [2, 1, 2], levando em consideração a frequência das palavras.

Implementação do BoW

A implementação do modelo BoW é um processo direto, especialmente com o auxílio da biblioteca sklearn (scikit-learn) e sua classe CountVectorizer.

A seguir, uma implementação do modelo de bag of words binário:

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())
Descrição do Código
expand arrow
from sklearn.feature_extraction.text import CountVectorizer

Esta linha importa a classe CountVectorizer do 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.',
]

Estas linhas definem uma lista chamada corpus que contém três elementos do tipo string. Cada string é um documento de texto.

vectorizer = CountVectorizer(binary=True)

Esta linha cria uma instância da classe CountVectorizer. O parâmetro binary=True especifica que o modelo deve usar contagens binárias.

bow_matrix = vectorizer.fit_transform(corpus)

O método primeiro ajusta o modelo aos dados, aprendendo o vocabulário do corpus, e depois transforma os documentos de texto em uma matriz esparsa de contagem de tokens (matriz bag of words).

print(bow_matrix.toarray())

Esta linha converte a matriz esparsa bow_matrix em um array denso (numpy.ndarray) usando o método .toarray() e o imprime.

Cada linha na matriz corresponde a um documento, e cada coluna a um token (palavra). Para representá-la visualmente, convertemos essa matriz esparsa em um array 2D denso usando o método .toarray().

Note
Estude Mais

Uma matriz esparsa é uma matriz na qual a maioria dos elementos é zero. Ela é utilizada para representar e processar dados com grande volume de valores zero de forma eficiente, economizando memória e recursos computacionais ao armazenar apenas os elementos diferentes de zero.

Para criar um modelo de bag of words baseado em frequência, basta remover o parâmetro binary=True, já que o valor padrão dele é 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())

Convertendo a Matriz para um DataFrame

Pode ser bastante conveniente converter a matriz resultante do bag of words em um DataFrame do DataFrame. Além disso, a instância do CountVectorizer oferece o método get_feature_names_out(), que recupera um array de palavras únicas (nomes das features) utilizadas no modelo. Esses nomes de features podem então ser usados como colunas do 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)

Com essa representação, agora é possível acessar facilmente não apenas o vetor de um documento específico, mas também o vetor de uma palavra específica:

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

Como cada palavra única corresponde a uma coluna, acessar o vetor de uma palavra é tão simples quanto acessar uma coluna no DataFrame especificando a palavra (por exemplo, 'global'). Também utilizamos o atributo values para obter um array em vez de um Series como resultado.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 3
some-alt