Saco de Palavras
Compreendendo o Modelo BoW
O modelo bag of words (BoW) representa documentos como vetores, onde 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.
Aqui está uma implementação do modelo binário bag of words:
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())
Cada linha da matriz corresponde a um documento, e cada coluna a um token (palavra). Para representar visualmente, convertemos essa matriz esparsa em um array 2D denso utilizando o método .toarray().
Uma matriz esparsa é uma matriz na qual a maioria dos elementos é zero. Ela é utilizada para representar e processar dados de forma eficiente quando há um grande volume de valores zero, 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, pois 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 pandas. 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 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, é 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 um vetor de palavras é 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 uma 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
Awesome!
Completion rate improved to 3.45
Saco de Palavras
Deslize para mostrar o menu
Compreendendo o Modelo BoW
O modelo bag of words (BoW) representa documentos como vetores, onde 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.
Aqui está uma implementação do modelo binário bag of words:
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())
Cada linha da matriz corresponde a um documento, e cada coluna a um token (palavra). Para representar visualmente, convertemos essa matriz esparsa em um array 2D denso utilizando o método .toarray().
Uma matriz esparsa é uma matriz na qual a maioria dos elementos é zero. Ela é utilizada para representar e processar dados de forma eficiente quando há um grande volume de valores zero, 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, pois 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 pandas. 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 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, é 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 um vetor de palavras é 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 uma Series como resultado.
Obrigado pelo seu feedback!