Ошибка нормализации адреса что это

Нормализация адресов, ГАР ФИАС и Адрессарий

Время на прочтение
7 мин

Количество просмотров 6.2K

Постановка задачи

Как известно, один и тот же адрес можно написать различными текстовыми способами, используя сокращения, перестановку, вариации наименований и т.п. Встаёт вопрос: существует ли процедура нормализации, отождествляющая реально одинаковые и по-разному записанные адреса?

Ответ положительный, чему и посвящена данная статья.

Какие средства в принципе есть для решения задачи? Их сейчас два: выделение именованных сущностей (NER) и объекты ГАР ФИАС. NER даёт разбиение на адресные элементы и их нормализацию, ГАР ФИАС может дать уникальные идентификаторы. Задача решается, если в качестве нормализации взять множество строк возможных нормализаций наименований элементов, добавив к ним GUID-идентификаторы ГАР, если получится. Два адреса эквивалентны, если хотя бы одна строка из множеств таких их строк совпадает.

А одними объектами ГАР ФИАС можно обойтись, используя только их идентификаторы? Конечно, нет. Во-первых, это не полный классификатор, особенно в части помещений и строений, хотя и постоянно пополняемый. Во-вторых, в адресах бывают специфические элементы, которые в ГАР отсутствуют (например, Московская область, Можайский район, примерно в 0,1 км по направлению на юг от ориентира середина д.Бараново, или пересечение улиц).

Итак, утверждается, что невозможно обойтись для адреса только одной нормализованной строкой для отождествления в общем случае. Но если таких строк будет несколько, причём сформированных определённым образом, то отождествление будет с очень высокой вероятностью.

Нормализация имён улиц

Если бы наименования адресных элементов писались одинаково, то проблемы бы наполовину не было. И дело даже не в ошибках, которые тоже возможны, а в сокращениях и вариативности. Рассмотрим примеры корректных названий: ул. Жукова, ул. имени Жукова, ул. М.Жукова, ул. Марш.Жукова, ул. Жукова Маршала, ул. Имени Четырежды Героя Советского Союза Жукова Георгия Константиновича (это реальный пример, а не шутка, когда в имени уместилась краткая биография) и т.д. Как бы сделать так, чтобы их отождествить…

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

  • Наименование в общем случае состоит из вариантов текстовых значений и возможного номера. Например, «ул. Восьмого Марта» — это 8 и «МАРТА», «2-я ул. Соколиной горы» — это 2 и «СОКОЛИНОЙ ГОРЫ» + «СОКОЛИНАЯ ГОРА» + «ГОРЫ СОКОЛИНОЙ» + «ГОРА СОКОЛИНАЯ», «ул.10-я» — только номер 10. Всякие летия и годовщины тоже переводятся в одно число. Километры транслируются в числа с суффиксом «км» («на 59 км автодороги Санкт-Петербург — Псков«).

  • Некоторые слова просто отбрасываются: «имени», «им.», «герой Советского Союза/России» и т.п.

  • Для строкового значения формируется максимальное число возможных вариантов путём как перестановки слов, если их несколько, так и вариацией морфологических окончаний. Например, «на ул. Гороховой» непонятно, это ул. Гороховая, или ул. имени Гороховой (фамилия), поэтому формируются оба варианта: «ГОРОХОВОЙ» + «ГОРОХОВАЯ».

  • Учитываются стандартные прилагательные (МАЛЫЙ, ВЕРХНИЙ, НОВЫЙ и т.п.) и их возможные сокращения, они всегда помещаются на первое место.

  • Если имя состоит из 2-х слов, одно из которых имя, профессия или должность, а второе похоже на фамилию, то один из вариантов всегда должен быть этим вторым словом. Например, для «ул. Маршала Жукова» это «ЖУКОВА» + «МАРШАЛА ЖУКОВА» + «ЖУКОВА МАРШАЛА».

  • Некоторые типы сокращений как разворачиваются, так и оставляются в исходном виде. Например, «ул. М.Жукова» — здесь сокращение может быть «МАЛАЯ», «МИХАИЛА», «МАРШАЛА» или что-либо ещё, заранее мы не знаем. Поэтому закладываем «МАЛАЯ ЖУКОВА», «М.ЖУКОВА», «ЖУКОВА».

Все эти эвристики направлены на то, чтобы на выходе получить максимальное число возможных нормализованных вариантов, по которым впоследствии можно производить сравнение. Теперь понятно, как могут быть отождествлены улицы из начала раздела: у всех них будет общая комбинация — «ЖУКОВА».

Не только названия обладают вариативностью, но и типы. Например, «Измайловский пр.» — это проезд или проспект? Оба типа возможны.

Итак, две улицы одинаковы, если у них совпадает тип, хотя бы одна из строк (если есть) и номера (если есть).

Структура адреса

Адрес представляет собой последовательность адресных элементов (далее, АЭ). В принципе, в произвольном порядке, хотя обычно начинают с высокого уровня (страны, региона), заканчивая низким (дома, квартиры). Приведём типизацию АЭ по уровням:

  • Страна;

  • Регион: край, область, города Москва, Санкт-Петербург, Севастополь (в ГАР уровень 1);

  • Административный район (в ГАР уровень 2);

  • Муниципальный район: городскоймуниципальный округ (в ГАР уровень 3, но в иерархии всегда принадлежит региону);

  • Городскоесельское поселение, внутригородской район, межселенная территория (в ГАР уровень 4, всегда принадлежит муниципальному району);

  • Город (в ГАР уровень 5);

  • Населённый пункт: село, посёлок, деревня (в ГАР уровень 6);

  • Элемент планировочной структуры: кварталы, зоны, массивы, территории садовых товариществ, организаций и т.п. (в ГАР уровень 7);

  • Элемент улично-дорожной сети (в ГАР уровень 8);

  • Земельный участок (в ГАР уровень 9);

  • Здание, сооружение (в ГАР уровень 10);

  • Относительный указатель (например, «Забайкальский край край, Александрово-Заводский р-н., ориентир 6100 метров на юго-запад от с.Онон-Борзя«, в ГАР отсутствует);

  • Помещение, квартира, комната (в ГАР уровень 11);

  • Машиноместо (в ГАР уровень 17);

