Обнаружение опечаток в email
Обнаружение опечаток (typo detection) - функция валидатора, которая находит вероятные ошибки ввода в email-адресе и предлагает исправление. Вместо того чтобы просто отклонить user@gmial.com, система подсказывает: «Вы имели в виду gmail.com?»
Масштаб проблемы
Опечатки в email встречаются чаще, чем кажется. По данным сервисов валидации, 2-4% адресов в формах подписки содержат ошибки. На базу из 100 000 подписчиков это 2-4 тысячи потерянных контактов.
Большинство опечаток приходятся на доменную часть. Люди пишут «gamil» вместо «gmail», «ynadex» вместо «yandex», «hotmial» вместо «hotmail». Реже встречаются ошибки в локальной части (имени ящика) - их сложнее выявить, потому что валидатор не знает правильное написание имени конкретного пользователя.
Как работает технически
Базовый подход - сравнение доменной части с базой известных почтовых провайдеров. Алгоритм вычисляет «расстояние» между введённым доменом и каждым доменом из базы. Если расстояние маленькое (одна-две замены символов), система считает это опечаткой и предлагает правильный вариант.
Для вычисления расстояния используют алгоритм Левенштейна или расстояние Дамерау-Левенштейна (учитывает транспозицию соседних символов - частую причину опечаток). Порог обычно - 1-2 правки. При расстоянии 3 и больше совпадение случайно, и предлагать замену рискованно.
Продвинутые системы учитывают раскладку клавиатуры. Буквы, расположенные рядом на клавиатуре, чаще путают. Замена «a» на «s» вероятнее, чем «a» на «p». Это помогает ранжировать варианты исправления, когда кандидатов несколько.
Типичные паттерны опечаток
Где применять
Лучшее место для typo detection - формы ввода email на стороне клиента. Пользователь вводит адрес, теряет фокус с поля, и рядом появляется подсказка: «Возможно, вы имели в виду gmail.com?» с кнопкой «Исправить».
Подсказка не должна быть навязчивой. Пользователь может осознанно использовать редкий домен, похожий на популярный. Кнопка «Нет, оставить как есть» должна присутствовать всегда.
При пакетной проверке typo detection тоже полезен, но работает иначе. Валидатор помечает адрес как «вероятная опечатка» и предлагает вариант исправления. Решение об изменении остаётся за оператором - автоматически менять адреса в базе рискованно.
Опечатки в локальной части
Если доменные опечатки хорошо ловятся по базе провайдеров, то ошибки в имени ящика - сложнее. Валидатор не знает, что правильно: «j.smith» или «jsmith». Единственный способ - SMTP-проверка. Если jsmth@gmail.com возвращает 550, а домен корректный, система может предположить опечатку в локальной части, но не предложит конкретного исправления.
Отдельная категория - удвоение символов. Люди случайно нажимают клавишу дважды: userr@mail.ru вместо user@mail.ru. Некоторые валидаторы проверяют варианты с удалением дублирующих символов, но этот подход работает ненадёжно: «oo» в «yahoo» не опечатка.
Open-source решения
Для фронтенда существует библиотека mailcheck.js - она сравнивает домен с предустановленным списком и показывает подсказку. Библиотека не обновлялась давно, но принцип работы прост, и её легко форкнуть.
На бэкенде Python-пакет email-validator выполняет синтаксическую проверку, но не включает typo detection. Для полной цепочки (синтаксис + опечатки + DNS + SMTP) проще использовать API сервиса валидации.
uChecker обнаруживает опечатки в доменной части адреса и возвращает предложение по исправлению в поле did_you_mean. Используйте это при real-time проверке на формах, чтобы сохранить подписчиков, которые ошиблись на одну букву.
