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)