shigabeev / address-normalizer

Ищет выбранный адрес в ФИАС

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Open Address Parser

Позволяет стандартизировать адреса, напечатанные от руки, и находить их соответствия в ФИАС. Поиск предлагает варианты адреса с ошибкой/отсутствием до 2 знаков, связано это с ограничениями elastic'а.

Требования для реализации

  1. 60Гб дискового пространства
  2. Python 3 + pandas, simpledbf и elasticsearch
  3. Elasticsearch 7+
  4. Полная БД ФИАС в формате dbf (https://fias.nalog.ru/Updates.aspx)

Установка

  1. Скачать ФИАС (https://fias.nalog.ru/Updates.aspx) и распаковать

  2. Запустить elastic и kibana

docker-compose up
  1. Установить зависимости
pip install -r requirements.txt

pip install --upgrade tables
pip install Flask-SQLAlchemy
source python_env/bin/activate
/etc/sysctl.conf
vm.max_map_count=262144
sudo sysctl -p
  1. Загрузить ФИАС в elasticsearch. Это обычно занимает около 9 часов.
python upload_fias.py --fiasdir ~/fias/fias_csv/ --remove
  1. Теперь можно пользоваться методами из api.py. Главный метод там — standardize(string) и get_addr([string])
import api

addr = "г. Москва, ул. Тверская, д.4"
list_of_addrs = ["г. Москва, ул. Тверская, д.4", "Москва, Коровий вал 3"]

norm_addr = api.standardize(addr)
list_norm_addrs = api.get_addr(list_of_addrs)

Принцип работы

Задача: разбить одно поле (адреса) на несколько полей, таких как дом, улица, город итд Так как все адреса принципиально не отличаются друг от друга, то набор этих полей уже заранее известен. Порядок их в строке может незначительно меняться, но обычно он один и тот же: Индекс, город, улица, дом, корпус, квартира. Каждое из этих полей заполняется совершенно разными значениями, которые практически никогда не пересекаются, поэтому словарный подход здесь будет как никогда актуален. Вся идея свести задачу извлечения полей к задаче поиска адреса в базе данных. При этом некоторые поля, такие как адрес и номер дома гораздо более надёжно извлекать эвристически, нежели поиском.

Извлечение адресов происходит в следующие этапы:

  1. Детекция полей по шаблону
    • Извлечение индекса
    • Извлечение номера дома/корпуса
  2. Определение границ названия улицы/города
  3. Поиск улицы и города в БД ФИАС
  4. Поиск дома и корпуса для данной улицы в ФИАС

Структура проекта

  • api.py - методы для непосредственно использования проекта
  • upload_fias.py - для первоначальной загрузки файлов в fias
  • parsing.py - все методы для предобработки адреса, работают с самим текстом.
  • tests.py - проверка качества
  • ref/references.xlsx - референсная выборка для оценки качества

Помощь проекту

Если вы делаете форк проекта, я буду очень рад дополнить проект вашими изменениями. Присылайте pull-requests! Как оказалось, этот проект часто пригождается разным командам.

В данный момент требуется помощь с

  1. Сообщением о случаях, где стандартизация не работает и предложению вариантов по избавлению от этого.
  2. Сокращением memory footprint. Распакованный ФИАС весит около 50Гб, а индексы на elastic весят порой больше 100Гб.
  3. Рефакторингом кода и изменению его по канонам ООП.
  4. Упрощением развёртывания проекта.

About

Ищет выбранный адрес в ФИАС


Languages

Language:Python 100.0%