Spaces:
Running
on
Zero
Running
on
Zero
travahacker
commited on
Commit
·
fd4cfe0
1
Parent(s):
1543e05
feat: atualiza Space radar-legislativo-lgbtqia (ALESP+CMSP, UX melhorado, pesos ensemble, termos expandidos); docs e config revisados
Browse files- .huggingface.yml +1 -0
- AzMina QuiterIA.code-workspace +8 -0
- DEPLOY_COMPLETO.md +1 -0
- RESEARCH_ALESP_CAMARA_SP.md +182 -0
- SYNC_PLAN.md +1 -0
- ensemble_híbrido.py +19 -2
.huggingface.yml
CHANGED
|
@@ -16,3 +16,4 @@ tags:
|
|
| 16 |
- ensemble
|
| 17 |
- radar-social
|
| 18 |
|
|
|
|
|
|
| 16 |
- ensemble
|
| 17 |
- radar-social
|
| 18 |
|
| 19 |
+
|
AzMina QuiterIA.code-workspace
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"folders": [
|
| 3 |
+
{
|
| 4 |
+
"path": "."
|
| 5 |
+
}
|
| 6 |
+
],
|
| 7 |
+
"settings": {}
|
| 8 |
+
}
|
DEPLOY_COMPLETO.md
CHANGED
|
@@ -166,3 +166,4 @@ https://huggingface.co/spaces/Veronyka/radar-legislativo-lgbtqia
|
|
| 166 |
|
| 167 |
**Use como ferramenta de apoio, sempre com revisão humana.** ⚖️
|
| 168 |
|
|
|
|
|
|
| 166 |
|
| 167 |
**Use como ferramenta de apoio, sempre com revisão humana.** ⚖️
|
| 168 |
|
| 169 |
+
|
RESEARCH_ALESP_CAMARA_SP.md
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 🔍 Pesquisa: APIs ALESP e Câmara Municipal de São Paulo
|
| 2 |
+
|
| 3 |
+
**Data da pesquisa**: Outubro 2025
|
| 4 |
+
|
| 5 |
+
## 📋 Resumo Executivo
|
| 6 |
+
|
| 7 |
+
Após investigação detalhada, a situação das APIs/dados abertos é:
|
| 8 |
+
|
| 9 |
+
### ✅ ALESP (Assembleia Legislativa de São Paulo) - IMPLEMENTADO
|
| 10 |
+
|
| 11 |
+
**Status**: **✅ Portal encontrado e implementado!**
|
| 12 |
+
|
| 13 |
+
- **Portal Correto**: https://www.al.sp.gov.br/dados-abertos/
|
| 14 |
+
- **Arquivo de Proposituras**: https://www.al.sp.gov.br/repositorioDados/processo_legislativo/proposituras.zip
|
| 15 |
+
- **Formato**: ZIP contendo XML com todas as proposituras (253.496 proposituras!)
|
| 16 |
+
- **Tamanho**: ~16MB ZIP, ~115MB XML descompactado
|
| 17 |
+
- **Atualização**: Diária
|
| 18 |
+
- **Última atualização**: 29-10-2025 21:26:06
|
| 19 |
+
|
| 20 |
+
**Implementação:**
|
| 21 |
+
- Função `buscar_alesp()` implementada em `api_radar.py`
|
| 22 |
+
- Baixa arquivo ZIP, extrai XML, parseia e filtra por termos LGBTQIA+
|
| 23 |
+
- Integrada no `app.py` com checkbox para ativar/desativar
|
| 24 |
+
- Testada e funcionando: encontrou 10 PLs relevantes em teste (2020-2024)
|
| 25 |
+
|
| 26 |
+
**Performance:**
|
| 27 |
+
- Download do ZIP: ~5-10 segundos
|
| 28 |
+
- Parse do XML: ~5-8 segundos
|
| 29 |
+
- Total: ~10-20 segundos para busca completa
|
| 30 |
+
|
| 31 |
+
**Nota**: O arquivo contém TODAS as proposituras históricas. Filtro por ano é aplicado após download para otimizar processamento.
|
| 32 |
+
|
| 33 |
+
### ✅ Câmara Municipal de São Paulo - WEB SERVICE PÚBLICO ENCONTRADO E IMPLEMENTADO!
|
| 34 |
+
|
| 35 |
+
**Status**: **✅ Web Service público funcionando sem autenticação!**
|
| 36 |
+
|
| 37 |
+
- **Portal de Dados Abertos**: https://www.saopaulo.sp.leg.br/transparencia/dados-abertos/dados-disponibilizados-em-formato-aberto/
|
| 38 |
+
- **Web Service Público**: https://splegisws.saopaulo.sp.leg.br/ws/ws2.asmx ✅
|
| 39 |
+
- **Método Principal**: `ProjetosPorAnoJSON` ✅ (funcionando, retorna JSON!)
|
| 40 |
+
- **SPLEGIS Consulta (Interface Web)**: https://splegisconsulta.saopaulo.sp.leg.br/
|
| 41 |
+
- **Base legal**: Ato da Mesa nº 1156/2011
|
| 42 |
+
- **Resultado da investigação**:
|
| 43 |
+
- ✅ Portal de dados abertos listou o web service SPLEGIS
|
| 44 |
+
- ✅ **Web Service PÚBLICO** (`splegisws.saopaulo.sp.leg.br/ws/ws2.asmx`) **funcionando sem autenticação!**
|
| 45 |
+
- ✅ Método `ProjetosPorAnoJSON` retorna todos os projetos de um ano (ex: 18.929 projetos em 2020)
|
| 46 |
+
- ✅ Testado e funcionando: encontrou 10 PLs relevantes em teste (2020-2024)
|
| 47 |
+
|
| 48 |
+
**Links relevantes encontrados no portal:**
|
| 49 |
+
- Menu menciona "Projetos Apresentados (desde 1948)" na seção "Atividade Legislativa"
|
| 50 |
+
- Portal menciona Programa de Dados Abertos do Parlamento
|
| 51 |
+
- Referências a formato aberto (Open Knowledge Foundation, W3C)
|
| 52 |
+
|
| 53 |
+
**Estrutura identificada:**
|
| 54 |
+
- **Web Service Público** (`ws2.asmx`) com múltiplos métodos JSON
|
| 55 |
+
- **Método principal**: `ProjetosPorAnoJSON` - retorna todos os projetos de um ano
|
| 56 |
+
- **Métodos disponíveis**: `ProjetosPorAnoJSON`, `ProjetoResumoJSON`, `ProjetosAssuntosJSON`, etc.
|
| 57 |
+
- Interface web SPLEGIS Consulta também disponível
|
| 58 |
+
|
| 59 |
+
**Implementação:**
|
| 60 |
+
- ✅ Função `buscar_camara_sao_paulo()` implementada em `api_radar.py`
|
| 61 |
+
- ✅ Usa método `ProjetosPorAnoJSON` para buscar projetos por ano
|
| 62 |
+
- ✅ Filtra localmente por termos LGBTQIA+ na ementa
|
| 63 |
+
- ✅ Integrada no `app.py` com checkbox para ativar/desativar
|
| 64 |
+
- ✅ Testada e funcionando: encontrou 10 PLs relevantes em teste (2020-2024)
|
| 65 |
+
|
| 66 |
+
**Performance:**
|
| 67 |
+
- Busca por ano: ~2-5 segundos por ano
|
| 68 |
+
- Filtro local: ~1-3 segundos (depende do número de projetos - pode ter 20k+ por ano)
|
| 69 |
+
- Total: ~5-15 segundos para busca completa (1-2 anos)
|
| 70 |
+
|
| 71 |
+
**Nota**: O método retorna TODOS os projetos do ano (ex: 18.929 em 2020). O filtro por termos LGBTQIA+ é aplicado localmente após o download.
|
| 72 |
+
|
| 73 |
+
**Observações técnicas:**
|
| 74 |
+
- Site usa WordPress (wp-includes detectado)
|
| 75 |
+
- Possui proteção Cloudflare/proteção anti-bot
|
| 76 |
+
- Requer navegador real ou user-agent completo para acesso
|
| 77 |
+
|
| 78 |
+
### ✅ Portal Prefeitura SP (CKAN) - Funcionando
|
| 79 |
+
|
| 80 |
+
**Status**: **API CKAN disponível e funcionando**
|
| 81 |
+
|
| 82 |
+
- Portal: https://dados.prefeitura.sp.gov.br
|
| 83 |
+
- API CKAN: https://dados.prefeitura.sp.gov.br/api/3
|
| 84 |
+
- **Resultado**: ✅ API funcionando, 271 datasets encontrados
|
| 85 |
+
|
| 86 |
+
**Próximos passos:**
|
| 87 |
+
1. Explorar quais datasets contêm informações legislativas
|
| 88 |
+
2. Verificar se há dados de projetos de lei/proposições
|
| 89 |
+
3. Implementar busca via API CKAN padrão
|
| 90 |
+
|
| 91 |
+
## 🔧 Implementação Realizada
|
| 92 |
+
|
| 93 |
+
### Funções Atualizadas em `api_radar.py`
|
| 94 |
+
|
| 95 |
+
#### `buscar_alesp()`
|
| 96 |
+
- Status: Retorna lista vazia com mensagem informativa
|
| 97 |
+
- Motivo: Portal não acessível publicamente
|
| 98 |
+
- Próxima ação: Requer verificação manual
|
| 99 |
+
|
| 100 |
+
#### `buscar_camara_sao_paulo()`
|
| 101 |
+
- Status: Retorna lista vazia com mensagem informativa
|
| 102 |
+
- Motivo: API REST não documentada publicamente
|
| 103 |
+
- Próxima ação: Implementar Opção A (downloads) ou Opção B (scraping controlado)
|
| 104 |
+
|
| 105 |
+
#### `buscar_ckan_prefeitura_sp()` (TODO)
|
| 106 |
+
- Status: Não implementado
|
| 107 |
+
- Prioridade: Baixa (verificar se há dados legislativos relevantes)
|
| 108 |
+
|
| 109 |
+
## 📝 Links Verificados
|
| 110 |
+
|
| 111 |
+
### ALESP
|
| 112 |
+
- ❌ https://dadosabertos.alesp.gov.br (não resolve)
|
| 113 |
+
- ❌ https://dadosabertos.alesp.gov.br/swagger (não resolve)
|
| 114 |
+
- ✅ https://www.alesp.sp.gov.br (site oficial - requer verificação manual)
|
| 115 |
+
|
| 116 |
+
### Câmara Municipal SP
|
| 117 |
+
- ✅ https://www.camara.sp.gov.br/transparencia/dados-abertos/ (portal existe)
|
| 118 |
+
- ✅ https://www.camara.sp.gov.br (site oficial)
|
| 119 |
+
|
| 120 |
+
### Prefeitura SP
|
| 121 |
+
- ✅ https://dados.prefeitura.sp.gov.br (portal CKAN funcionando)
|
| 122 |
+
- ✅ https://dados.prefeitura.sp.gov.br/api/3 (API CKAN funcionando)
|
| 123 |
+
|
| 124 |
+
## 🎯 Recomendações de Priorização
|
| 125 |
+
|
| 126 |
+
### Alta Prioridade: Câmara Municipal SP
|
| 127 |
+
**Por quê:**
|
| 128 |
+
- Portal existe e é oficial
|
| 129 |
+
- Provavelmente tem dados disponíveis (mesmo que não via API)
|
| 130 |
+
- Impacto alto (é nível municipal, complementa o escopo federal/estadual)
|
| 131 |
+
|
| 132 |
+
**Ação recomendada:**
|
| 133 |
+
1. Explorar o portal manualmente no navegador
|
| 134 |
+
2. Verificar se há seção de "downloads" ou arquivos CSV/XML
|
| 135 |
+
3. Se houver, implementar função de download e parser
|
| 136 |
+
4. Se não houver, considerar scraping controlado da listagem de proposições
|
| 137 |
+
|
| 138 |
+
### Média Prioridade: ALESP
|
| 139 |
+
**Por quê:**
|
| 140 |
+
- Portal mencionado mas não acessível
|
| 141 |
+
- Pode ser que tenha sido migrado ou esteja em manutenção
|
| 142 |
+
- Impacto médio (complementa federal, mas estadual já está parcialmente coberto)
|
| 143 |
+
|
| 144 |
+
**Ação recomendada:**
|
| 145 |
+
1. Contatar ALESP via email/telefone para verificar status
|
| 146 |
+
2. Verificar site oficial para downloads manuais
|
| 147 |
+
3. Monitorar futuras atualizações do portal
|
| 148 |
+
|
| 149 |
+
### Baixa Prioridade: Portal Prefeitura SP
|
| 150 |
+
**Por quê:**
|
| 151 |
+
- CKAN funcionando, mas pode não ter dados legislativos
|
| 152 |
+
- Impacto baixo (dados podem ser de outros órgãos municipais)
|
| 153 |
+
|
| 154 |
+
**Ação recomendada:**
|
| 155 |
+
1. Explorar datasets do CKAN procurando por "legislacao", "camara", "projetos"
|
| 156 |
+
2. Se encontrar dados relevantes, implementar busca via API CKAN
|
| 157 |
+
|
| 158 |
+
## 🧪 Testes Realizados
|
| 159 |
+
|
| 160 |
+
### ALESP
|
| 161 |
+
- ❌ DNS não resolve para `dadosabertos.alesp.gov.br`
|
| 162 |
+
- ❌ Site oficial também não resolve (`www.alesp.sp.gov.br`)
|
| 163 |
+
- ❌ Variações de URL testadas, nenhuma funcionou
|
| 164 |
+
|
| 165 |
+
### Câmara Municipal SP
|
| 166 |
+
- ⚠️ Portal acessível, mas certificado SSL com problema
|
| 167 |
+
- ⚠️ Não testado via scraping (requer verificação de ToS)
|
| 168 |
+
|
| 169 |
+
### Prefeitura SP CKAN
|
| 170 |
+
- ✅ API CKAN responde (200 OK)
|
| 171 |
+
- ✅ 271 datasets encontrados
|
| 172 |
+
- ✅ Estrutura CKAN padrão confirmada
|
| 173 |
+
|
| 174 |
+
## 📚 Referências
|
| 175 |
+
|
| 176 |
+
- CKAN API Documentation: https://docs.ckan.org/en/2.9/api/
|
| 177 |
+
- Câmara Municipal SP - Ato da Mesa 1156/2011
|
| 178 |
+
- Portal Dados Abertos Prefeitura SP: https://dados.prefeitura.sp.gov.br
|
| 179 |
+
|
| 180 |
+
---
|
| 181 |
+
|
| 182 |
+
**Conclusão**: Focar em Câmara Municipal SP como próxima implementação. ALESP requer contato direto ou verificação manual futura.
|
SYNC_PLAN.md
CHANGED
|
@@ -173,3 +173,4 @@ Após sync, atualizar:
|
|
| 173 |
|
| 174 |
**Recomendação**: Executar sync automático agora, é safe e traz melhorias críticas! 🚀
|
| 175 |
|
|
|
|
|
|
| 173 |
|
| 174 |
**Recomendação**: Executar sync automático agora, é safe e traz melhorias críticas! 🚀
|
| 175 |
|
| 176 |
+
|
ensemble_híbrido.py
CHANGED
|
@@ -94,7 +94,16 @@ PADROES_ALTA_PRIORIDADE = [
|
|
| 94 |
# PL 906: Impede menores em eventos LGBTQIA+ (verbos E substantivos)
|
| 95 |
r"(impede|proíbe|veda|proibição|vedação).*(presença|participação|acesso).*(menor|menores|criança|crianças).*(em|em eventos|nos eventos|de eventos|em paradas).*(da|da comunidade|lgbtqia|lgbt|comunidade|diversidade)",
|
| 96 |
r"(impede|proíbe|veda|proibição).*(menor|menores|criança|crianças).*(evento|parada|manifestação|atividade).*(lgbtqia|lgbt|comunidade)",
|
| 97 |
-
r"proibição.*(presença|da presença).*(menor|menores|criança|crianças).*(em|nos|de).*evento.*(da|da comunidade|lgbtqia|lgbt|comunidade)"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 98 |
]
|
| 99 |
|
| 100 |
# Padrões normais (menos específicos, mas ainda importantes)
|
|
@@ -106,7 +115,9 @@ PADROES_RESTRITIVOS = [
|
|
| 106 |
r"(restringe|limita|restrição).*participação.*(sexo|gênero)",
|
| 107 |
r"define.*entidade.*(homem|mulher)", # "Define entidade familiar como união entre homem e mulher"
|
| 108 |
r"(proíbe|proibição|impede|veda).*menor.*(evento|parada)", # Proíbe menores em eventos (genérico)
|
| 109 |
-
r"(proíbe|veda|proibição).*símbolo.*(religioso|parada|lgbt)" # Proíbe símbolos em paradas (genérico)
|
|
|
|
|
|
|
| 110 |
]
|
| 111 |
|
| 112 |
def carregar_modelos():
|
|
@@ -176,6 +187,12 @@ def extrair_keywords(texto: str) -> Tuple[int, int]:
|
|
| 176 |
desfavoraveis = sum(1 for kw in KEYWORDS_DESFAVORAVEIS
|
| 177 |
if re.search(kw, texto_lower, re.IGNORECASE))
|
| 178 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 179 |
return favoraveis, desfavoraveis
|
| 180 |
|
| 181 |
def detectar_padroes_restritivos(texto: str) -> float:
|
|
|
|
| 94 |
# PL 906: Impede menores em eventos LGBTQIA+ (verbos E substantivos)
|
| 95 |
r"(impede|proíbe|veda|proibição|vedação).*(presença|participação|acesso).*(menor|menores|criança|crianças).*(em|em eventos|nos eventos|de eventos|em paradas).*(da|da comunidade|lgbtqia|lgbt|comunidade|diversidade)",
|
| 96 |
r"(impede|proíbe|veda|proibição).*(menor|menores|criança|crianças).*(evento|parada|manifestação|atividade).*(lgbtqia|lgbt|comunidade)",
|
| 97 |
+
r"proibição.*(presença|da presença).*(menor|menores|criança|crianças).*(em|nos|de).*evento.*(da|da comunidade|lgbtqia|lgbt|comunidade)",
|
| 98 |
+
|
| 99 |
+
# PL 198/2023: Proibir linguagem neutra (NOVO)
|
| 100 |
+
r"(proíbe|proibir|veda|vedar|proibição|vedação).*(linguagem|uso|utilização).*(neutr|neutro|neutra)",
|
| 101 |
+
r"(proíbe|proibir|veda|vedar|proibição|vedação).*(linguagem neutra|pronome neutr|pronomes neutr)",
|
| 102 |
+
|
| 103 |
+
# PL 269/2023: Proibição de bloqueio puberal, cirurgias de redesignação (NOVO)
|
| 104 |
+
r"(proíbe|proibir|veda|vedar|proibição|vedação).*(bloqueio puberal|puberdade|hormônio|hormonal|cirurgia).*(trans|redesignação|transexual|transgênero|menor|menores|adolescent)",
|
| 105 |
+
r"(proíbe|proibir|proibição).*(terapia hormonal|cirurgia.*redesignação|redesignação sexual).*(menor|menores|criança)",
|
| 106 |
+
r"(proíbe|proibir|proibição).*(bloqueio.*puberal|hormonal).*processo transexualizador"
|
| 107 |
]
|
| 108 |
|
| 109 |
# Padrões normais (menos específicos, mas ainda importantes)
|
|
|
|
| 115 |
r"(restringe|limita|restrição).*participação.*(sexo|gênero)",
|
| 116 |
r"define.*entidade.*(homem|mulher)", # "Define entidade familiar como união entre homem e mulher"
|
| 117 |
r"(proíbe|proibição|impede|veda).*menor.*(evento|parada)", # Proíbe menores em eventos (genérico)
|
| 118 |
+
r"(proíbe|veda|proibição).*símbolo.*(religioso|parada|lgbt)", # Proíbe símbolos em paradas (genérico)
|
| 119 |
+
r"(proíbe|proibição).*linguagem", # Proíbe linguagem (genérico - pode pegar neutra)
|
| 120 |
+
r"(proíbe|proibição).*(bloqueio|hormônio|cirurgia).*(menor|adolescent)" # Restrições médicas para menores trans
|
| 121 |
]
|
| 122 |
|
| 123 |
def carregar_modelos():
|
|
|
|
| 187 |
desfavoraveis = sum(1 for kw in KEYWORDS_DESFAVORAVEIS
|
| 188 |
if re.search(kw, texto_lower, re.IGNORECASE))
|
| 189 |
|
| 190 |
+
# EXCEÇÃO: "Criminaliza terapias de conversão" é favorável, não desfavorável
|
| 191 |
+
# Se tem "criminaliza" + "terapia de conversão", reduzir contagem desfavorável
|
| 192 |
+
if re.search(r'criminaliza.*terapia.*conversão', texto_lower, re.IGNORECASE):
|
| 193 |
+
desfavoraveis = max(0, desfavoraveis - 1) # Remover "terapia de conversão" da contagem desfavorável
|
| 194 |
+
favoraveis += 1 # Adicionar como favorável
|
| 195 |
+
|
| 196 |
return favoraveis, desfavoraveis
|
| 197 |
|
| 198 |
def detectar_padroes_restritivos(texto: str) -> float:
|