Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

address-normalizer

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

English README

Установка

python -m pip install --pre 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.0a2.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.0a2-py3-none-any.whl (40.9 kB view details)

Uploaded Python 3

File details

Details for the file address_normalizer-2.0.0a2.tar.gz.

File metadata

  • Download URL: address_normalizer-2.0.0a2.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.0a2.tar.gz
Algorithm Hash digest
SHA256 6c543bc1c74e94e29d00444af1e05428646acf15787b8ad489e7a9409a56b034
MD5 f3c070f7d366089b74fc58f2315fc8a7
BLAKE2b-256 b489f2aeded9726dcc4c65d69b3f2be1e992abf7897f351fd6e051e5353a5baa

See more details on using hashes here.

Provenance

The following attestation bundles were made for address_normalizer-2.0.0a2.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.0a2-py3-none-any.whl.

File metadata

File hashes

Hashes for address_normalizer-2.0.0a2-py3-none-any.whl
Algorithm Hash digest
SHA256 f5408c66b3906f4604a7be4e0b4b04c275e9d9b7ca048d4716ff591e4db03d5a
MD5 476538a91cd69496962fc022bc249eb1
BLAKE2b-256 4a6e5a451615b0de4884a05917231492477733f5b470d15abe1a6dc1f7c787f8

See more details on using hashes here.

Provenance

The following attestation bundles were made for address_normalizer-2.0.0a2-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