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:
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:
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
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().
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:
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())
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:
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)
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:
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}")
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.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
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:
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:
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
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().
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:
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())
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:
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)
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:
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}")
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.
Obrigado pelo seu feedback!