1
resposta

aprimorando os resultados com outras técnicas

import pandas as pd
import nltk
import unidecode
from nltk import tokenize
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import TfidfVectorizer

nltk.download('stopwords')
nltk.download('rslp')

# 1. Carregar dados
url = 'https://raw.githubusercontent.com/alura-cursos/nlp_analise_sentimento/refs/heads/main/Dados/dataset_avaliacoes.csv'
df = pd.read_csv(url)

# 2. Recursos
stopwords = nltk.corpus.stopwords.words('portuguese')
stopwords_sem_acento = [unidecode.unidecode(p) for p in stopwords]
token_pontuacao = tokenize.WordPunctTokenizer()
stemmer = nltk.RSLPStemmer()

# 3. Criar tratamento_4
trat4 = []
for opiniao in df["avaliacao"]:
    toks = token_pontuacao.tokenize(opiniao)
    frase = [p.lower() for p in toks if p.isalpha()]
    frase = [unidecode.unidecode(p) for p in frase]
    frase = [p for p in frase if p not in stopwords_sem_acento]
    trat4.append(" ".join(frase))
df["tratamento_4"] = trat4

# 4. Aplicar stemming -> tratamento_5
trat5 = []
for opiniao in df["tratamento_4"]:
    toks = token_pontuacao.tokenize(opiniao)
    frase = [stemmer.stem(p) for p in toks if p not in stopwords_sem_acento]
    trat5.append(" ".join(frase))
df["tratamento_5"] = trat5

print("Comparação:")
print(df["tratamento_4"][3])
print(df["tratamento_5"][3])

# 5. Modelo base com TF-IDF
regressao_logistica = LogisticRegression(max_iter=1000)
tfidf = TfidfVectorizer(lowercase=False, max_features=50)
tfidf_tratados = tfidf.fit_transform(df["tratamento_5"])

X_treino, X_teste, y_treino, y_teste = train_test_split(
    tfidf_tratados, df["sentimento"], random_state=4978
)
regressao_logistica.fit(X_treino, y_treino)
acuracia_tfidf = regressao_logistica.score(X_teste, y_teste)
print(f"Acurácia TF-IDF: {acuracia_tfidf*100:.2f}%")

# 6. Modelo com n-grams e 1000 features
tfidf_1000 = TfidfVectorizer(lowercase=False, max_features=1000, ngram_range=(1,2))
vetor_tfidf = tfidf_1000.fit_transform(df["tratamento_5"])

X_treino, X_teste, y_treino, y_teste = train_test_split(
    vetor_tfidf, df["sentimento"], random_state=4978
)
regressao_logistica.fit(X_treino, y_treino)
acuracia_ngrams = regressao_logistica.score(X_teste, y_teste)
print(f"Acurácia TF-IDF + ngrams: {acuracia_ngrams*100:.2f}%")

# 7. Palavras mais influentes
pesos = pd.DataFrame(
    regressao_logistica.coef_[0].T,
    index=tfidf_1000.get_feature_names_out(),
    columns=["peso"]
)

print("\n50 termos mais positivos:")
print(pesos.nlargest(50, "peso"))

print("\n50 termos mais negativos:")
print(pesos.nsmallest(50, "peso"))
1 resposta

Olá, Moacir! Como vai?

Parabéns pela resolução da atividade!

Observei que você explorou o uso do NLTK para aplicar stemming e remover stopwords com Python, utilizou muito bem o TF-IDF com n-grams para enriquecer a representação textual e ainda compreendeu a importância da regressão logística para avaliar o desempenho e identificar termos mais influentes no modelo de classificação.

Continue postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Sugestão de conteúdo para você mergulhar ainda mais no tema:

Alguns materiais estão em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!