File size: 4,697 Bytes
5031ce8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | """
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)
|