br-address-normalize 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- br_address_normalize-0.1.0/LICENSE +21 -0
- br_address_normalize-0.1.0/PKG-INFO +404 -0
- br_address_normalize-0.1.0/README.md +382 -0
- br_address_normalize-0.1.0/pyproject.toml +38 -0
- br_address_normalize-0.1.0/setup.cfg +4 -0
- br_address_normalize-0.1.0/src/address_normalizer/__init__.py +5 -0
- br_address_normalize-0.1.0/src/address_normalizer/core/__init__.py +1 -0
- br_address_normalize-0.1.0/src/address_normalizer/core/base.py +18 -0
- br_address_normalize-0.1.0/src/address_normalizer/data/__init__.py +139 -0
- br_address_normalize-0.1.0/src/address_normalizer/data/abbreviations_unified.json +332 -0
- br_address_normalize-0.1.0/src/address_normalizer/data/brasilia_prefixes.json +1 -0
- br_address_normalize-0.1.0/src/address_normalizer/data/null_markers.json +1 -0
- br_address_normalize-0.1.0/src/address_normalizer/data/whitelist.json +24 -0
- br_address_normalize-0.1.0/src/address_normalizer/facade.py +61 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/__init__.py +1 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/__init__.py +0 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/api_provider.py +175 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/base.py +36 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/deterministic.py +196 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/entity_rules.py +33 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/heuristics.py +28 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/local_provider.py +69 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/models.py +63 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/orchestrator.py +287 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/orchestrator_adapter.py +38 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/probabilistic.py +78 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/encoding.py +345 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/preprocessing.py +301 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/spelling/__init__.py +0 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/spelling/base.py +29 -0
- br_address_normalize-0.1.0/src/address_normalizer/modules/spelling/symspell_corrector.py +17 -0
- br_address_normalize-0.1.0/src/address_normalizer/pipeline/__init__.py +1 -0
- br_address_normalize-0.1.0/src/address_normalizer/pipeline/orchestrator.py +34 -0
- br_address_normalize-0.1.0/src/address_normalizer/pipeline/steps/__init__.py +1 -0
- br_address_normalize-0.1.0/src/address_normalizer/pipeline/steps/abbreviation.py +20 -0
- br_address_normalize-0.1.0/src/address_normalizer/pipeline/steps/encoding.py +19 -0
- br_address_normalize-0.1.0/src/address_normalizer/pipeline/steps/preprocessing.py +24 -0
- br_address_normalize-0.1.0/src/address_normalizer/pipeline/steps/spelling.py +18 -0
- br_address_normalize-0.1.0/src/address_normalizer/pipeline/steps/uppercase.py +30 -0
- br_address_normalize-0.1.0/src/address_normalizer/schemas/__init__.py +1 -0
- br_address_normalize-0.1.0/src/address_normalizer/schemas/endereco.py +26 -0
- br_address_normalize-0.1.0/src/br_address_normalize.egg-info/PKG-INFO +404 -0
- br_address_normalize-0.1.0/src/br_address_normalize.egg-info/SOURCES.txt +44 -0
- br_address_normalize-0.1.0/src/br_address_normalize.egg-info/dependency_links.txt +1 -0
- br_address_normalize-0.1.0/src/br_address_normalize.egg-info/requires.txt +4 -0
- br_address_normalize-0.1.0/src/br_address_normalize.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Inspire / F1 Qualidade
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: br-address-normalize
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Biblioteca de normalização de endereços brasileiros
|
|
5
|
+
Author: Inspire / F1 Qualidade
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/inspire-f1/br-address-normalize
|
|
8
|
+
Project-URL: Bug Tracker, https://github.com/inspire-f1/br-address-normalize/issues
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Natural Language :: Portuguese (Brazilian)
|
|
13
|
+
Classifier: Topic :: Text Processing :: Linguistic
|
|
14
|
+
Requires-Python: >=3.10
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
License-File: LICENSE
|
|
17
|
+
Requires-Dist: pydantic>=2.0.0
|
|
18
|
+
Requires-Dist: httpx>=0.24.0
|
|
19
|
+
Requires-Dist: redis>=5.0.0
|
|
20
|
+
Requires-Dist: symspellpy>=6.7.0
|
|
21
|
+
Dynamic: license-file
|
|
22
|
+
|
|
23
|
+
# Pipeline de Normalização de Endereços
|
|
24
|
+
|
|
25
|
+
Sistema de normalização de endereços brasileiros com expansão de abreviações, correção ortográfica e tratamento de encoding corrompido.
|
|
26
|
+
|
|
27
|
+
## Arquitetura Geral
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
+-----------------------------------------------------------------------------------+
|
|
31
|
+
| NormalizerFacade |
|
|
32
|
+
| |
|
|
33
|
+
| +----------+ +----------+ +-------------+ +-------------+ +--------------+ |
|
|
34
|
+
| |Uppercase |->| Encoding |->|Abbreviation |->|Preprocessing|->| Spelling | |
|
|
35
|
+
| | Step | | Step | | Step | | Step | | Step | |
|
|
36
|
+
| +----------+ +----------+ +-------------+ +-------------+ +--------------+ |
|
|
37
|
+
| |
|
|
38
|
+
+-----------------------------------------------------------------------------------+
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Fluxo de Processamento
|
|
42
|
+
|
|
43
|
+
O pipeline processa endereços em 5 etapas sequenciais. A ordem é crítica:
|
|
44
|
+
encoding é corrigido logo após o uppercase para que abreviações operem
|
|
45
|
+
sobre texto íntegro, e abreviações são expandidas antes da limpeza para
|
|
46
|
+
que a remoção de prefixo duplicado funcione corretamente.
|
|
47
|
+
|
|
48
|
+
### 1. UppercaseStep
|
|
49
|
+
|
|
50
|
+
Converte todos os campos de texto para UPPERCASE. Executado primeiro para
|
|
51
|
+
garantir que tokens sejam identificados corretamente nas etapas seguintes.
|
|
52
|
+
|
|
53
|
+
**Campos processados:** `logradouro`, `numero`, `complemento`, `bairro`, `municipio`, `uf`
|
|
54
|
+
|
|
55
|
+
**Arquivo:** `src/pipeline/steps/uppercase.py`
|
|
56
|
+
|
|
57
|
+
### 2. EncodingStep (Correção de Encoding)
|
|
58
|
+
|
|
59
|
+
Corrige nomes corrompidos por conversão ISO-8859-1 → ASCII. Executado antes
|
|
60
|
+
das abreviações para que o texto esteja íntegro na hora da expansão.
|
|
61
|
+
|
|
62
|
+
**Exemplos de correção:**
|
|
63
|
+
- `ANT NIO` → `ANTÔNIO`
|
|
64
|
+
- `JOO` → `JOÃO`
|
|
65
|
+
- `CORA OES` → `CORAÇÕES`
|
|
66
|
+
- `GET LIO` → `GETÚLIO`
|
|
67
|
+
|
|
68
|
+
**Campos processados:** `logradouro`, `complemento`, `bairro`
|
|
69
|
+
|
|
70
|
+
**Arquivo:** `src/modules/encoding.py`
|
|
71
|
+
|
|
72
|
+
### 3. AbbreviationStep (Expansão de Abreviações)
|
|
73
|
+
|
|
74
|
+
Expande abreviações usando o provider configurado (local, API ou orchestrator).
|
|
75
|
+
Executado antes da limpeza para que tipos expandidos sejam reconhecidos
|
|
76
|
+
na remoção de prefixo duplicado (ex: `R RUA SILVA` → `RUA RUA SILVA` → `RUA SILVA`).
|
|
77
|
+
|
|
78
|
+
**Campos processados:** `logradouro`, `complemento`, `bairro`
|
|
79
|
+
|
|
80
|
+
**Arquitetura L1/L2:**
|
|
81
|
+
- **L1 (Determinística):** Regras hardcoded com confiança 100%
|
|
82
|
+
- **L2 (Probabilística):** Fallback opcional via API externa
|
|
83
|
+
|
|
84
|
+
**Arquivo principal:** `src/modules/abbreviation/orchestrator.py`
|
|
85
|
+
|
|
86
|
+
### 4. PreprocessingStep (Limpeza)
|
|
87
|
+
|
|
88
|
+
Normaliza e limpa dados brutos.
|
|
89
|
+
|
|
90
|
+
**Operações (em ordem):**
|
|
91
|
+
1. Remoção de placeholders (`LOGRADOURO`, `ENDERECO`, `INDEFINIDO`)
|
|
92
|
+
2. Remoção de prefixos duplicados (`RUA RUA` → `RUA`)
|
|
93
|
+
3. Remoção de códigos numéricos no início
|
|
94
|
+
4. Separação de número colado no logradouro
|
|
95
|
+
5. Normalização de CEP (com detecção de inválidos)
|
|
96
|
+
6. Normalização de UF (2 caracteres)
|
|
97
|
+
|
|
98
|
+
**Campos processados:** todos
|
|
99
|
+
|
|
100
|
+
**Arquivo:** `src/modules/preprocessing.py`
|
|
101
|
+
|
|
102
|
+
#### Normalização de CEP
|
|
103
|
+
|
|
104
|
+
O CEP passa por 3 etapas:
|
|
105
|
+
|
|
106
|
+
**1. Limpeza:** Remove absolutamente tudo que não for dígito.
|
|
107
|
+
|
|
108
|
+
**2. Padding/Ajuste:**
|
|
109
|
+
| Tamanho | Ação | Motivo |
|
|
110
|
+
|---------|------|--------|
|
|
111
|
+
| 8 dígitos | Mantém | CEP íntegro |
|
|
112
|
+
| 7 dígitos | Adiciona `0` à esquerda | Perda de formatação Excel |
|
|
113
|
+
| 9 dígitos começando com `0` | Remove primeiro `0` | Exportação errônea (080010-000) |
|
|
114
|
+
| Outros | Mantém + flag `cep_invalido=True` | CEP incorreto |
|
|
115
|
+
|
|
116
|
+
**3. Filtro de Lixo:**
|
|
117
|
+
CEPs que passam na contagem mas são falsos:
|
|
118
|
+
- Sequências repetidas: `00000000`, `11111111`, ..., `99999999`
|
|
119
|
+
- Sequências óbvias: `12345678`, `87654321`
|
|
120
|
+
|
|
121
|
+
Quando detectado, o campo `cep_invalido` é setado como `True` no resultado.
|
|
122
|
+
|
|
123
|
+
### 5. SpellingStep (Correção Ortográfica)
|
|
124
|
+
|
|
125
|
+
Corrige erros ortográficos em nomes próprios.
|
|
126
|
+
|
|
127
|
+
**Campos processados:** `logradouro`, `bairro`, `municipio`
|
|
128
|
+
|
|
129
|
+
**Arquivo:** `src/modules/spelling/`
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Sistema de Abreviações (Detalhado)
|
|
134
|
+
|
|
135
|
+
### Camada L1 — Gates de Decisão
|
|
136
|
+
|
|
137
|
+
O motor determinístico processa tokens através de 8 gates em ordem:
|
|
138
|
+
|
|
139
|
+
| Gate | Nome | Descrição | Ação |
|
|
140
|
+
|------|------|-----------|------|
|
|
141
|
+
| 1 | TOKENS_TO_REMOVE_FIELD | `ND`, `NINF` | Nulifica campo inteiro |
|
|
142
|
+
| 1.5 | SIGLA_SISTEMA | `NI`, `END` | Expande + flag para consumidor |
|
|
143
|
+
| 2 | DO_NOT_EXPAND | Siglas de órgãos | Preserva sem tocar |
|
|
144
|
+
| 3 | BCO | Ambiguidade BECO/BANCO | Resolução posicional |
|
|
145
|
+
| 4 | PENDING_SAMPLE | Tokens em análise | Preserva + flag |
|
|
146
|
+
| 5 | POSITIONAL_AMBIGUOUS | `CD`, `CM`, `PA`, `LG`, `GL`, `BX` | Resolução contextual |
|
|
147
|
+
| 6 | Dicionários por Categoria | Ver tabela abaixo | Expansão por campo |
|
|
148
|
+
| 7 | Dicionário Geral | Injetado/configurado | Fallback |
|
|
149
|
+
| 8 | SIGLA+dígito | Padrão `ABC123` | Flag código interno |
|
|
150
|
+
|
|
151
|
+
**Arquivo:** `src/modules/abbreviation/deterministic.py`
|
|
152
|
+
|
|
153
|
+
### Dicionários por Categoria
|
|
154
|
+
|
|
155
|
+
| Dicionário | Campos Aplicáveis | Posições |
|
|
156
|
+
|------------|-------------------|----------|
|
|
157
|
+
| TIPO_LOGRADOURO | logradouro, bairro | 0-1 (logradouro), qualquer (bairro) |
|
|
158
|
+
| TITULO_PROPRIO | logradouro, bairro | qualquer |
|
|
159
|
+
| MUNICIPIO_SAFE | municipio | qualquer |
|
|
160
|
+
| COMPLEMENTO | complemento | qualquer |
|
|
161
|
+
|
|
162
|
+
**Arquivo de regras:** `src/modules/abbreviation/entity_rules.py`
|
|
163
|
+
|
|
164
|
+
### Resolução de Ambiguidades
|
|
165
|
+
|
|
166
|
+
**BCO (Beco vs Banco):**
|
|
167
|
+
- Posição 0 em logradouro → `BECO`
|
|
168
|
+
- Outras posições → `BANCO`
|
|
169
|
+
|
|
170
|
+
**PA (Passagem vs Projeto de Assentamento):**
|
|
171
|
+
- Em logradouro → `PASSAGEM`
|
|
172
|
+
- Em complemento com `zona_rural=True` → `PROJETO DE ASSENTAMENTO`
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Arquivos de Dados
|
|
177
|
+
|
|
178
|
+
Todos os dicionários de abreviações ficam centralizados em `src/data/` para fácil manutenção:
|
|
179
|
+
|
|
180
|
+
| Arquivo | Descrição |
|
|
181
|
+
|---------|-----------|
|
|
182
|
+
| `abbreviations.json` | Dicionário geral (LocalProvider, ApiProvider) |
|
|
183
|
+
| `complement_expansions.json` | Expansões específicas de complemento |
|
|
184
|
+
| `null_markers.json` | Marcadores de campo vazio/nulo |
|
|
185
|
+
| `brasilia_prefixes.json` | Prefixos de Brasília para expansão contextual |
|
|
186
|
+
| `whitelist.json` | Nomes que não devem ser alterados pelo corretor |
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Abreviações Implementadas
|
|
191
|
+
|
|
192
|
+
### Tipos de Logradouro
|
|
193
|
+
|
|
194
|
+
| Sigla | Expansão |
|
|
195
|
+
|-------|----------|
|
|
196
|
+
| R | Rua |
|
|
197
|
+
| AV | Avenida |
|
|
198
|
+
| TV, TRA | Travessa |
|
|
199
|
+
| RD, ROD | Rodovia |
|
|
200
|
+
| AL | Alameda |
|
|
201
|
+
| RM, RAM | Ramal |
|
|
202
|
+
| ET, ESTR | Estrada |
|
|
203
|
+
| PCA | Praça |
|
|
204
|
+
| BEC, BCO | Beco |
|
|
205
|
+
| PSG | Passagem |
|
|
206
|
+
| VIL, VLA | Vila |
|
|
207
|
+
| CGO, CRG | Córrego |
|
|
208
|
+
| FZ | Fazenda |
|
|
209
|
+
| IG | Igarapé |
|
|
210
|
+
| JRD | Jardim |
|
|
211
|
+
| CHAC | Chácara |
|
|
212
|
+
| DIST | Distrito |
|
|
213
|
+
| LG | Largo |
|
|
214
|
+
| PQ, PARQ, PQE | Parque |
|
|
215
|
+
| COND | Condomínio |
|
|
216
|
+
| CONJ | Conjunto |
|
|
217
|
+
| BALN | Balneário |
|
|
218
|
+
| UNIV | Universidade |
|
|
219
|
+
| ST | Setor |
|
|
220
|
+
| QD | Quadra |
|
|
221
|
+
| VC | Vicinal |
|
|
222
|
+
| LIN, LI | Linha |
|
|
223
|
+
|
|
224
|
+
### Títulos e Tratamentos
|
|
225
|
+
|
|
226
|
+
| Sigla | Expansão |
|
|
227
|
+
|-------|----------|
|
|
228
|
+
| PRES | Presidente |
|
|
229
|
+
| GEN | General |
|
|
230
|
+
| MAL | Marechal |
|
|
231
|
+
| CAP | Capitão |
|
|
232
|
+
| CEL | Coronel |
|
|
233
|
+
| DR | Doutor |
|
|
234
|
+
| PE | Padre |
|
|
235
|
+
| PROF, PRF | Professor |
|
|
236
|
+
| VER | Vereador |
|
|
237
|
+
| SEN | Senador |
|
|
238
|
+
| DEP | Deputado |
|
|
239
|
+
| GOV | Governador |
|
|
240
|
+
| PREF | Prefeito |
|
|
241
|
+
| DES | Desembargador |
|
|
242
|
+
| DQ | Duque |
|
|
243
|
+
| MARQ | Marquês |
|
|
244
|
+
| CDE | Conde |
|
|
245
|
+
| CDR, CDOR | Comendador |
|
|
246
|
+
| DNA | Dona |
|
|
247
|
+
| FCO | Francisco |
|
|
248
|
+
| JOS | José |
|
|
249
|
+
| JORN | Jornalista |
|
|
250
|
+
| MNS | Monsenhor |
|
|
251
|
+
| NS | Nossa Senhora |
|
|
252
|
+
| NSA | Nossa Senhora Aparecida |
|
|
253
|
+
| NSRA | Nossa Senhora |
|
|
254
|
+
| JK | Juscelino Kubitschek |
|
|
255
|
+
| JR | Júnior |
|
|
256
|
+
| FREI | Frei |
|
|
257
|
+
| STA | Santa |
|
|
258
|
+
| STO | Santo |
|
|
259
|
+
|
|
260
|
+
### Complemento
|
|
261
|
+
|
|
262
|
+
| Sigla | Expansão |
|
|
263
|
+
|-------|----------|
|
|
264
|
+
| APTO, APT | Apartamento |
|
|
265
|
+
| BL, BLC | Bloco |
|
|
266
|
+
| QD, QDA | Quadra |
|
|
267
|
+
| LT | Lote |
|
|
268
|
+
| SL | Sala |
|
|
269
|
+
| LJ | Loja |
|
|
270
|
+
| AND | Andar |
|
|
271
|
+
| COND | Condomínio |
|
|
272
|
+
| CONJ | Conjunto |
|
|
273
|
+
| EDIF | Edifício |
|
|
274
|
+
| FD, FUND | Fundos |
|
|
275
|
+
| FR | Frente |
|
|
276
|
+
| KIT | Kitnet |
|
|
277
|
+
| MOD | Módulo |
|
|
278
|
+
| NR | Número |
|
|
279
|
+
| PV | Pavimento |
|
|
280
|
+
| PROX, PX | Próximo |
|
|
281
|
+
| SOB | Sobrado |
|
|
282
|
+
| SS | Subsolo |
|
|
283
|
+
| ST | Setor |
|
|
284
|
+
| BX | Box |
|
|
285
|
+
| KM | Quilômetro |
|
|
286
|
+
|
|
287
|
+
### Siglas de Órgãos (Preservadas)
|
|
288
|
+
|
|
289
|
+
Estas siglas são preservadas sem expansão:
|
|
290
|
+
|
|
291
|
+
`ABC`, `CEEE`, `CTG`, `DAER`, `DNER`, `IBGE`, `PTB`, `SESI`, `SHIS`, `DF`, `KVA`
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## Uso do Pipeline
|
|
296
|
+
|
|
297
|
+
```python
|
|
298
|
+
from address_normalizer.facade import NormalizerFacade
|
|
299
|
+
from address_normalizer.modules.abbreviation.local_provider import LocalAbbreviationProvider
|
|
300
|
+
from address_normalizer.modules.spelling.symspell_corrector import SymSpellCorrector
|
|
301
|
+
|
|
302
|
+
# Inicializar providers
|
|
303
|
+
abbreviation_provider = LocalAbbreviationProvider()
|
|
304
|
+
spelling_corrector = SymSpellCorrector()
|
|
305
|
+
|
|
306
|
+
# Criar facade
|
|
307
|
+
normalizer = NormalizerFacade(
|
|
308
|
+
abbreviation_provider=abbreviation_provider,
|
|
309
|
+
spelling_corrector=spelling_corrector,
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
# Normalizar endereço
|
|
313
|
+
endereco = {
|
|
314
|
+
"logradouro": "R DR JOAO SILVA",
|
|
315
|
+
"numero": "123",
|
|
316
|
+
"complemento": "APTO 45",
|
|
317
|
+
"bairro": "JRD AMERICA",
|
|
318
|
+
"municipio": "SAO PAULO",
|
|
319
|
+
"uf": "SP",
|
|
320
|
+
"cep": "01234567",
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
result = await normalizer.normalize(endereco)
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Parâmetros de Configuração
|
|
329
|
+
|
|
330
|
+
### ExpanderConfig
|
|
331
|
+
|
|
332
|
+
| Parâmetro | Tipo | Default | Descrição |
|
|
333
|
+
|-----------|------|---------|-----------|
|
|
334
|
+
| use_default_dictionaries | bool | True | Carrega dicionários padrão |
|
|
335
|
+
| custom_general_dict | dict | {} | Dicionário adicional customizado |
|
|
336
|
+
| preserve_unknown_codes | bool | True | Preserva códigos internos (ABC123) |
|
|
337
|
+
| l2_caller | Callable | None | Função async para L2 probabilístico |
|
|
338
|
+
| min_l2_confidence | float | 0.85 | Confiança mínima para aceitar L2 |
|
|
339
|
+
| nullify_sistema_siglas | bool | False | Nulifica siglas de sistema (NI, END) |
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## Estrutura de Diretórios
|
|
344
|
+
|
|
345
|
+
```
|
|
346
|
+
src/
|
|
347
|
+
├── core/
|
|
348
|
+
│ └── base.py # Interface PipelineStep
|
|
349
|
+
├── data/
|
|
350
|
+
│ ├── __init__.py # Funções de carregamento de dados
|
|
351
|
+
│ ├── abbreviations.json # Dicionário geral de abreviações
|
|
352
|
+
│ ├── complement_expansions.json # Expansões de complemento
|
|
353
|
+
│ ├── null_markers.json # Marcadores nulos
|
|
354
|
+
│ ├── brasilia_prefixes.json # Prefixos de Brasília
|
|
355
|
+
│ └── whitelist.json # Whitelist ortográfica
|
|
356
|
+
├── facade.py # Fachada pública do módulo
|
|
357
|
+
├── modules/
|
|
358
|
+
│ ├── abbreviation/
|
|
359
|
+
│ │ ├── base.py # Interface AbbreviationProvider
|
|
360
|
+
│ │ ├── api_provider.py # Provider via API externa
|
|
361
|
+
│ │ ├── local_provider.py # Provider via JSON local
|
|
362
|
+
│ │ ├── orchestrator.py # Orquestrador L1/L2
|
|
363
|
+
│ │ ├── orchestrator_adapter.py # Adapter para interface Provider
|
|
364
|
+
│ │ ├── deterministic.py # Camada L1 determinística
|
|
365
|
+
│ │ ├── entity_rules.py # Regras por campo
|
|
366
|
+
│ │ ├── heuristics.py # Heurísticas de confiança L2
|
|
367
|
+
│ │ ├── models.py # Dataclasses do módulo
|
|
368
|
+
│ │ └── complement_expander.py # Expansor específico de complemento
|
|
369
|
+
│ ├── encoding.py # Correção de encoding corrompido
|
|
370
|
+
│ ├── preprocessing.py # Limpeza e normalização
|
|
371
|
+
│ └── spelling/
|
|
372
|
+
│ ├── base.py # Interface SpellingCorrector
|
|
373
|
+
│ └── symspell_corrector.py # Implementação SymSpell
|
|
374
|
+
├── pipeline/
|
|
375
|
+
│ ├── orchestrator.py # Pipeline principal
|
|
376
|
+
│ └── steps/
|
|
377
|
+
│ ├── uppercase.py # Step de uppercase
|
|
378
|
+
│ ├── encoding.py # Step de encoding
|
|
379
|
+
│ ├── abbreviation.py # Step de abreviações
|
|
380
|
+
│ ├── preprocessing.py # Step de limpeza
|
|
381
|
+
│ └── spelling.py # Step de ortografia
|
|
382
|
+
└── schemas/
|
|
383
|
+
└── endereco.py # Schemas Pydantic/dataclass
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## Notas de Implementação
|
|
389
|
+
|
|
390
|
+
1. **Ordem do Pipeline:** Uppercase → Encoding → Abreviações → Limpeza → Ortografia. Encoding vem antes de abreviações para que o texto esteja íntegro. Abreviações vêm antes da limpeza para que `R RUA` seja expandido para `RUA RUA` e depois deduplicado.
|
|
391
|
+
|
|
392
|
+
2. **Ordem dos Gates:** A ordem dos gates no `DeterministicLayer` é crítica. Gates anteriores têm prioridade sobre posteriores.
|
|
393
|
+
|
|
394
|
+
3. **Resolução Posicional:** Tokens como `BCO`, `PA`, `BX` têm significados diferentes dependendo do campo e posição.
|
|
395
|
+
|
|
396
|
+
4. **L2 Probabilístico:** Só é acionado para posição 0 do logradouro e requer `l2_caller` configurado.
|
|
397
|
+
|
|
398
|
+
5. **Encoding:** O módulo de encoding usa regex ordenadas por especificidade (mais longas primeiro).
|
|
399
|
+
|
|
400
|
+
6. **Whitelist:** Nomes na whitelist não são alterados pelo corretor ortográfico.
|
|
401
|
+
|
|
402
|
+
7. **Conflitos Conhecidos:**
|
|
403
|
+
- `PRF`: No sistema = Professor. Na lista de referência = Polícia Rodoviária Federal. Mantido como Professor por ser mais comum em endereços.
|
|
404
|
+
- `PA`: Tratado como PASSAGEM em logradouro, PROJETO DE ASSENTAMENTO em complemento rural.
|