Небольшая история, леденящая кровь.
Как вы все знаете, раньше периодически нормализовывали имена вот этой программкой https://wiki.openstreetmap.org/wiki/Streetmangler , но теперь ей никто не балуется.
В выдаче http://wowik.byethost7.com/ я замучился смотреть на весь бред, который лепят в имена улиц.
Посему решил дооснастить программку нормализатором названий улиц, тем более, что при работе с ФИАС там уже похожий код был написан и расставлял порядок слов.
В начале апреля начал писать. Программа анализирует, выдает кандидатов на исправление в .OSM фаил. Раскрываются сокращения типа ул., пер., а потом анализируется порядок слов.
Первоначально в ходе отладки механизма поиска и генерации .OSM файла программа работала аналогично тому, что делалось при определении порядка слов для улиц из ФИАС.
Но там я всегда имел еще и альтернативный порядок, так как порядок слов в ОСМ считается в валидаторе более правильным.
Для нормализатора же необходимо принимать единственное решение и сделать это поправками алгоритма не удается.
Результат приносит лишь работа по словарю.
Как сделать словарь?
Можно взять чужой, например от Streetmangler. Но это не путь настоящего программиста.
Решил сгенерить свой.
И мне подумалось, что раз когда-то названия улиц нормализовались, то скорее всего они в большинстве своем уже в правильном порядке.
Тогда я просто все встречающиеся названия стал заносить в табличку, причем попутно считая, сколько раз используется это название со словом улица спереди, а сколько сзади. Заодно я печатал по одному id для node way rel для левого и правого использования, чтобы при необходимости найти в OSM.
переулок Грибоедова 112 0 1730470139 123180901
545 33025 Набережная улица 2147483647 501252407 8901421 1680105009 137381198 3292482
0 158 Корпусная улица 2147483647 35843696 2075535
Имея такую статистику, я стал переносить потихоньку наиболее очевидных кандидатов в словарь.
Где-то приходилось статистику исправлять.
Например Набережная может иметь слово улица и слева и справа, поэтому в словарь оно пошло с равными весами, то есть программа в таком случае ничего местами не переставляет.
Прогоняя нормализатор, просматривал глазками кандидатов в поиске ложных срабатываний в JOSMе и выгружал.
При обнаружении ложного срабатывания исправляются соответствующие данные в словаре.
Потом добавлял новую порцию названий в словарь
Какие-то названия попадались как с буквой Ё, так и с Ё, пришлось вносить оба варианта, иначе нормализатор вставлял Ё, если в словаре название ее содержало.
Постепенно я в программу добавлял обработку не только улиц/переулков, но и других типов наименований, проезды, бульвары, шоссе… В общем еще кое-что осталось.
Сделал замену не только сокращений, но и коррекцию частых ошибок типа “1-ая” на “1-я” и т.п.
Вообще с числительными еще куча хлопот.
Сегодня утром 9 мая, приделав еще немного коррекций опечаток в программу и названий в словарь, который уже перевалил числом за 51000 названий, я этот словарь удалил.
Осталась резервная копия от 14 апреля размером в 1900 названий.
Самое интересное, что собственно словарь-то не погиб. Он теперь живет распределенно в ОСМ, по которому он уже нормализован.
И вот я теперь два часа дописываю фильтрацию выдачи кандидатов для словаря, чтобы выкинуть на первых порах то, что я раньше ручками отсеивал (микрорайоны, поселки…, какие-то названия с датами), ну и заодно чиню то, до чего руки не доходили.
Вот, кстати, локальный словарь наверное сделаю по замах для Питера, для Белоруссии и т.п.
Есть еще план сравнить свой новый словарь со словарем от Streetmangler.
Поэтому у меня пока пауза в выгрузке работы нормализатора.
P.S. Статья, хоть прямо в дневники