Предположим, что мы умеем отождествлять АЭ каждого из уровней. Чтобы отождествить два адреса, нужно упорядочить АЭ в каждом из адресов и произвести последовательное сравнение. Если самые нижние по уровню АЭ совпадут, то адреса эквивалентны.

Здесь проблема в том, что некоторые АЭ в иерархии могут отсутствовать или наоборот. Например, в ГАР ФИАС в общем случае 2 типа иерархии — по административным районам и по муниципальным районам, и один АЭ может в принципе иметь 2-х разных родителей. Например, «Дагестан район Агульский село Амух» и «Дагестан муниципальный район Агульский сельское поселение сельсовет Амухский село Амух» — один и тот же АЭ в разрезе этих двух иерархий. А если в регионе село с таким именем уникально, то районы могут вообще не указывать: «Дагестан село Амух«. Таким образом, для тождественности АЭ должны не только совпадать сами по себе (по типам и наименованиями с вариациями), но и должно учитываться совпадение родительских АЭ вверх по иерархии.

Нормализация других объектов

Выше были описаны принципы нормализации улиц, то есть объектов уровня 8 в терминологии ГАР. Для имён вышележащих объектов используются похожие принципы: также формируются варианты, убираются лишние слова, нормализуются числа. Например, для «поселение Михайловский» (именно так правильно!) нужно «МИХАЙЛОВСКИЙ», «МИХАЙЛОВСКОЕ», «МИХАЙЛОВСКАЯ» (это уже перестраховываемся на всякий случай). Имена также слегка корректируются — убираются твёрдый и мягкий знаки, Ё переводится в Е, две одинаковые рядом буквы — в одну. В дальнейшем сравнение идёт с учётом возможного несовпадения одной буквы и т.д.

Для домов уровня 10 нормализация совсем другая. Здесь номер может в общем случае состоять из трёх элементов:

  1. Номер дома владения домовладения;

  2. Номер корпуса;

  3. Номер строения сооружения литера;

Причём номер — это не только цифры, но и дроби, буквы и их комбинации, а бывают и вообще пустые («бн»). Здесь вариативность тоже большая. Рассмотрим на примере литеры А варианты написания: «литераА», «литА», «лит. а» или просто прикрепляют букву к номеру дома, сама буква может быть как на кириллице, так и на латинице и т.д. Здесь нормализация — это приведение значений к вышеуказанной 3-х элементной модели, после чего перевод в строку.

Для помещений уровня 11 ситуация попроще: номер один, но встречаются сложные буквенно-цифровые комбинации. Здесь также номер нормализуется и записывается строкой.

Если есть ГАР ФИАС, то информация из него позволяет в ряде случаев избавиться от неоднозначности. Например, понять, что «дом 10А» — это «дом 10 литера А», а «дом 10/1» — это «дом 10 квартира 1». Или «дом 10 к.1» — квартира или корпус.

Использование ГАР ФИАС

В настоящее время в ГАР ФИАС около 1.8 млн. объектов уровней 1-8, 49 млн. домов и участков и 54 млн. помещений. Их можно использовать для нормализации! Если удаётся адресный элемент привязать к объекту ГАР, то его уникальный GUID можно считать дополнительной строкой для сравнения (кстати, возможны несколько GUID из-за дублирования в самой базе). Это также избавит от от некоторых неоднозначностей, упомянутых выше.

При привязке следует использовать такие же алгоритмы нормализации. То есть текстовые описания ГАР объектов прогонять через тот же алгоритм нормализации, формируя множественные варианты написания при построении поискового индекса.

Такой способ позволит отождествить, скажем, переименованную улицу и улицу со старым названием (кстати, в свежей версии ГАР информация о переименовании отсутствует, к сожалению, хотя история объектов есть — а раньше старые названия были, по крайней мере, в ФИАС времён DBF).

Адрессарий — система идентификации адресов

Всё вышеизложенное позволяет выдвинуть идею адресного индекса (Адрессария). В него добавляются адреса, он разбивает адрес на элементы, пытается привязать их к уже существующим, если не получается, то добавляет их, достраивая тем самым внутри себя иерархическую систему адресов. Адресные элементы в Адрессарии имеют уникальные идентификаторы, так что его можно рассматривать как систему идентификации адресов.

Пропущенный через Адрессарий, адрес получает числовые идентификаторы его элементов. Два адреса совпадают, если равны идентификаторы его самых низкоуровневых элементов.

Если есть массив неструктурированных адресов, то его можно прогнать через Адрессарий, назначив адресам числовые идентификаторы, которые могут служить критерием эквивалентности адресов.

И это не в будущем, а есть уже сейчас!

SDK Pullenti Address

Всё вышеизложенное реализовано в SDK Pullenti Address:

  • выделяет адреса как из произвольных текстов, так и из «текстового поля» с вычислением коэффициентов качества такого выделения;

  • разбивает на адресные элементы и осуществляет нормализацию;

  • привязывает к объектам ГАР ФИАС, причём работа с базой ведётся не через API к внешнему ресурсу, а со специально построенным индексом в локальной файловой системе, то есть может автономно работать в «закрытом контуре»;

  • осуществляет поиск объектов ГАР по разным признакам;

  • поддерживает работу с адресными индексами (Адрессариями);

  • реализовано в виде SDK для языков C#, Java, Python и Javascript и распространяется в виде исходных кодов, не требующих для своего функционирования никаких сторонних библиотек и ресурсов;

  • есть online-демонстрация на сайте, там же можно скачать свежие версии;

Автору на протяжении ряда лет несколько раз приходилось сталкиваться с задачей обработки адресов. Результаты этих столкновений оформлены в виде SDK и предлагаются Вашему вниманию.

One application of normalizing emails is to prevent multiple signups. If your application lets the public to sign up, your application might attract the «unkind» types, and they could attempt to sign up multiple times with the same email address by mixing symbols, upper and lower cases to make variants of the same email address.

From Django’s repository, the docstring of normalize_email is the following:

Normalize the email address by lowercasing the domain part of it.

What this method does is to lowercase the domain part of an email, so this part is case insensitive, so consider the following examples:

