https://github.com/amdmi3/streetmangler
Russian street name database and format converter
https://github.com/amdmi3/streetmangler
address openstreetmap
Last synced: 10 days ago
JSON representation
Russian street name database and format converter
- Host: GitHub
- URL: https://github.com/amdmi3/streetmangler
- Owner: AMDmi3
- License: gpl-3.0
- Created: 2011-10-13T20:15:57.000Z (over 13 years ago)
- Default Branch: master
- Last Pushed: 2021-06-01T14:46:01.000Z (almost 4 years ago)
- Last Synced: 2025-04-29T23:48:49.768Z (10 days ago)
- Topics: address, openstreetmap
- Language: C++
- Homepage:
- Size: 17.3 MB
- Stars: 40
- Watchers: 5
- Forks: 12
- Open Issues: 10
-
Metadata Files:
- Readme: README.API
- License: COPYING
Awesome Lists containing this project
README
streetmangler - реестр и конвертер названий улиц
==================================================Библиотека состоит по большей части из 3 классов.
StreetMangler::Locale
=====================Определяет локаль - набор правил для определённого языка/региона.
На данный момент в локали хранится список статусных частей и их
возможных сокращений.Задание локали
--------------Данные локали задаются в исходном файле в виде массива структур
StatusPartData, определяющий различные виды написания статусной
части:StatusPartData status_parts[] = {
{ "улица", nullptr, "ул.", { "улица", "ул" } },
{ "проспект", "просп.", "пр-т.", { "проспект", "просп", "пр-кт", "пр-т" } },
{ "просека", nullptr, nullptr, { "просека" } },
}Поля структуры следующие:
- полное написание - используется при указании флага EXPAND_STATUS
в Name::Join, а также для сравнения названий в Database
- каноническая форма - используется при указании флага
CANONICALIZE_STATUS в Name::Join, а также в Database
если nullptr, используется полная форма
- сокращённое написание - используется при указании флага
SHRINK_STATUS в Name::Join
если nullptr, используется каноническая форма
- список форм - используется для распознавания статусной части
(предыдущие поля сюда не включаются, поэтому в большинстве случаев
в этом списке должна присутствовать полная форма, а также все
возможные сокращения без точки).Следует заметить, что совпадение форм разных статусных частей
запрещено (т.е. "пр" сразу для проспекта и проезда), и проверяется
assert'ом.После этого через создание глобального объекта Locale::Registrar
данные локали автоматически связываются с именем:Locale::Registrar("ru_RU", status_parts),
и становятся доступны для использования:
Locale locale("ru_RU");
Использование
-------------// Получить локаль
Locale locale("ru_RU"); // Кидает Locale::UnknownLocale если локаль
// с таким именем не найдена// Получить и использовать данные по статусной части
const StatusPart* info = locale.FindStatus("пр-т");
assert(info->GetFull() == "проспект");
assert(info->GetAbbrev() == "пр-т.");StreetMangler::Name
===================Хранит название улицы, разбитое на части и готовое к преобразованиям.
В конструктор передаётся строка с названием и ссылка на локаль.
Единственный метод - Join() принимает ряд флагов, позволяющих
преобразовать имя в различными способами:STATUS_TO_LEFT - перенести статусную часть влево
STATUS_TO_RIGHT - перенести статусную часть вправо
(в отсутствие этих флагов статусная часть не меняет положения)EXPAND_STATUS - заменить статусную часть полным написанием
из локали
SHRINK_STATUS - заменить статусную часть сокращённым
написанием из локали
CANONICALIZE_STATUS - заменить статусную часть каноническим
написанием из локали
(в отсутствие этих флагов статусная часть не меняет написания)REMOVE_ALL_STATUSES - удалить все части, похожие на статусные
NORMALIZE_WHITESPACE - заменить все последовательности пробельных
символов (' ', '\t') единичными пробелами,
убрать пробелы в начале и конце строки
NORMALIZE_PUNCT - удалить запятую в случае типа "Ленина,
улица". Этот флаг автоматически
подразумевается при STATUS_TO_LEFT,
STATUS_TO_RIGHT, REMOVE_ALL_STATUSES
ADD_PUNCT - добавить запятую когда статусная часть
переосится направо (т.е. "улица Ленина" ->
"Ленина, улица")Использование
-------------// Нужна локаль
Locale locale("ru_RU");Name name("улица Ленина", locale);
// Получить имя в неизменённом виде
assert(name.Join()) == "улица Ленина");// Сократить статус
assert(name.Join(Name::SHRINK_STATUS)) == "ул. Ленина");// Перенести статус вправо
assert(name.Join(Name::STATUS_TO_RIGHT)) == "Ленина улица");StreetMangler::Database
=======================База данных правильных названий улиц. Загружается из файла
и предоставляет методы для сопоставления названий:CheckExactMatch - проверка на точное соответствие
CheckCanonicalForm - проверка неточного написания, учитывающая
перестановку слов, регистр, пробелы и
сокращения статусных частей
CheckSpelling - проверка неточного написания с учётом
орфографических ошибок (пока не реализовано)
CheckStrippedStatus - проверка на название с отсутствующей статусной
частьюВсе функции возвращают число соответствий, а все кроме первой
также наполняют вектор предположительных правильных написаний.
В случае CheckCanonicalForm и CheckSpelling оный может использоваться,
например, для формирования списка замен.Для удобства, все функции работают как с обычными строками, так
и со StreetMangler::Name. Использование второй формы может быть
эффективнее при последовательных вызовах, поскольку не нужно будет
многократно конструировать Name.Использование
-------------// Нужна локаль
Locale locale("ru_RU");Database database(locale);
// Можно загружать несколько баз
database.Load("data/ru.txt");// Можно добавлять названия вручную
database.Add("улица Ленина");int res = database.CheckExactMatch("улица Ленина");
assert(res == 1); // Правильное написаниеstd::vector suggestions;
int res = database.CheckCanonicalForm("Ленина ул.");
assert(res == 1); // Найдена одна замена
assert(suggestions[0] == "улица Ленина");