Skip to main content

address-normalizer

Небольшой офлайн-парсер российских адресов для Python 3.10+. Извлекает поля, сохраняет исходные подстроки и смещения, не требует runtime-зависимостей.

English README

Установка

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

address_normalizer-2.0.0.tar.gz (44.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

address_normalizer-2.0.0-py3-none-any.whl (40.8 kB view details)

Uploaded Python 3

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

Hashes for address_normalizer-2.0.0.tar.gz
Algorithm Hash digest
SHA256 f6f847540c7f8cf1ceae33f00385a47962eda9fe136633eb3668564a8fee3680
MD5 9ff8c1e204fd66cdaf1925707c4d83c0
BLAKE2b-256 1df3605da2b578b4af7dbfc57f654c7d87620e661434f74311b1700b031f3460

See more details on using hashes here.

Provenance

The following attestation bundles were made for address_normalizer-2.0.0.tar.gz:

Publisher: release.yml on shigabeev/address-normalizer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file address_normalizer-2.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for address_normalizer-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d258cba4cac728f26eb16a6e3e2647d95a48bba9af69d0fe673b90a2a0bb5829
MD5 2ae465bc858cc86897c6b66247c10d96
BLAKE2b-256 9ef0c03c4a9ea8615e60737bea31e07425a3df35effcef3fd5158ea47a9d5e3b

See more details on using hashes here.

Provenance

The following attestation bundles were made for address_normalizer-2.0.0-py3-none-any.whl:

Publisher: release.yml on shigabeev/address-normalizer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page