Russian street name database and format converter
C++ Shell CMake Perl Python
Switch branches/tags
Nothing to show
Permalink
Failed to load latest commit information.
cmake
contrib/tspell/tspell Update tspell: Fix build with newer gcc Oct 22, 2011
data
lib
scripts Fix status part in list Feb 13, 2014
swig Fix whitespace in swig file Jan 21, 2016
tests
utils Exclude highway=platform from name processing May 24, 2016
.travis.yml
CMakeLists.txt
COPYING
README.API Finish NULL -> nullptr replacement Sep 16, 2013
README.md Опечатки и запятые Dec 13, 2016

README.md

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

Build Status Coverage Status

В российском 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