address-normalizer
Небольшой офлайн-парсер российских адресов для Python 3.10+. Извлекает поля, сохраняет исходные подстроки и смещения, не требует runtime-зависимостей.
Установка
python -m pip install address-normalizer
Использование
from address_normalizer import parse
result = parse("г. Москва, ул. Тверская, д. 4, кв. 12")
print(result.city.value) # Москва
print(result.street.value) # Тверская
print(result.house_num.value) # 4
print(result.apartment.value) # 12
print(result.normalized) # Москва, ул Тверская, д 4, кв 12
Каждый компонент содержит value, точную исходную подстроку raw, полуоткрытый
интервал start:end, источник решения и confidence. Весь результат можно
сериализовать:
payload = result.as_dict() # обычный JSON-совместимый dict
Неоднозначность не скрывается:
result = parse("Ополченская 5-30")
print(result.normalized) # Ополченская, д 5, кв 30
print(result.warnings) # ("ambiguous_numeric_tail",)
print(result.alternatives) # среди вариантов есть дом 5-30
confidence — сила решения внутри парсера, а не вероятность существования
адреса. Результаты с warnings, alternatives или unparsed стоит проверять.
Поиск адреса в сообщении
from address_normalizer import detect_addresses
message = "Доставить по адресу: Москва, ул. Тверская, д. 13. Позвоните."
for item in detect_addresses(message):
print(item.text) # Москва, ул. Тверская, д. 13
print(item.span) # смещение в исходном сообщении
print(item.parsed) # ParsedAddress
Детектор консервативный: лучше пропустить слабый кандидат, чем принять номер заказа или дату за адрес.
Несколько адресов и CLI
from address_normalizer import parse_many
results = parse_many(["Тверская 1", "Невский проспект 10"])
address-normalizer "СПб, Невский проспект 10, корп. 2"
printf '%s\n' "Тверская 1" "Ополченская 5-30" |
address-normalizer --jsonl
Граница ответственности
Библиотека извлекает:
- индекс, регион, район, город и населённый пункт;
- улицу и тип улицы;
- дом, корпус, строение и квартиру;
- исходные смещения, неразобранный остаток, предупреждения и альтернативы.
Она не проверяет адрес по ФИАС/ГАР, не возвращает ID реестра, не исправляет официальное написание и не геокодирует. После парсинга передайте поля в свой актуальный resolver ФИАС/ГАР.
Как это работает
Runtime — простой гибрид: токенизатор со смещениями, правила адресных маркеров и чисел, компактный линейный sequence tagger для слов без маркеров, затем детерминированная постобработка. Это не LLM и не нейросеть. Модель занимает 37 КБ; сетевых запросов и скрытых загрузок нет.
Качество
Одна цифра «accuracy» здесь вводит в заблуждение, поэтому разные наборы публикуются отдельно:
| Набор | Размер | Метрика | Результат |
|---|---|---|---|
| Историческая адресная выборка | 500 | exact component micro F1 | 95,9% |
| Шумные адресные фрагменты | 578 | span-overlap F1 | 58,7% |
| Чистые адреса по России | 100 000 | character-overlap F1 | 66,2% |
| Здания Москвы | 15 196 | exact component micro F1 | 85,4% |
Подробные определения, результаты по полям и все 500 строк с причинами ошибок:
benchmarks/README.md.
Сильные поля — дом, корпус и строение. Слабее — административные уровни, точная граница улицы, редкие сокращения и числовые хвосты без маркеров.
Разработка
python -m pip install -e .
python -m pip install pytest
pytest
python tools/benchmark.py --check
Публичный API находится в src/address_normalizer, основные проверки — в
tests, воспроизводимый набор ошибок — в benchmarks.
Лицензия
GNU GPL v3.0 only. Полный текст — в
LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file address_normalizer-2.0.0.tar.gz.
File metadata
- Download URL: address_normalizer-2.0.0.tar.gz
- Upload date:
- Size: 44.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6f847540c7f8cf1ceae33f00385a47962eda9fe136633eb3668564a8fee3680
|
|
| MD5 |
9ff8c1e204fd66cdaf1925707c4d83c0
|
|
| BLAKE2b-256 |
1df3605da2b578b4af7dbfc57f654c7d87620e661434f74311b1700b031f3460
|
Provenance
The following attestation bundles were made for address_normalizer-2.0.0.tar.gz:
Publisher:
release.yml on shigabeev/address-normalizer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
address_normalizer-2.0.0.tar.gz -
Subject digest:
f6f847540c7f8cf1ceae33f00385a47962eda9fe136633eb3668564a8fee3680 - Sigstore transparency entry: 2280347783
- Sigstore integration time:
-
Permalink:
shigabeev/address-normalizer@444cb6c9db3c84c56f450a0e6d9f980e94f5fd39 -
Branch / Tag:
refs/tags/v2.0.0 - Owner: https://github.com/shigabeev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@444cb6c9db3c84c56f450a0e6d9f980e94f5fd39 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file address_normalizer-2.0.0-py3-none-any.whl.
File metadata
- Download URL: address_normalizer-2.0.0-py3-none-any.whl
- Upload date:
- Size: 40.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d258cba4cac728f26eb16a6e3e2647d95a48bba9af69d0fe673b90a2a0bb5829
|
|
| MD5 |
2ae465bc858cc86897c6b66247c10d96
|
|
| BLAKE2b-256 |
9ef0c03c4a9ea8615e60737bea31e07425a3df35effcef3fd5158ea47a9d5e3b
|
Provenance
The following attestation bundles were made for address_normalizer-2.0.0-py3-none-any.whl:
Publisher:
release.yml on shigabeev/address-normalizer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
address_normalizer-2.0.0-py3-none-any.whl -
Subject digest:
d258cba4cac728f26eb16a6e3e2647d95a48bba9af69d0fe673b90a2a0bb5829 - Sigstore transparency entry: 2280347791
- Sigstore integration time:
-
Permalink:
shigabeev/address-normalizer@444cb6c9db3c84c56f450a0e6d9f980e94f5fd39 -
Branch / Tag:
refs/tags/v2.0.0 - Owner: https://github.com/shigabeev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@444cb6c9db3c84c56f450a0e6d9f980e94f5fd39 -
Trigger Event:
workflow_dispatch
-
Statement type: