Spaces:
Sleeping
Sleeping
Update src/streamlit_app.py
Browse files- src/streamlit_app.py +56 -6
src/streamlit_app.py
CHANGED
|
@@ -5,8 +5,8 @@ from urllib.parse import urlparse
|
|
| 5 |
import io
|
| 6 |
|
| 7 |
# --- CONFIGURAÇÕES ---
|
| 8 |
-
#
|
| 9 |
-
MODEL_ID = "
|
| 10 |
|
| 11 |
st.set_page_config(page_title="Validador .BR", page_icon="🇧🇷")
|
| 12 |
|
|
@@ -49,7 +49,7 @@ def load_model():
|
|
| 49 |
try:
|
| 50 |
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
|
| 51 |
model = AutoModelForSequenceClassification.from_pretrained(MODEL_ID)
|
| 52 |
-
# Força uso de CPU no Space gratuito
|
| 53 |
model.to("cpu")
|
| 54 |
model.eval()
|
| 55 |
return tokenizer, model
|
|
@@ -81,6 +81,56 @@ if uploaded_file and tokenizer:
|
|
| 81 |
for i, linha in enumerate(linhas):
|
| 82 |
original = linha.strip()
|
| 83 |
|
| 84 |
-
# --- CORREÇÃO DA LINHA
|
| 85 |
-
# Verifica se a linha é vazia ou
|
| 86 |
-
if not original or original.startswith("")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
import io
|
| 6 |
|
| 7 |
# --- CONFIGURAÇÕES ---
|
| 8 |
+
# Seu ID do modelo (Correto conforme você enviou)
|
| 9 |
+
MODEL_ID = "asilvamaia/ident_br"
|
| 10 |
|
| 11 |
st.set_page_config(page_title="Validador .BR", page_icon="🇧🇷")
|
| 12 |
|
|
|
|
| 49 |
try:
|
| 50 |
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
|
| 51 |
model = AutoModelForSequenceClassification.from_pretrained(MODEL_ID)
|
| 52 |
+
# Força uso de CPU no Space gratuito para evitar erros
|
| 53 |
model.to("cpu")
|
| 54 |
model.eval()
|
| 55 |
return tokenizer, model
|
|
|
|
| 81 |
for i, linha in enumerate(linhas):
|
| 82 |
original = linha.strip()
|
| 83 |
|
| 84 |
+
# --- CORREÇÃO DA LINHA QUE ESTAVA COM ERRO ---
|
| 85 |
+
# Verifica se a linha é vazia ou se começa com metadados [source: ...]
|
| 86 |
+
if not original or original.startswith("[source:"):
|
| 87 |
+
continue
|
| 88 |
+
|
| 89 |
+
# Aplica limpeza
|
| 90 |
+
limpo = limpar_entrada(original)
|
| 91 |
+
|
| 92 |
+
# Inferência (Classificação)
|
| 93 |
+
inputs = tokenizer(limpo, return_tensors="pt", truncation=True, max_length=128)
|
| 94 |
+
with torch.no_grad():
|
| 95 |
+
outputs = model(**inputs)
|
| 96 |
+
pred = torch.argmax(outputs.logits, dim=1).item()
|
| 97 |
+
|
| 98 |
+
# REGRA DE APROVAÇÃO:
|
| 99 |
+
# 1. Modelo diz que é Classe 1 (BR)
|
| 100 |
+
# 2. Tem ponto na string
|
| 101 |
+
# 3. Não tem @
|
| 102 |
+
if pred == 1 and "." in limpo and "@" not in limpo:
|
| 103 |
+
validos.append(limpo)
|
| 104 |
+
else:
|
| 105 |
+
rejeitados.append(original)
|
| 106 |
+
|
| 107 |
+
# Atualiza barra de progresso a cada 10 itens
|
| 108 |
+
if i % 10 == 0:
|
| 109 |
+
progress_bar.progress(min((i + 1) / total_linhas, 1.0))
|
| 110 |
+
|
| 111 |
+
progress_bar.progress(1.0)
|
| 112 |
+
|
| 113 |
+
# --- DEDUPLICAÇÃO (Remove repetidos) ---
|
| 114 |
+
validos_unicos = sorted(list(set(validos)))
|
| 115 |
+
rejeitados_unicos = sorted(list(set(rejeitados)))
|
| 116 |
+
|
| 117 |
+
st.success("Processamento Concluído!")
|
| 118 |
+
|
| 119 |
+
# Exibe métricas
|
| 120 |
+
col1, col2 = st.columns(2)
|
| 121 |
+
with col1:
|
| 122 |
+
st.metric("✅ Aprovados (Únicos)", len(validos_unicos), help="Domínios .br válidos")
|
| 123 |
+
with col2:
|
| 124 |
+
st.metric("🔴 Rejeitados (Únicos)", len(rejeitados_unicos), help="Itens descartados")
|
| 125 |
+
|
| 126 |
+
# Botão de Download
|
| 127 |
+
st.download_button(
|
| 128 |
+
label="⬇️ Baixar Lista Limpa (.txt)",
|
| 129 |
+
data="\n".join(validos_unicos),
|
| 130 |
+
file_name="dominios_limpos.txt",
|
| 131 |
+
mime="text/plain"
|
| 132 |
+
)
|
| 133 |
+
|
| 134 |
+
# Mostra amostra
|
| 135 |
+
with st.expander("Ver amostra dos resultados"):
|
| 136 |
+
st.write(validos_unicos[:50])
|