rodrigoaraujorosa's picture
Initial commit: Detector de Clickbait BR
5031ce8
Raw
History Blame
4.7 kB
"""
Aplicação Gradio para Detecção de Clickbait em Português
Autor: Detector Clickbait BR
"""
import gradio as gr
import pickle
import re
import numpy as np
import nltk
from nltk.corpus import stopwords
# Baixar recursos NLTK
try:
stopwords.words('portuguese')
except LookupError:
nltk.download('stopwords')
# Carregar modelo e transformadores
print("📦 Carregando modelo e transformadores...")
with open('models/melhor_modelo.pkl', 'rb') as f:
modelo = pickle.load(f)
with open('data/processed/tfidf_vectorizer.pkl', 'rb') as f:
tfidf_vectorizer = pickle.load(f)
with open('data/processed/scaler.pkl', 'rb') as f:
scaler = pickle.load(f)
print("✅ Modelo carregado com sucesso!")
# Configurar preprocessamento
stop_words = set(stopwords.words('portuguese'))
def preprocessar_texto(texto):
"""Preprocessa texto para predição."""
texto = texto.lower()
texto_limpo = re.sub(r'[^\w\s]', ' ', texto)
palavras = texto_limpo.split()
palavras_filtradas = [palavra for palavra in palavras if palavra not in stop_words and palavra.strip()]
return ' '.join(palavras_filtradas)
def extrair_features_numericas(texto):
"""Extrai features numéricas do texto."""
word_count = len(texto.split())
char_count = len(texto)
exclamation_count = texto.count('!')
question_count = texto.count('?')
return [word_count, char_count, exclamation_count, question_count]
def prever_clickbait(texto):
"""Prediz se uma manchete é clickbait ou não."""
if not texto.strip():
return "❌ Por favor, digite uma manchete!", "", ""
# Extrair features numéricas
features_numericas = extrair_features_numericas(texto)
# Preprocessar texto
texto_processado = preprocessar_texto(texto)
# Vetorizar com TF-IDF
tfidf_features = tfidf_vectorizer.transform([texto_processado]).toarray()
# Normalizar features numéricas
features_numericas_scaled = scaler.transform([features_numericas])
# Combinar features
features_final = np.hstack([tfidf_features, features_numericas_scaled])
# Fazer predição
predicao = modelo.predict(features_final)[0]
# Probabilidade
try:
probabilidade = modelo.predict_proba(features_final)[0]
prob_nao_clickbait = float(probabilidade[0])
prob_clickbait = float(probabilidade[1])
except:
prob_nao_clickbait = 0.5
prob_clickbait = 0.5
# Resultado
if predicao == 1:
resultado = f"❌ **CLICKBAIT**\n\nConfiança: {prob_clickbait*100:.1f}%"
cor = "🔴"
else:
resultado = f"✅ **NÃO-CLICKBAIT**\n\nConfiança: {prob_nao_clickbait*100:.1f}%"
cor = "🟢"
# Probabilidades
prob_texto = f"""
📊 **Probabilidades:**
• Não-Clickbait: {prob_nao_clickbait*100:.1f}%
• Clickbait: {prob_clickbait*100:.1f}%
"""
# Features
features_texto = f"""
📈 **Features Extraídas:**
• Palavras: {features_numericas[0]}
• Caracteres: {features_numericas[1]}
• Exclamações: {features_numericas[2]}
• Interrogações: {features_numericas[3]}
"""
return resultado, prob_texto, features_texto
# Exemplos
exemplos = [
["Banco Central anuncia nova taxa de juros"],
["Você não vai acreditar no que esse cachorro fez!"],
["Governo aprova reforma tributária no Congresso"],
["DESCUBRA o segredo para emagrecer 10kg em 7 dias!!!"],
["Estudo da USP revela novos dados sobre mudanças climáticas"]
]
# Interface Gradio
interface = gr.Interface(
fn=prever_clickbait,
inputs=gr.Textbox(
label="📝 Digite a manchete",
placeholder="Ex: Você não vai acreditar no que aconteceu!",
lines=3
),
outputs=[
gr.Markdown(label="🎯 Predição"),
gr.Markdown(label="📊 Probabilidades"),
gr.Markdown(label="📈 Features")
],
title="🔍 Detector de Clickbait BR",
description="""
### Identifica manchetes clickbait em notícias em português
Esta aplicação usa Machine Learning para classificar manchetes como **Clickbait** ou **Não-Clickbait**.
**Como funciona:**
1. Digite ou cole uma manchete
2. O modelo analisa texto, pontuação e características linguísticas
3. Retorna a classificação com probabilidades
**Exemplos para testar estão abaixo! ⬇️**
""",
examples=exemplos,
flagging_mode="never"
)
if __name__ == "__main__":
print("\n" + "="*80)
print("🚀 GRADIO - DETECTOR DE CLICKBAIT")
print("="*80)
print("\n💡 Interface será aberta no navegador")
print("="*80 + "\n")
interface.launch(share=False)