Позволяет стандартизировать адреса, напечатанные от руки, и находить их соответствия в ФИАС. Поиск предлагает варианты адреса с ошибкой/отсутствием до 2 знаков, связано это с ограничениями elastic'а.
- 60Гб дискового пространства
- Python 3 + pandas, simpledbf и elasticsearch
- Elasticsearch 7+
- Полная БД ФИАС в формате dbf (https://fias.nalog.ru/Updates.aspx)
-
Скачать ФИАС (https://fias.nalog.ru/Updates.aspx) и распаковать
-
Запустить elastic и kibana
docker-compose up
- Установить зависимости
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
- Загрузить ФИАС в elasticsearch. Это обычно занимает около 9 часов.
python upload_fias.py --fiasdir ~/fias/fias_csv/ --remove
- Теперь можно пользоваться методами из 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)
Задача: разбить одно поле (адреса) на несколько полей, таких как дом, улица, город итд Так как все адреса принципиально не отличаются друг от друга, то набор этих полей уже заранее известен. Порядок их в строке может незначительно меняться, но обычно он один и тот же: Индекс, город, улица, дом, корпус, квартира. Каждое из этих полей заполняется совершенно разными значениями, которые практически никогда не пересекаются, поэтому словарный подход здесь будет как никогда актуален. Вся идея свести задачу извлечения полей к задаче поиска адреса в базе данных. При этом некоторые поля, такие как адрес и номер дома гораздо более надёжно извлекать эвристически, нежели поиском.
Извлечение адресов происходит в следующие этапы:
- Детекция полей по шаблону
- Извлечение индекса
- Извлечение номера дома/корпуса
- Определение границ названия улицы/города
- Поиск улицы и города в БД ФИАС
- Поиск дома и корпуса для данной улицы в ФИАС
- api.py - методы для непосредственно использования проекта
- upload_fias.py - для первоначальной загрузки файлов в fias
- parsing.py - все методы для предобработки адреса, работают с самим текстом.
- tests.py - проверка качества
- ref/references.xlsx - референсная выборка для оценки качества
Если вы делаете форк проекта, я буду очень рад дополнить проект вашими изменениями. Присылайте pull-requests! Как оказалось, этот проект часто пригождается разным командам.
В данный момент требуется помощь с
- Сообщением о случаях, где стандартизация не работает и предложению вариантов по избавлению от этого.
- Сокращением memory footprint. Распакованный ФИАС весит около 50Гб, а индексы на elastic весят порой больше 100Гб.
- Рефакторингом кода и изменению его по канонам ООП.
- Упрощением развёртывания проекта.