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