>>> from django.contrib.auth.models import BaseUserManager
>>> BaseUserManager.normalize_email("user@example.com")
user@example.com
>>> BaseUserManager.normalize_email("user@EXAMPLE.COM")
user@example.com
>>> BaseUserManager.normalize_email("user@example.COM")
user@example.com
>>> BaseUserManager.normalize_email("user@EXAMPLE.com")
user@example.com
>>> BaseUserManager.normalize_email("user@ExAmPlE.CoM")
user@example.com

As you can see all emails are equivalent because the case after @ is irrelevant.

Используйте удобные сервисы (API) для работы с адресами и почтовыми индексами ваших клиентов в режиме реального времени.

Выдача до 10 адресов, подходящих по поисковому запросу.

Возможности сервиса:

  • Ввод адресных данных транслитом
  • Исправление опечаток при вводе адреса
  • Подсказка адреса поэлементно или единой строкой
  • Выбор других типов адресов (например, «до востребования») и поиск по абонентским ящикам Получение адреса в муниципальном или административном делении

Проверка адреса, переданного в свободном формате, и структурирование его в формате Федеральной информационной адресной системы (ФИАС/ГАР).

Возможности сервиса:

  • Исправление опечаток при вводе адреса
  • Структурирование адресных данных

Актуальная адресная база

База создана на основе Государственного адресного реестра и автоматически обновляется каждую неделю.

Автоматическое обновление индексов

Почтовые индексы в базе системы автоматически обновляются и актуализируются в режиме реального времени.

Надёжность и доступность

Система работает в двух вычислительных центрах, что позволяет не ограничивать нагрузку и гарантировать доступность 24/7.

Российское ПО

Сервисы основаны на открытых платформах разработки. Все права принадлежат Почте России.

1

Ознакомьтесь с описанием услуги.

2

Отправьте заявку на электронный адрес (zayavkaAPIGisPA@russianpost.ru). Укажите название услуги, название организации, ФИО контактного лица и контактную информацию.

3

Дождитесь звонка от менеджера. Он ответит на все интересующие вопросы и отправит проект договора.

4

После оформления договора и успешной оплаты вам будет отправлен токен (уникальный ключ) для пользования сервисом.

Подключить услугу

как подключить

