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