В российском 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 фазы:
- Доведение процента распознанных улиц до показателей эвристического нормализатора
- Добавление в базу всех улиц, присутствующих в OSM
- Периодический импорт новых названий, появляющихся в OSM
На данный момент проект находится на 1 фазе, совпадают с базой 61.52% уникальных названий улиц в России. Уровень эвристического нормализатора - 77.40%.
Возможно, для облегчения 3 фазы будет создана отдельная база с не-улицами (и, возможно, она будет использована для исправления OSM, потому что "name=грунтовка" - очевидно, ошибка).
В будущем возможно введение более развитой структуры базы, например с учётом различных написаний имён собственных в названиях (т.е. "улица Льва Толстого" vs. "улица Л.Н.Толстого") (Komzpa@)
-
Москва:
-
Санкт-Петербург:
-
Архангельск:
-
Владивосток:
-
Грязовец:
-
Иваново:
-
Ирбит:
-
Иркутск:
-
Нижний Новгород:
-
Орск:
-
Осташков:
-
Ростов-на-Дону:
-
Стерлитамак:
-
Тверь:
- Улицы Твери (порядок слов неправильный, но есть история названий)
-
Томск:
-
Усть-Лабинск:
-
Чебоксары:
- cheb.ru (для некоторых улиц есть информация в честь кого они названы)
-
Челябинск:
-
Общее:
- Википедия (статьи об отдельных улицах, списки улиц отдельных городов, статьи о персонах, событиях и местах, в честь которых назывались улицы, списки героев)
- Герои страны
- Красные Соколы: лучшие лётчики-асы России 1914-1953 гг.
- КЛАДР
Код распространяется под GPLv3. Полный текст лицензии находится в файле COPYING.
Названия улиц взяты из OpenStreetMap: http://www.openstreetmap.org/copyright
Дмитрий Маракасов amdmi3@amdmi3.ru