Viewing 11 replies — 1 through 11 (of 11 total)

  • Здравствуйте,

    В про версии появилась база данных по городам, но нет подсказки по улицам.
    Декларировалось, что в Про версии будет автоматическое формирование почтового индекса. Но это не реализовано. Ошибки индекса приводят к неправильному расчету стоимости.

    Да по улицам не подсказок. Возможно в будущем появятся если будет предложение. Автоматическое формирование индекса – об этом не где не говорится в описании про версии. Говорится о “Автопоиск индекса для области/города” значит что как только пользователь выбрал город то по его первому индексу в базе формируется расчет доставки что делает поле индекс необязательным и даже если покупатель указал неверный индекс это ни как не повлияет на расчет.

    2. Плагин конфликтует с плагином доставки СДЭК. Перестает работать поиск города. Имеется ли какое-либо решение, чтобы разрешить конфликт?

    Плагин Почты РФ написан в полном соответствии с API WooCommerce в то время как плагин СДЭК использует пользовательские поля и прописывает данные адреса в произвольном формате что и приводит к ошибкам совместимости.

    Спасибо за исчерпывающий ответ. Жаль что плагин СДЭК не совместим с Вашим плагином. Может быть можно разъединить, распараллелить их как-то? Все плагины завязаны на WooCommerce, и это проблема.

    Спасибо за исчерпывающий ответ. Жаль что плагин СДЭК не совместим с Вашим плагином. Может быть можно разъединить, распараллелить их как-то?

    Можете написать разработчику плагина СДЭК так как проблема решаема, но только на стороне СДЭК плагина.

    Добрый день!

    При ошибочном введении индекса выдается сообщение: “Почтовый индекс клиента недействителен. Не удалось найти совпадений в базе. Это сообщение видно только администратору сайта.”

    Какие правки можно внести, чтобы похожее сообщение выдавалось для покупателя, не имеющего прав администратора?
    Например, так: “Почтовый индекс не соответствует городу получателя. Не удалось найти совпадений в базе. Введите правильный индекс”.

    Присоединяюсь, данный вопрос задавал ранее
    Сообщение выдавалось для покупателя.
    Например, так: “Почтовый индекс не соответствует городу получателя. Не удалось найти совпадений в базе. Введите правильный индекс”.

    @igor420 @mikhalbarr
    Сейчас это реализовано простым поиском индекса в локальном списке, но базы не актуальны так как их поддержка и сопровождение стоит времени и денег (при след. обновлении старые базы будут удалены). Для реализации такого функционала где мы ищим индекс по городу необходимо точно знать Область так как название городов в России не уникальны. Затем нужно точно знать город. А так как клиент может написать его с ошибкой или в произвольно формате это не подходит. И получается что лучшим решением является дать покупателю просто выбор из областей и городов РФ, таким образом вы исключаете неправильный ввод и ошибки ввода индекса так как индекс в данном случае становится просто не нужным. Пример того как работает выбор города https://yumecommerce.com/pochta/

    Да я не про поиск спрашивал, а про показ уведомления и для админа и для покупателя: индекс не найден

    Да я не про поиск спрашивал, а про показ уведомления и для админа и для покупателя: индекс не найден

    Извените, наверное не так объяснил. Чтобы поиск работал его нужно делать на основании параметров Область/Город, а так как и область и город не имеют стандартных значений и могут быть написаны с ошибкой или в произвольном формате то и поиск не даст результатов. Я думаю вы согласитесь что нужно избежать любых ошибок со стороны заполнения заказа, а это возможно сделать только через Официальную Базу Адресов Почты РФ плюс нормализацию адреса для определения индекса. Таким образом исключаются все ошибки.

    Целиком с Вами согласен. Но можно ли это сделать в бесплатной версии программы?

    @mikhalbarr @igor420
    К сожалению нет. Есть причина по которой данное сообщение видно только Администратору. Просто напросто наличие выбора доставки, не важно что там написано, не отменяет ее выбор. Ваши клиенты могут видеть что написано ошибка, но все равно данный пункт доставки будет доступен для выбора. И получается, что если данное сообщение показывать всем то ваши покупатели смогут оформить бесплатную доставку на адрес которого не существует.

  • Viewing 11 replies — 1 through 11 (of 11 total)

    Экспертный химик

    29.04.2021

    Приложение у них тоже кстати не самое лучшее. Как-то раз пыталась посылку оформить, чтобы домой принесли, после того, как забила отслеживающий номер, приложение вообще перестало работать 

    Ответить

    Развернуть ветку

    Повелитель Ондатр

    29.04.2021

    А куда смотреть то? Что не работает? Специально сходил на сайт, вбил адрес — сработало
    Естественно не защищаю почту, но может стоит излагать проблему более понятно?

    Ответить

    Развернуть ветку

    Dmitry V

    29.04.2021


    Автор

    Если заходите с ПК-версии, то при движении курсора сверху вниз (что логично) задевается всплывающее меню, которое полностью перекрывает поле ввода адреса для поиска индекса.

    Ответить

    Развернуть ветку

    Комментарий удален модератором

    Развернуть ветку

    Valery Goondyaeff

    29.04.2021

    И, как я понимаю, на сайте Почки в «связаться с нами» указано vc.ru? Почему не отправить им багрепорт по UX напрямую?

    Ответить

    Развернуть ветку

    Dmitry V

    30.04.2021


    Автор

    На сайте Почты в разделе «Сообщить о проблеме на сайте» пишут стандартный набор часто задаваемых вопросов и ответов, формы обратной связи как таковой нет, есть номер телефона 8800, по которому идет диалог в стиле «Здравствуйте и всего вам хорошего!» Если подскажите, куда обратиться напрямую, буду признателен, т.к. собран целый букет багов, который хотелось бы передать разработчикам.

    Ответить

    Развернуть ветку

    Андрей Усов

    1.05.2021

    Тестировщик недоглядел 🤷🏻‍♂️ 
    Врядли местные представители почты поймут что вы имели ввиду)

    Ответить

    Развернуть ветку

    Читать все 8 комментариев

    • Все модули
    • Интеграция с сервисами
    • Интеграция с почтой России





    Интеграция с почтой России



    (4 отзыва)

    вернуться к списку обсуждений

    Валидация адреса

    • Дмитрий
      11 декабря 2017

      API почты россии по мимо прочего ещё и умеет производить валидацию адреса доставки. В данном модуле есть такое?

    • Артем
      26 декабря 2017

      Да, модуль использует нормализацию адреса через сервис Почты России перед передачей адреса в запросах на создание заказа к API почты. Без этого было бы много отказов по некорректному адресу.

    • Герман
      17 апреля 2019

      Он не работает. У Вас 500 полей в системе и не понятно куда даресс вообще писать

    • Артем
      17 апреля 2019

      Возможно вы что-то не настроили корректно, вы обращались в поддержку? Важно: Адрес нормализуется исключительно перед передачей адреса по API, т.е. в админке будет то, что клиент написал.

    Наличие ошибок в коде страницы сайта всегда влечет за собой негативные последствия – от ухудшения позиций в ранжировании до жалоб со стороны пользователей. Ошибки валидации могут наблюдаться как на главной, так и на иных веб-страницах, их наличие свидетельствует о том, что ресурс является невалидным. Некоторые проблемы замечают даже неподготовленные пользователи, другие невозможно обнаружить без предварительного аудита, анализа. О том, что такое ошибки валидации и как их обнаружить, мы сейчас расскажем.

    Комплексный аудит сайта, что входит, как сделать

    Ошибка валидации, что это такое?

    Для написания страниц используется HTML – стандартизированный язык разметки, применяемый в веб-разработке. HTML, как любой другой язык, имеет специфические особенности синтаксиса, грамматики и т. д. Если во время написания кода правила не учитываются, то после запуска сайта будут появляться различные виды проблем. Если HTML-код ресурса не соответствует стандарту W3C, то он является невалидным, о чем мы писали выше.

    Почему ошибки валидации сайта оказывают влияние на ранжирование, восприятие?

    Наличие погрешностей в коде – проблема, с которой необходимо бороться сразу после обнаружения. Поисковые системы «читают» HTML-код, если он некорректный, то процесс индексации и ранжирования может быть затруднен. Поисковые роботы должны понимать, каким является ресурс, что он предлагает, какие запросы использует. Особо критичны такие ситуации для ресурсов, имеющих большое количество веб-страниц.

    Как проверить ошибки валидации?

    Как проверить ошибки валидации
    Для этой работы используется либо технический аудит сайта, либо валидаторы, которые ищут проблемы автоматически. Одним из самых популярных является сервис The W3C Markup Validation Service, выполняющий сканирование с оглядкой на World Wide Web Consortium (W3C). Рассматриваемый валидатор предлагает три способа, с помощью которых можно осуществить проверку сайта:

    • ввод URL-адреса страниц, которые необходимо просканировать;
    • загрузка файла страницы;
    • ввод части HTML-кода, нуждающегося в проверке.

    После завершения проверки вы получите развернутый список выявленных проблем, дополненных описанием, ссылками на стандарты W3C. По ходу анализа вы увидите слабые места со ссылками на правила, что позволит самостоятельно исправить проблему.

    Существуют другие сервисы, позволяющие выполнить проверку валидности кода:

    • Dr. Watson. Проверяет скорость загрузки страниц, орфографию, ссылки, а также исходный код;
    • InternetSupervision.com. Отслеживает производительность сайта, проверяет доступность HTML.

    Плагины для браузеров, которые помогут найти ошибки в коде

    Решить рассматриваемую задачу можно с помощью плагинов, адаптированных под конкретный браузер. Можно использовать следующие инструменты (бесплатные):

    • HTML Validator для браузера Firefox;
    • HTML Validator for Chrome;
    • Validate HTML для Firefox.

    После проверки нужно решить, будете ли вы устранять выявленные ошибки. Многие эксперты акцентируют внимание на том, что поисковые системы сегодня уделяют больше внимания качеству внешней/внутренней оптимизации, контенту, другим характеристикам. Однако валидность нельзя оставлять без внимания, ведь если даже обнаруженные проблемы не будут мешать поисковым ботам, то они точно начнут раздражать посетителей сайта.

    Как исправить ошибку валидации?

    Как исправить ошибку валидации
    В первую очередь нужно сосредоточить внимание на слабых местах, связанных с контентом – это то, что важно для поисковых систем. Если во время сканирования было выявлено более 25 проблем, то их нельзя игнорировать из-за ряда причин:

    • частичная индексация;
    • медленная загрузка;
    • баги, возникающие во время непосредственной коммуникации пользователя с ресурсом.

    Например, игнорирование ошибок может привести к тому, что некоторые страницы не будут проиндексированы. Для решения рассматриваемой проблемы можно привлечь опытного фрилансера, однако лучшее решение – заказ услуги в веб-агентстве, что позволит исправить, а не усугубить ситуацию.

    Технический и SEO-аудит

    Выявление ошибок – первый шаг, ведь их еще нужно будет устранить. При наличии большого пула проблем целесообразно заказать профессиональный аудит сайта. Он поможет найти разные виды ошибок, повысит привлекательность ресурса для поисковых ботов, обычных пользователей: скорость загрузки страниц, верстка, переспам, другое.

    В заключение

    На всех сайтах наблюдаются ошибки валидации – их невозможно искоренить полностью, но и оставлять без внимания не стоит. Например, если провести проверку сайтов Google или «Яндекс», то можно увидеть ошибки, однако это не означает, что стоит вздохнуть спокойно и закрыть глаза на происходящее. Владелец сайта должен ставить во главу угла комплексное развитие, при таком подходе ресурс будет наполняться, обновляться и «лечиться» своевременно. Если проблем мало, то можно попробовать устранить их своими силами или с помощью привлечения стороннего частного специалиста. В остальных случаях лучше заказать услугу у проверенного подрядчика.

    Что такое ошибки валидации и как их исправить

    1

    При заполнении заказа, а также при редактировании профиля используется некий алгоритм проверки email.

    Однако при формировании заказа используется другой алгоритм, вероятно более строгий.

    В итоге покупатель получает ошибку при формировании заказа:

    9 комментариев

    • популярные
    • новые


    • +1

      Не может быть ящика русская@почта.рф. Только russkaya@почта.рф



      • +1

        Но, по факту, нет 100% способа проверить почту, не отправив на нее письмо. :(



      • +1

        Дополнительно, обнаружена, ошибка в обработке заказа:
        — Заказ в итоге создался с битой почтой. Это плюс.
        — Уведомления по правилам не прошли, видимо «упал» на отправке покупателю и дальше не пошел. Это МИНУС.

        — Корзина не очистилась. Это МИНУС.

        Видимо весь процесс «обломился». Но заказ в системе уже есть.

        — При дальнейших попытках продолжить заказ, каждый раз создается новая копия, хотя первый экземпляр наверняка «лежал в сессии».

        russkaya@почта.рф тоже не проходит по RFC, по мнению авторов движка.



        • +2

          Я бы вообще валидацию email’ов сделал отключаемой.

          Даже если адрес валидный, опечатываются. Пишут что-то типа ‘user@mai.ru’ (причем это 100% валидный адрес и домен с MX такой есть), ‘user@yndex.ru’ И так далее. И назывнии пользователя тоже опечатываются. Бывает и в телефонах цифры неверные ставят :) кстати, местами меняют или соседние шлепают :))

          Так что вся эта валидация в конечном итоге только помеха.

          Кстати, надо проверить ваш браузер нормально принимает input type=»email» с IDN? А то год назад авторы фреймворка зарубили мою идею использовать html5 типы для input’ов возражением о том, что не все браузеры корректно валидируют такие поля



          • +1

            То есть? Если какой-то браузер не поддерживает type=»email», то он просто отобразит обычный type=»text». И никаких проблем это не повлечет. Правда не ясно, как будет jquery работать в таких браузерах по селектору type=»». Ну в худшем случае переделать сам селектор.

            Правда оформление числовых типов/дат оставляет желать лучшего. И их использование спорно.



            • +1

              валидацией адреса в поле при input type=email занимается браузер. Один браузер поймет, например, IDN, а другой нет. Хотя мне это кажется очень сльной натяжкой…



              • +1

                Кириллические домены вообще являются уже признанной ошибкой. У обладателей таких обязательно есть и нормальные адреса. И они привыкли к тому, что их кириллические посылаются большинством валидаторов. С тем же успехом можно говорить о корявости верстки у юзеров с 800*600. А что? На компе, стоящем у меня в гараже, именно такое разрешение :)



                • +1

                  Мажор…

                  Впрочем у меня такой же… ВьюСоник

                  А насчет валидатора почты — война с мельницами сие. Слишком много вариантов. Простое решение — контрольный звонок в голову покупателю и уточнение адреса, если доставка сообщения не прошла…

                  P.S. Кирилические домены — зло + деньги на ветер.



                • +2

                  Коллеги, тема не про кириллические домены, а про ошибку при оформлении заказа.

                  Некорректный адрес вовсе не повод заворачивать оформление заказа, да при том еще таким «кривым» образом.

                  Мое предложение — принимать заказ у покупателя даже при условии ошибок с отправкой сообщений почтовых.

                  Добавить комментарий

                  Постановка задачи

                  Как известно, один и тот же адрес можно написать различными текстовыми способами, используя сокращения, перестановку, вариации наименований и т.п. Встаёт вопрос: существует ли процедура нормализации, отождествляющая реально одинаковые и по-разному записанные адреса?

                  Ответ положительный, чему и посвящена данная статья.

                  Какие средства в принципе есть для решения задачи? Их сейчас два: выделение именованных сущностей (NER) и объекты ГАР ФИАС. NER даёт разбиение на адресные элементы и их нормализацию, ГАР ФИАС может дать уникальные идентификаторы. Задача решается, если в качестве нормализации взять множество строк возможных нормализаций наименований элементов, добавив к ним GUID-идентификаторы ГАР, если получится. Два адреса эквивалентны, если хотя бы одна строка из множеств таких их строк совпадает.

                  А одними объектами ГАР ФИАС можно обойтись, используя только их идентификаторы? Конечно, нет. Во-первых, это не полный классификатор, особенно в части помещений и строений, хотя и постоянно пополняемый. Во-вторых, в адресах бывают специфические элементы, которые в ГАР отсутствуют (например, Московская область, Можайский район, примерно в 0,1 км по направлению на юг от ориентира середина д.Бараново, или пересечение улиц).

                  Итак, утверждается, что невозможно обойтись для адреса только одной нормализованной строкой для отождествления в общем случае. Но если таких строк будет несколько, причём сформированных определённым образом, то отождествление будет с очень высокой вероятностью.

                  Нормализация имён улиц

                  Если бы наименования адресных элементов писались одинаково, то проблемы бы наполовину не было. И дело даже не в ошибках, которые тоже возможны, а в сокращениях и вариативности. Рассмотрим примеры корректных названий: ул. Жукова, ул. имени Жукова, ул. М.Жукова, ул. Марш.Жукова, ул. Жукова Маршала, ул. Имени Четырежды Героя Советского Союза Жукова Георгия Константиновича (это реальный пример, а не шутка, когда в имени уместилась краткая биография) и т.д. Как бы сделать так, чтобы их отождествить…

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

                  • Наименование в общем случае состоит из вариантов текстовых значений и возможного номера. Например, «ул. Восьмого Марта» — это 8 и «МАРТА», «2-я ул. Соколиной горы» — это 2 и «СОКОЛИНОЙ ГОРЫ» + «СОКОЛИНАЯ ГОРА» + «ГОРЫ СОКОЛИНОЙ» + «ГОРА СОКОЛИНАЯ», «ул.10-я» — только номер 10. Всякие летия и годовщины тоже переводятся в одно число. Километры транслируются в числа с суффиксом «км» («на 59 км автодороги Санкт-Петербург — Псков«).

                  • Некоторые слова просто отбрасываются: «имени», «им.», «герой Советского Союза/России» и т.п.

                  • Для строкового значения формируется максимальное число возможных вариантов путём как перестановки слов, если их несколько, так и вариацией морфологических окончаний. Например, «на ул. Гороховой» непонятно, это ул. Гороховая, или ул. имени Гороховой (фамилия), поэтому формируются оба варианта: «ГОРОХОВОЙ» + «ГОРОХОВАЯ».

                  • Учитываются стандартные прилагательные (МАЛЫЙ, ВЕРХНИЙ, НОВЫЙ и т.п.) и их возможные сокращения, они всегда помещаются на первое место.

                  • Если имя состоит из 2-х слов, одно из которых имя, профессия или должность, а второе похоже на фамилию, то один из вариантов всегда должен быть этим вторым словом. Например, для «ул. Маршала Жукова» это «ЖУКОВА» + «МАРШАЛА ЖУКОВА» + «ЖУКОВА МАРШАЛА».

                  • Некоторые типы сокращений как разворачиваются, так и оставляются в исходном виде. Например, «ул. М.Жукова» — здесь сокращение может быть «МАЛАЯ», «МИХАИЛА», «МАРШАЛА» или что-либо ещё, заранее мы не знаем. Поэтому закладываем «МАЛАЯ ЖУКОВА», «М.ЖУКОВА», «ЖУКОВА».

                  Все эти эвристики направлены на то, чтобы на выходе получить максимальное число возможных нормализованных вариантов, по которым впоследствии можно производить сравнение. Теперь понятно, как могут быть отождествлены улицы из начала раздела: у всех них будет общая комбинация — «ЖУКОВА».

                  Не только названия обладают вариативностью, но и типы. Например, «Измайловский пр.» — это проезд или проспект? Оба типа возможны.

                  Итак, две улицы одинаковы, если у них совпадает тип, хотя бы одна из строк (если есть) и номера (если есть).

                  Структура адреса

                  Адрес представляет собой последовательность адресных элементов (далее, АЭ). В принципе, в произвольном порядке, хотя обычно начинают с высокого уровня (страны, региона), заканчивая низким (дома, квартиры). Приведём типизацию АЭ по уровням:

                  • Страна;

                  • Регион: край, область, города Москва, Санкт-Петербург, Севастополь (в ГАР уровень 1);

                  • Административный район (в ГАР уровень 2);

                  • Муниципальный район: городскоймуниципальный округ (в ГАР уровень 3, но в иерархии всегда принадлежит региону);

                  • Городскоесельское поселение, внутригородской район, межселенная территория (в ГАР уровень 4, всегда принадлежит муниципальному району);

                  • Город (в ГАР уровень 5);

                  • Населённый пункт: село, посёлок, деревня (в ГАР уровень 6);

                  • Элемент планировочной структуры: кварталы, зоны, массивы, территории садовых товариществ, организаций и т.п. (в ГАР уровень 7);

                  • Элемент улично-дорожной сети (в ГАР уровень 8);

                  • Земельный участок (в ГАР уровень 9);

                  • Здание, сооружение (в ГАР уровень 10);

                  • Относительный указатель (например, «Забайкальский край край, Александрово-Заводский р-н., ориентир 6100 метров на юго-запад от с.Онон-Борзя«, в ГАР отсутствует);

                  • Помещение, квартира, комната (в ГАР уровень 11);

                  • Машиноместо (в ГАР уровень 17);

                  Предположим, что мы умеем отождествлять АЭ каждого из уровней. Чтобы отождествить два адреса, нужно упорядочить АЭ в каждом из адресов и произвести последовательное сравнение. Если самые нижние по уровню АЭ совпадут, то адреса эквивалентны.

                  Здесь проблема в том, что некоторые АЭ в иерархии могут отсутствовать или наоборот. Например, в ГАР ФИАС в общем случае 2 типа иерархии — по административным районам и по муниципальным районам, и один АЭ может в принципе иметь 2-х разных родителей. Например, «Дагестан район Агульский село Амух» и «Дагестан муниципальный район Агульский сельское поселение сельсовет Амухский село Амух» — один и тот же АЭ в разрезе этих двух иерархий. А если в регионе село с таким именем уникально, то районы могут вообще не указывать: «Дагестан село Амух«. Таким образом, для тождественности АЭ должны не только совпадать сами по себе (по типам и наименованиями с вариациями), но и должно учитываться совпадение родительских АЭ вверх по иерархии.

                  Нормализация других объектов

                  Выше были описаны принципы нормализации улиц, то есть объектов уровня 8 в терминологии ГАР. Для имён вышележащих объектов используются похожие принципы: также формируются варианты, убираются лишние слова, нормализуются числа. Например, для «поселение Михайловский» (именно так правильно!) нужно «МИХАЙЛОВСКИЙ», «МИХАЙЛОВСКОЕ», «МИХАЙЛОВСКАЯ» (это уже перестраховываемся на всякий случай). Имена также слегка корректируются — убираются твёрдый и мягкий знаки, Ё переводится в Е, две одинаковые рядом буквы — в одну. В дальнейшем сравнение идёт с учётом возможного несовпадения одной буквы и т.д.

                  Для домов уровня 10 нормализация совсем другая. Здесь номер может в общем случае состоять из трёх элементов:

                  1. Номер дома владения домовладения;

                  2. Номер корпуса;

                  3. Номер строения сооружения литера;

                  Причём номер — это не только цифры, но и дроби, буквы и их комбинации, а бывают и вообще пустые («бн»). Здесь вариативность тоже большая. Рассмотрим на примере литеры А варианты написания: «литераА», «литА», «лит. а» или просто прикрепляют букву к номеру дома, сама буква может быть как на кириллице, так и на латинице и т.д. Здесь нормализация — это приведение значений к вышеуказанной 3-х элементной модели, после чего перевод в строку.

                  Для помещений уровня 11 ситуация попроще: номер один, но встречаются сложные буквенно-цифровые комбинации. Здесь также номер нормализуется и записывается строкой.

                  Если есть ГАР ФИАС, то информация из него позволяет в ряде случаев избавиться от неоднозначности. Например, понять, что «дом 10А» — это «дом 10 литера А», а «дом 10/1» — это «дом 10 квартира 1». Или «дом 10 к.1» — квартира или корпус.

                  Использование ГАР ФИАС

                  В настоящее время в ГАР ФИАС около 1.8 млн. объектов уровней 1-8, 49 млн. домов и участков и 54 млн. помещений. Их можно использовать для нормализации! Если удаётся адресный элемент привязать к объекту ГАР, то его уникальный GUID можно считать дополнительной строкой для сравнения (кстати, возможны несколько GUID из-за дублирования в самой базе). Это также избавит от от некоторых неоднозначностей, упомянутых выше.

                  При привязке следует использовать такие же алгоритмы нормализации. То есть текстовые описания ГАР объектов прогонять через тот же алгоритм нормализации, формируя множественные варианты написания при построении поискового индекса.

                  Такой способ позволит отождествить, скажем, переименованную улицу и улицу со старым названием (кстати, в свежей версии ГАР информация о переименовании отсутствует, к сожалению, хотя история объектов есть — а раньше старые названия были, по крайней мере, в ФИАС времён DBF).

                  Адрессарий — система идентификации адресов

                  Всё вышеизложенное позволяет выдвинуть идею адресного индекса (Адрессария). В него добавляются адреса, он разбивает адрес на элементы, пытается привязать их к уже существующим, если не получается, то добавляет их, достраивая тем самым внутри себя иерархическую систему адресов. Адресные элементы в Адрессарии имеют уникальные идентификаторы, так что его можно рассматривать как систему идентификации адресов.

                  Пропущенный через Адрессарий, адрес получает числовые идентификаторы его элементов. Два адреса совпадают, если равны идентификаторы его самых низкоуровневых элементов.

                  Если есть массив неструктурированных адресов, то его можно прогнать через Адрессарий, назначив адресам числовые идентификаторы, которые могут служить критерием эквивалентности адресов.

                  И это не в будущем, а есть уже сейчас!

                  SDK Pullenti Address

                  Всё вышеизложенное реализовано в SDK Pullenti Address:

                  • выделяет адреса как из произвольных текстов, так и из «текстового поля» с вычислением коэффициентов качества такого выделения;

                  • разбивает на адресные элементы и осуществляет нормализацию;

                  • привязывает к объектам ГАР ФИАС, причём работа с базой ведётся не через API к внешнему ресурсу, а со специально построенным индексом в локальной файловой системе, то есть может автономно работать в «закрытом контуре»;

                  • осуществляет поиск объектов ГАР по разным признакам;

                  • поддерживает работу с адресными индексами (Адрессариями);

                  • реализовано в виде SDK для языков C#, Java, Python и Javascript и распространяется в виде исходных кодов, не требующих для своего функционирования никаких сторонних библиотек и ресурсов;

                  • есть online-демонстрация на сайте, там же можно скачать свежие версии;

                  Автору на протяжении ряда лет несколько раз приходилось сталкиваться с задачей обработки адресов. Результаты этих столкновений оформлены в виде SDK и предлагаются Вашему вниманию.

                  Время прочтения: 5 мин.

                  Передо мной стояла задача сравнения большого количества адресов из разных баз данных с целью поиска совпадений. И единственным рациональным, на мой взгляд, решением было привести адреса к единому виду. Для нормализации адресов использован единый российский государственный адресный реестр — ФИАС, базы которого находятся в открытом доступе.

                  Набор инструментов.

                    Минимальный набор инструментов для реализации проекта:

                  — 60Гб – 100Гб свободного места

                  — Python 3+ и библиотеки elasticsearch,  simpledbf и pandas

                  — Еlasticsearch 7+

                  — Полная база данных ФИАС’а в dbf формате (https://fias.nalog.ru/Updates)

                  — Open Address Parser – проект для загрузки БД ФИАС’а и поиска в Elasticsearch  (https://github.com/shigabeev/address-segmenter#open-address-parser)

                  Подготовка к работе.

                  Скачиваем Open Address Parser. В репозитории находится подробная инструкция по установке необходимых компонентов.

                  В моем случае, ввиду некоторых ограничений, Elasticsearch был установлен напрямую, без Docker и Kibana. Запуск сервиса в такой ситуации происходит через «…Elasticsearchbinelasticsearch.bat». На шаге «3. Загрузить ФИАС в elasticsearch» необходимо запустить скрипт upload_fias.py в режиме отладки(Debug) или построчно из Jupyter Notebook, как советует автор. Предварительно следует распаковать архив БД ФИАС и указать путь к нему:

                  parser = argparse.ArgumentParser()
                  parser.add_argument('--fiasdir', default=r'путькфайлам*.dbf')
                  

                  Запускаем Elasticsearch и проверяем его работоспособность строкой в браузере:

                  http://localhost:9200/

                  Теперь выполняем скрипт upload_fias.py в режиме отладки(Debug), предварительно расставив точки останова на местах преобразования таблиц в «csv» формат и загрузки их в Elasticsearch.

                  Для получения информации по квартирам/офисам и земельным участкам, следует раскомментировать строки, в которых содержаться аргументы ‘ROOM*’ и ‘STEAD*’ соответственно. В рамках моей задачи они не нужны. Также следует раскомментировать строку с функцией load_elastic():

                  # Загрузка самой главной таблицы
                  # На первых порах её нам хватит. Остальные загружаются при надобности
                  # Занимает 2 часа
                  # FIXME
                  load_elastic(os.path.join(fias_csv_dir, 'ADDROBJ.csv'), 'fias', 'address')
                  

                  Если произошла критическая ошибка в процессе загрузки таблиц в Elasticsearch, следует удалить неполную таблицу из эластика по индексу (пример: index=»fias_full_text») и загрузить ее заново. Для повышения отказоустойчивости можно добавить следующие аргументы клиенту эластика:

                  es = Elasticsearch(timeout=30, max_retries=10, retry_on_timeout=True)

                  После успешного выполнения скрипта можно приступать к нормализации адресов.

                  Стандартизация адреса.

                  Пример нормализации адреса:

                  import api
                  addr = "РОССИЯ,197373,г. Санкт-Петербург,РАЙОН ПРИМОРСКИЙ,Город САНКТ-ПЕТЕРБУРГ,,Проспект ШУВАЛОВСКИЙ,д. 59,кор. 1,,кв. 9"
                  norm_addr = api.standardize(addr)
                  

                  На вход подается необработанный адрес с лишними словами и пунктуацией. Для понимания процесса стандартизации предлагаю ознакомиться с тем, что происходит внутри функции api.standardize(addr):

                  Рисунок 1. Функция api.standardize().

                  Для подготовки адреса к поиску в эластике автор использует следующие методы NLP:

                  • Регулярные выражения
                  • Токенизация по словам

                  Регулярными выражениями очищаем адрес от ненужных символов и знаков препинания, а также извлекаем индекс, если он есть. После удаления всего лишнего адрес готов к токенизации:

                  tokens = [‘россия’, ‘г’, ‘санкт’, ‘петербург’, ‘район’, ‘приморский’, ‘город’, ‘санкт’, ‘петербург’, ‘проспект’, ‘шуваловский’, ‘д’, ’59’, ‘кор’, ‘1’, ‘кв’, ‘9’] Теперь происходит распознавание токенов для извлечения номера дома, строения и других элементов:

                  Рисунок 2. Функция parsing.extract_house_tokens(tokens).
                  house_tokens = ['д', '59', 'кор', '1', 'кв', '9']
                  house_types = ['дом', 'число', 'корпус', 'число', 'квартира', 'число']
                  

                  Функция parsing.clarify_address(tokens, types) сопоставляет токены с их типом и возвращает словарь с информацией по дому:

                  house = {'дом': '59', 'корпус': '1', 'квартира': '9', 'Дом': '59', 'Корпус/строение': '1'}

                  И следом происходит отделение информации о доме от адреса:

                  address = 'РОССИЯ г Санкт Петербург РАЙОН ПРИМОРСКИЙ Город САНКТ ПЕТЕРБУРГ Проспект ШУВАЛОВСКИЙ '

                  С помощью запроса производим поиск в эластике по адресу. Найдя совпадение, мы получаем уникальный идентификатор адресного объекта(AOGUID) и по нему создаем поисковой запрос в эластик для конкретного дома/корпуса/строения.

                  В конечном итоге функция api.standardize() возвращает словарь с данными об  объекте: полный адрес, номер дома, корпус, строение, почтовый индекс и другую кадастровую информацию. В рамках задачи, функция api.standardize(string) была изменена и теперьвозвращает строку следующего вида:

                  return f"{dic['fullname']}|{dic.get('дом', ' ')}|{dic.get('корпус', ' ')}|{dic.get('строение', ' ')}"

                  Результат:

                  Вертикальная черта «|» разделяет полный адрес, номер дома, корпус и строение.

                  В таком виде будет происходить построчное сравнение адресов разных баз данных, с целью найти совпадения. На рисунке ниже представлен результат нормализации адресов автора проекта.

                  Рисунок 3. Пример нормализации.

                  Подробно ознакомиться с результатами автора можно в файле проекта «ref/references.xlsx».

                  Проблемы и недостатки.

                  Основная проблема заключается в «чистоте» исходных адресов. Вероятно, придется доработать функции токенизации и очистки адреса в «parsing.py» для конкретного случая.

                  Также в эластике могут отсутствовать некоторые адреса, номера домов, корпусов и строений, но они присутствуют на сайте ФИАС. В результате может быть получен неверный адрес. Это может быть связанно с ошибками при загрузке данных в эластик. Не исключены и ошибки в самой базе ФИАС.

                  Заключение.

                  В целом, данный проект подходит для нормализации адресов по стандарту ФИАС. С незначительной доработкой можно получить 90-95% точности нормализации. Дополнительно можно ознакомиться со статьей, где подробно разобрана структура БД ФИАС и показан пример импорта данных в реляционную базу PostgreSQL.

                  Понравилась статья? Поделить с друзьями:
                • Ошибка номер четыре на приоре
                • Ошибка номер три планар
                • Ошибка номер пять триколор тв
                • Ошибка номер с3472
                • Ошибка номер пять lada kalina