Skip to content

Неточный поиск адреса в ФИАС

Notifications You must be signed in to change notification settings

oZeDo/address-segmenter

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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
  1. Загрузить ФИАС в elasticsearch. Это обычно занимает около 9 часов.
python upload_fias.py --fiasdir Path/to/extracted/fias --delete
  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. Упрощением разворачивания проекта. Скорее всего нужно переместить elasticsearch на внешний сервер и не разворачивать его локально.
  2. Улучшением качества выдачи самим elastic.
  3. Сокращением memory footprint. Распакованный ФИАС весит около 50Гб, а индексы на elastic весят порой больше 100Гб.

About

Неточный поиск адреса в ФИАС

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%