Как найти пользователя в базе данных по старым наблюдениям при изменении характеристик
Что проверяют
Какую задачу вы увидите за вопросом: хранение истории атрибутов или сопоставление записей без общего ключа (entity resolution). Следом обычно спрашивают, как вы оцените качество склейки и что дороже для бизнеса: ложное объединение или пропуск.
Как отвечать
Сначала уточните, есть ли стабильный идентификатор. От этого зависит всё решение.
Если ID есть, а меняются атрибуты, это задача хранения. В хранилище делают SCD второго типа: каждая версия строки получает valid_from/valid_to, и старое наблюдение соединяется с версией, действовавшей на его дату (point-in-time join, в pandas merge_asof). Так же устроены feature store, чтобы признаки на обучении совпадали с тем, что модель видела бы в тот момент.
Если ID нет, это record linkage:
- нормализация: регистр, транслитерация, телефоны к одному формату, возраст заменить годом рождения;
- блокировка: сравнивать пары только внутри блоков (одна фамилия по фонетическому ключу, один город), иначе число сравнений растёт как квадрат от числа записей;
- сходство полей: Jaro-Winkler и Левенштейн для имён, точное совпадение для хэша почты или токена карты;
- модель пары: вероятностная Fellegi-Sunter или классификатор на размеченных парах, порог подбирается по precision и recall;
- кластеризация: пары выше порога собираются в сущности через связные компоненты.
Готовые инструменты на Python: Splink, dedupe, recordlinkage. Качество оценивают на размеченной выборке пар, отдельно смотрят долю ложных склеек.
Где спотыкаются
Ищут по старым значениям в лоб: WHERE age = old_age OR city = old_city. Возраст меняется каждый год, а условие через OR возвращает тысячи чужих людей.
Предлагают KNN по всем признакам без блокировки и нормализации. На миллионе пользователей это не считается, а масштаб признаков сам решает за вас, какие поля важны.
Не видят транзитивности: A похож на B, B похож на C, и через цепочку в одного человека сливаются сотни записей. Нужны ограничения на размер кластера и ручная проверка крупных.