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 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: