Библиотека работы с названиями стран и регионов Regions

Проблематика

При сборе любой региональной статистики одна из основных проблем - это определение регионов по их названиям. То же касается и федеральных округов.

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

Унификация должна осуществляться через реализацию Приказа Минфина России от 5 ноября 2015 г. N 171н "Об утверждении Перечня элементов планировочной структуры, элементов улично-дорожной сети, элементов объектов адресации, типов зданий (сооружений), помещений, используемых в качестве реквизитов адреса, и Правил сокращенного наименования адресообразующих элементов", но на деле в выгрузках бывает самое разное.

Обычно этот вопрос решают использованием регулярных выражений, но в этом случае сложно гарантировать 100% распознование. Типичный пример ошибки - слияние Костромской и Омской или Томской и Омской областях практически во всех готовых парсерах подобных данных, а также слияние в одну кучу регионов с округами и служебными полями, если в них есть указание на регион, что было и остается поныне как следствие изменения административного деления.

Например, "Крым (без город Симферопль)" а рядом "Симферополь (без республики Крым)". Эта библиотека нужна для того, чтобы таких нюансов избежать.

Архитектура

Сама библиотека вообще не использует баз данных, а при каждой инициализации создают собственный файлик в обычном csv, собираемый из актуальных на данный момент баз ОКСМО (которые часто меняются), баз iso-кодов, ведомственных кодов регионов (наиболее частая неофициальная практика), совпадающих с "первыми" кодами регионов на автомобильных знаках и федеральных округов - все эти выгрузки вместе с базой сокращений из актуального приказа Минфина просто лежат в csv в папке iso библиотеки и могут быть в любой момент обновлены. Из них и составляется база, при этом в качестве идентификатора региона используется именно ведомственный код. То же самое и со списком стран, для которого используется база ОКСМ последней итерации.

Библиотека предусматривает трехступенчатый поиск по имени региона с возвращений сведений о нем. При этом имя региона может быть невалидным - используется синтаксический валидатор с поиском по стэммам в массиве регионов (безо всяких двойственных LIKE) с максимально жесткими критериями.

Итерации поиска и преобразования следующие:

  1. Непосредственный поиск по полным и сокращенным официальным названиям регионов
  2. Перевод сокращений, согласно Приказу Минфина, дополняемого словарем метода Region, в полную форму, повторение поиска
  3. Отбрасывание "служебных" наименований ("область", "край" и т д) и поиск по названиям без учета регистра
  4. Образование из строки стемма по жестким критериям обработки окончаний и рекурсивный поиск по ним.

Если за три итерации гарантированного поиска страна или регион в собранном библиотекой массиве не находится, то либо ничего не возвращается либо (если для метода get установлен флаг TRUE) запрашиваемый регион или страна вставляется в конец базы, получая 5-и значный код от 90000 начиная, т.е. не пересекаемый с кодами регионов, что позволяет легко отделить найденные регионы от вставленных и сохранить все поля из исходных датасетов при парсинге. При этом за счет таких полей база обновляется.

Ссылки на эту базу напрямую не используются в БД вообще, она запрашивается при парсинге. При этом копия актуальной БД может быть проинсталирована в сервисную БД контроллером инсталятора (см. описание архитектуры). Таким образом, через эту библиотеку без изменения region_id во всех базах поддерживается актуальное состояние сведений о регионах и их актуальной административной принадлежности без исключения и замены на исключенные, переименнованные и так далее регионы, т.е. гарантируется, что срез датасета за такую-то дату будет с актуальным на эту дату админ. делением без замены регионов на "новые". Обратные преобразования доступны всегда через сервисную базу данных при выборке.

Возвращаемые значения

См. ссылки для тестов api, где все видно. Основной метод класса - get(строка), где строка - название региона в любом виде. Например, регион с кодом 63 "Самарская область" найдется и по запросу "Самарская", и по "Самара", и по "самарская область" и по "самарскому региону" и по "самар", но НЕ найдется по "сам" или "тамара".

Особенности, связанные с БД

Ввиду того, что в каждой БД, использующей библиотеку, создается копия БД, генерируемой классом, во всех БД сохраняется и синхронизируется единый подход к значению поля id региона (region) - это всегда код региона из БД этого класса, для всех баз.