Насчет неоднозначностей, когда одно название населенного пункта или еще чего может ссылаться на статьи о разных сущностях в Википедии (и когда два города с одним названием в разных странах):
Есть такой проект как Freebase, при добавлении данных туда есть такое понятие как reconclie. Допустим, ты нашел данные о загрязненности рек в виде такой таблицы и хочешь добавить их во freebase:
Название реки, Загрязненность
Москва, 100500
Нил, 9000
Ганг, 100000000000
Так как в freebase всё типизировано и везде сущности, надо как-то сопоставить первую колонку – название – конкретной реке, а потом у этой реки проставить атрибут “загрязненность”. Проблема в том что “Москва” – это и город, и река, и еще фотоаппарат такой есть. Вот сопоставление строки с названием, опционально с какими-то аттрибутами конкретному объекту там называется reconcile, и делается через ихнее API программой Google Refine и загружалкой спредшитов http://wiki.freebase.com/wiki/Freebase_Loader.
Так как объекты там имеют тип, в данном случае просто при reconcile указываем тип “река” /geography/river, и уже получаем более точные результаты при сопоставлении.
Сопоставление обычно делается вручную, система возвращает несколько кандидатов с разным значением “confidence”, и нужно посмотреть и выбрать то что действительно подходит; если кандидатов мало и первый с высоким confidence, то можно сразу автоматически.
Так вот, там основная часть объектов привязана к статьям википедии. И тип указан. И при reconcile можно указывать не только тип, но и страну (где находится город). Тогда будут выдаваться более точные результаты. Можно это как-то использовать.
Так как это всё есть в Google Refine, можно предложить такой порядок работы:
- Какой-то утилитой выгружаем список населенных пунктов внутри области, в csv/tsv. Колонки – название населенного пункта и id(ы) точек/линий/релейшенов в osm (и может другие атрибуты).
- Вручную грузим этот csv в Google Refine
- Запускаем reconcile, указывая тип “город” (/location/citytown), страну, где он находится, для лучшего сопоставления, можно еще что-нибудь указать
- Смотрим, как совпало, проверяем вручную
- Так как у нас теперь объекты сопоставлены, то можно сделать в Refine еще одну колонку – название статьи в википедии (в английской, это используется практически как основной ключ в Freebase)
- Запускаем утилиту, которая ищет в википедии по английским статьям русскую статью (это можно прямо из refine, а не отдельной утилитой)
- Смотрим еще раз, что нашло, обрезаем “(город)” и т.д.
- Еще одной утилитой генерим xml изменений для загрузки в osm
- Смотрим его еще раз и заливаем
Кстати из freebase можно еще всяких данных извлечь для занесения в osm.
Тут есть 3 видео где можно увидеть как работает этот Refine http://code.google.com/p/google-refine/
Update: скрипт для конвертации .osm файлов в таблицы (.tsv) с колонками: id, тип объекта (node, way, relation) и все атрибуты https://gist.github.com/1274978
Выложил файл проекта для refine: http://dl.dropbox.com/u/2671035/thailand-cities.google-refine.tar.gz , это города в Тайланде, из выгрузки с cloudmade, отфильтровано осмозисом по place=, судя по всему содержит города и из соседних стран (в выгрузке к области обрезки наверно добавлена буферная зона, я не стал снова обрезать уже по нормальной границе), затем скриптом выше сгенерена таблица. Особо не экспериментировал пока что.