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.
Files changed (46) hide show
  1. br_address_normalize-0.1.0/LICENSE +21 -0
  2. br_address_normalize-0.1.0/PKG-INFO +404 -0
  3. br_address_normalize-0.1.0/README.md +382 -0
  4. br_address_normalize-0.1.0/pyproject.toml +38 -0
  5. br_address_normalize-0.1.0/setup.cfg +4 -0
  6. br_address_normalize-0.1.0/src/address_normalizer/__init__.py +5 -0
  7. br_address_normalize-0.1.0/src/address_normalizer/core/__init__.py +1 -0
  8. br_address_normalize-0.1.0/src/address_normalizer/core/base.py +18 -0
  9. br_address_normalize-0.1.0/src/address_normalizer/data/__init__.py +139 -0
  10. br_address_normalize-0.1.0/src/address_normalizer/data/abbreviations_unified.json +332 -0
  11. br_address_normalize-0.1.0/src/address_normalizer/data/brasilia_prefixes.json +1 -0
  12. br_address_normalize-0.1.0/src/address_normalizer/data/null_markers.json +1 -0
  13. br_address_normalize-0.1.0/src/address_normalizer/data/whitelist.json +24 -0
  14. br_address_normalize-0.1.0/src/address_normalizer/facade.py +61 -0
  15. br_address_normalize-0.1.0/src/address_normalizer/modules/__init__.py +1 -0
  16. br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/__init__.py +0 -0
  17. br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/api_provider.py +175 -0
  18. br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/base.py +36 -0
  19. br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/deterministic.py +196 -0
  20. br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/entity_rules.py +33 -0
  21. br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/heuristics.py +28 -0
  22. br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/local_provider.py +69 -0
  23. br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/models.py +63 -0
  24. br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/orchestrator.py +287 -0
  25. br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/orchestrator_adapter.py +38 -0
  26. br_address_normalize-0.1.0/src/address_normalizer/modules/abbreviation/probabilistic.py +78 -0
  27. br_address_normalize-0.1.0/src/address_normalizer/modules/encoding.py +345 -0
  28. br_address_normalize-0.1.0/src/address_normalizer/modules/preprocessing.py +301 -0
  29. br_address_normalize-0.1.0/src/address_normalizer/modules/spelling/__init__.py +0 -0
  30. br_address_normalize-0.1.0/src/address_normalizer/modules/spelling/base.py +29 -0
  31. br_address_normalize-0.1.0/src/address_normalizer/modules/spelling/symspell_corrector.py +17 -0
  32. br_address_normalize-0.1.0/src/address_normalizer/pipeline/__init__.py +1 -0
  33. br_address_normalize-0.1.0/src/address_normalizer/pipeline/orchestrator.py +34 -0
  34. br_address_normalize-0.1.0/src/address_normalizer/pipeline/steps/__init__.py +1 -0
  35. br_address_normalize-0.1.0/src/address_normalizer/pipeline/steps/abbreviation.py +20 -0
  36. br_address_normalize-0.1.0/src/address_normalizer/pipeline/steps/encoding.py +19 -0
  37. br_address_normalize-0.1.0/src/address_normalizer/pipeline/steps/preprocessing.py +24 -0
  38. br_address_normalize-0.1.0/src/address_normalizer/pipeline/steps/spelling.py +18 -0
  39. br_address_normalize-0.1.0/src/address_normalizer/pipeline/steps/uppercase.py +30 -0
  40. br_address_normalize-0.1.0/src/address_normalizer/schemas/__init__.py +1 -0
  41. br_address_normalize-0.1.0/src/address_normalizer/schemas/endereco.py +26 -0
  42. br_address_normalize-0.1.0/src/br_address_normalize.egg-info/PKG-INFO +404 -0
  43. br_address_normalize-0.1.0/src/br_address_normalize.egg-info/SOURCES.txt +44 -0
  44. br_address_normalize-0.1.0/src/br_address_normalize.egg-info/dependency_links.txt +1 -0
  45. br_address_normalize-0.1.0/src/br_address_normalize.egg-info/requires.txt +4 -0
  46. 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.