Skip to content

AMDmi3/streetmangler

Repository files navigation

streetmangler - реестр и конвертер названий улиц

CI codecov

В российском OSM принято соглашение о правилах именования улиц, позволяющее (при соответствии ему подавляющей части базы, разумеется) избежать значительной части адресных ошибок, неполноты данных, упростить машинную обработку и просто использовать единый для всей страны стиль.

Изначально для проверки соответствия и приведения в соответствие соглашению названий улиц был применён эвристический подход, позволивший поднять долю корректно именованных улиц с 55% до 96%, одновременно сократив количество адресных ошибок по меньшей мере в 5 раз, или на ~100000 при общем количестве адресов в базе 600000-700000 (т.е. каждый 7-й адрес был ошибочным). Однако этот подход имеет свои ограничения в виде процента ложных срабатываний, достаточного для необходимости ручной проверки замен, что не позволяет выложить инструмент для исправления названий в общий доступ или выполнять исправления регулярно в автоматическом режиме.

Альтернативным решением является ведение словаря или реестра всех существующих названий улиц. Это позволит полностью избежать ложных срабатываний (помимо действительных ошибок в словаре), хотя и потребует значительной работы по наполнению базы, но если учесть что в эвристическом нормализаторе также используются словари (для определения частей речи) и он также требует ручной работы по проверке данных, новый подход видится гораздо более эффективным.

Также автор надеется что проект найдёт применение и за пределами OSM.

Возможности

На данный момент реализовано:

  • поиск точного совпадения
  • поиск неточного совпадения (разный регистр, разный порядок слов, сокращения статусной части)
  • поиск неточного совпадения с учётом орфографических ошибок
  • поиск названий с предположительно отсутствующей статусной частью
  • класс для обработки названий улиц, который можно использовать в том числе и отдельно от базы, например в конверторах
  • утилита для выделения названий улиц из OSM XML дампа, и их классификации

Пока не реализовано:

  • поддержка других языков (хотя Komzpa использует белорусскую локаль)
  • утилита для самотестирования (сверка базы с ней же для поиска потенциальных ошибок)
  • утилита для замены названий улиц в OSM
  • утилиты для сверки с другими источниками, например КЛАДР

База

Данные берутся из OpenStreetMap. Используются все тэги addr:street и аналогичные (addr:street2, addr2:street и т.д.), name линейных объектов с тегом highway, за исключением bus_stop и emergency_access_point, а также name отношений указанных типов.

Формат базы тривиален - текстовый файл в кодировке UTF-8, по одному названию улицы на строку, текст после символа # считается комментарием и игнорируется, равно как и лишние пробелы.

Основной список улиц - data/ru/main.txt, см. также другие файлы в data/ru/.

Библиотека

Исходный код из директории lib/ может использоваться как с, так и отдельно от базы. Смотри README.API

Биндинги

Имеются swig-биндинги для python и perl, поддерживающие большую часть функционала библиотеки.

Сборка

Необходимые зависимости:

  • cmake
  • icu
  • expat2

Опциональные зависимости:

  • perl (для perl биндингов)
  • python (для python биндингов)
  • swig (для любых биндингов)

Сборка:

cmake . && make

Сборка без биндингов:

cmake -DWITH_PERL=NO -DWITH_PYTHON=NO . && make

Запуск тестов:

ctest -V

Утилиты

Единственная на данный момент утилита - process_names. Она позволяет загрузить из текстового файла или выбрать из OSM XML дампа названия улиц, сопоставить их с базой и классифицировать. По результатам можно получить статистику и списки найденных/не найденных улиц, которые можно далее использовать как для пополнения базы, так и для исправления названий в OSM.

Формат вызова:

process_names [-cdhsAN] [-p N] [-l locale] [-a tag] [-n tag] [-r type] [-f database] file.osm|file.txt|- ...

Аргументами может быть любое число файлов с расширениями .osm (обрабатывается как osm xml дамп), .txt (обрабатывается как текстовый список названий), а также символ -, который означает чтение osm xml дампа с stdin.

Опции:

-s дополнительно к статистике по уникальным названиям улиц считать статистику по каждому отдельному использованию названия. Немного замедляет работу утилиты.

-d сохранять списки улиц в файлы в текущем каталоге:

  • dump.all.txt - все названия из входного файла

  • dump.exact_match.txt - точные совпадения с базой

  • dump.canonical_form.txt - названия, требующие приведения к канонической форме

  • dump.spelling_fixed.txt - предположительно исправления опечаток

  • dump.stripped_status.txt - названия с пропущенной статусной частью

  • dump.no_match.txt - названия не найденные в базе

  • dump.no_match.full.txt - названия, не найденные в базе, приведённые к полной форме (т.е. в формат подходящий для пополнения базы)

  • dump.non_names.txt - предположительно, не названия улиц

-c при использовании опции -d также создавать списки названий улиц с количеством раз, сколько каждое название встречалось

  • dump.counts.all.txt - все названия

  • dump.counts.spelling_fixed.txt - предположительно, исправления опечаток

  • dump.counts.no_match.txt - названия, не найденные в базе

  • dump.counts.non_name.txt - предположительно, не названия улиц

-l указать локаль (по умолчанию и единственная доступная на данный момент - "ru_RU")

-p расстояние проверки орфографии (максимальное число ошибок в слове) (по умолчанию 1)

-f указать путь к базе данных (по умолчанию используется data/ru.txt из директории с исходниками проекта). Можно использовать эту опцию несколько раз, загружная несколько баз

-a указать тэг(и), из которых будут читаться адресные названия улиц (опцию можно указывать несколько раз). По умолчанию (если данная опция не указана) используются "addr:street", "addr:street1", "addr:street2", "addr:street3", "addr2:street", "addr3:street".

-A не использовать список адресных тэгов по умолчанию

-n указать тэг(и), из которых будут читаться названия у highway-объектов (опцию можно указывать несколько раз), По умолчанию (если данная опция не указана) используется только тэг "name"

-N не использовать список name-тэгов по умолчанию

-r указать тип(ы) отношений (тип - значение тэга type=), для которых будут использоваться name тэги. (addr тэги всегда обрабатываются для всех отношений)

-h показать краткую справку

Пополнение базы

Прежде всего, планируется постоянное пополнение базы данных. Эту работу можно условно разделить на 3 фазы:

  1. Доведение процента распознанных улиц до показателей эвристического нормализатора
  2. Добавление в базу всех улиц, присутствующих в OSM
  3. Периодический импорт новых названий, появляющихся в OSM

На данный момент проект находится на 1 фазе, совпадают с базой 61.52% уникальных названий улиц в России. Уровень эвристического нормализатора - 77.40%.

Возможно, для облегчения 3 фазы будет создана отдельная база с не-улицами (и, возможно, она будет использована для исправления OSM, потому что "name=грунтовка" - очевидно, ошибка).

В будущем возможно введение более развитой структуры базы, например с учётом различных написаний имён собственных в названиях (т.е. "улица Льва Толстого" vs. "улица Л.Н.Толстого") (Komzpa@)

Проверочные источники

Лицензия

Код распространяется под GPLv3. Полный текст лицензии находится в файле COPYING.

Названия улиц взяты из OpenStreetMap: http://www.openstreetmap.org/copyright

Автор

Дмитрий Маракасов amdmi3@amdmi3.ru

About

Russian street name database and format converter

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published