| """ |
| 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 |
|
|
| |
| try: |
| stopwords.words('portuguese') |
| except LookupError: |
| nltk.download('stopwords') |
|
|
| |
| 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!") |
|
|
| |
| 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!", "", "" |
| |
| |
| features_numericas = extrair_features_numericas(texto) |
| |
| |
| texto_processado = preprocessar_texto(texto) |
| |
| |
| tfidf_features = tfidf_vectorizer.transform([texto_processado]).toarray() |
| |
| |
| features_numericas_scaled = scaler.transform([features_numericas]) |
| |
| |
| features_final = np.hstack([tfidf_features, features_numericas_scaled]) |
| |
| |
| predicao = modelo.predict(features_final)[0] |
| |
| |
| 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 |
| |
| |
| 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 = "🟢" |
| |
| |
| prob_texto = f""" |
| 📊 **Probabilidades:** |
| • Não-Clickbait: {prob_nao_clickbait*100:.1f}% |
| • Clickbait: {prob_clickbait*100:.1f}% |
| """ |
| |
| |
| 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 = [ |
| ["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 = 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) |
|
|