Olá, Leandro. Como vai?
Parabéns pela excelente estruturação da sua função grafico_frequencia e por compartilhar o projeto no seu GitHub! Automatizar etapas de visualização é um marco fundamental no fluxo de trabalho de um cientista de dados, pois evita a repetição de código e padroniza as análises exploratórias.
O pipeline que você desenhou para processamento de texto está impecável e segue o padrão ouro para análises iniciais em Processamento de Linguagem Natural (NLP):
Concatenação $\rightarrow$ Tokenização (WhitespaceTokenizer) $\rightarrow$ Contagem (FreqDist) $\rightarrow$ Estruturação em DataFrame $\rightarrow$ Plotagem (seaborn).
Para agregar ainda mais valor ao seu projeto e conectar com os próximos desafios do curso de Análise de Sentimentos, vamos analisar como você pode evoluir essa função para lidar com os dois principais "ruídos" que aparecem em análises de frequência: as Stopwords e as Pontuações.
O Próximo Passo no Pipeline de NLP: Limpeza de Texto
Se rodarmos a função grafico_frequencia em um conjunto de dados bruto de avaliações (como reviews de e-commerce), é muito provável que as palavras mais frequentes no topo do seu gráfico sejam artigos, preposições e conjunções (ex: "de", "o", "a", "que", "em").
Essas palavras são chamadas de Stopwords. Elas são vitais para a gramática humana, mas para algoritmos de Machine Learning e Análise de Sentimentos, elas não carregam significado emocional ou semântico.
Veja como você pode evoluir a assinatura da sua função para incluir uma etapa opcional de filtragem dessas palavras e de caracteres especiais, utilizando a própria biblioteca NLTK:
import nltk
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from nltk.tokenize import WhitespaceTokenizer
from nltk.probability import FreqDist
# Certifique-se de ter os downloads do NLTK se for usar essa evolução:
# nltk.download('stopwords')
def grafico_frequencia_evoluido(df, coluna_texto, quantidade=10, remover_stopwords=True):
# 1. Concatena os textos
texto_unico = " ".join(df[coluna_texto].dropna().astype(str).str.lower())
# 2. Tokenização básica
tokenizer = WhitespaceTokenizer()
tokens = tokenizer.tokenize(texto_unico)
# 3. Filtragem opcional (Stopwords e Pontuações)
if remover_stopwords:
stopwords_portugues = nltk.corpus.stopwords.words('portuguese')
# Filtra se não for stopword e se for apenas caracteres alfabéticos (remove pontos/virgulas)
tokens = [token for token in tokens if token not in stopwords_portugues and token.isalpha()]
# 4. Distribuição de Frequência
frequencia = FreqDist(tokens)
# 5. Criação do DataFrame de Resultados
df_frequencia = pd.DataFrame(frequencia.items(), columns=['Palavra', 'Frequência'])
df_frequencia = df_frequencia.sort_values(by='Frequência', ascending=False).head(quantidade)
# 6. Plotagem com Seaborn
plt.figure(figsize=(12, 6))
sns.barplot(x='Frequência', y='Palavra', data=df_frequencia, palette='Blues_r')
plt.title(f'Top {quantidade} Palavras Mais Frequentes na Coluna {coluna_texto}')
plt.show()
Por que essa evolução transforma a sua Análise de Sentimentos?
Ao aplicar a conversão para minúsculas (.str.lower()) e a remoção de stopwords, o topo do seu gráfico de barras deixará de mostrar conectivos neutros e passará a exibir os verdadeiros termos que dão o tom das avaliações dos usuários (como os adjetivos "bom", "excelente", "péssimo", "atrasou").
Isso dará um poder de diagnóstico visual absurdamente maior para quem estiver analisando os dados antes de treinar os modelos de Machine Learning.
Parabéns pela iniciativa de subir o código estruturado no GitHub e pela excelente descrição técnica do seu projeto aqui no fórum!
Espero que possa ter lhe ajudado!