Как посчитать «похожесть» номеров в паспортах. И найти одинаковые даже с опечатками



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

    Раньше мы сравнивали номера документов строго: одинаковые — отлично, нет — извините. На ручной разбор из-за опечатки в номере уходили даже те карточки, у которых совпадали ФИО и адреса́ проживания. Такой подход излишне нагружал персонал заказчиков.

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

    Ввели коэффициент «похожести» номеров


    Делить номера паспортов и прочих документов на «совпадают-не совпадают» — слишком грубое решение. Можно действовать тоньше и отлавливать простые ошибки.

    Допустим, в компании работают такие правила поиска дубликатов (ДУЛ — документ, удостоверяющий личность):

    • «Полностью совпали ФИО, адрес и ДУЛ» — коэффициент дублирования — 100;
    • «Полностью совпали ФИО и ДУЛ» — 97;
    • «Полностью совпали ФИО и адрес» — 95
    • «Полностью совпали ФИО» — 80.

    Автоматика объединяет карточки с коэффициентом выше 97. Остальное когда-нибудь разберут руками специальные люди — дата-стюарды. Если повезет и дойдет очередь.

    Итог — в очереди на ручной разбор лежат вполне очевидные дубли. Даже те карточки, у которых ФИО и адреса совпадают, а номера паспортов отличаются распространенной опечаткой. Как в случае с 46 01 859473 и 45 01 859473 (клавиши 6 и 5 находятся рядом, их часто путают.) Дата-стюарды отвлекаются на простые опечатки, а реальные дубли выявляются медленнее.

    Посмотрев на происходящее, мы научили свои продукты считать «похожесть» номеров в документах. Заказчики уже используют новый параметр в правилах автоматического объединения дублей.

    Считаем «похожесть» по четким правилам


    Сравнивая документы, алгоритм первым делом чистит номера от мусора. Оставляет только буквы и цифры: A—Z, А—ЯЁ, 0–9. А дальше начинается магия, ради которой я написал эту статью — расчет коэффициента «похожести».

    Важная оговорка: коэффициент — не вероятность. Это число нужно, чтобы поделить дубли на группы с однотипными ошибками. Не важно даже, какова «похожесть» в абсолютном значении — это просто параметр сравнения номеров.

    А теперь — к правилам расчета.
    Правило Коэффициент «похожести» Пример Комментарий
    Полное совпадение 100
    • 46 07 324654;
    • 46 07 324654
    Тут и говорить не о чем, все понятно
    Трансграфика 100
    • АВ 4358333;
    • AB 4358333
    Трансграфика — это когда символы одного алфавита заменяют на такие же из другого.

    В первом случае символы кириллические, во втором — латинские.

    Типичная безобидная опечатка
    Одна распространенная опечатка 95
    • 50 16 631502;
    • 50 16 631602
    Распространенная опечатка — это когда символы близко расположены на одном из цифровых блоков клавиатуры или схожи по написанию.

    «Фактор» ищет распространенные опечатки по таблице «похожести», которую собрали наши аналитики. (Лучше качать скорее, пока коллеги не заставили убрать ссылку)
    Смена раскладки 94
    • AS 98787;
    • ФЫ 98787
    Работает, если в одной строке только цифры и кириллица, а в другой — только цифры и латиница. Иначе не похоже, чтобы человек добросовестно ошибся с раскладкой
    Замена римских цифр на арабские 93
    • XIX 987987;
    • 19 987987
    Работает только в начале строки. Логика такая: «честные» римские цифры могут быть только в серии, а серия — только в начале
    Одна нераспространенная опечатка 90
    • 1234 987987;
    • 3234 987987
    Нераспространенная опечатка — та, что не входит в таблицу распространенных
    Одна перестановка двух символов 90
    • 3554 463678;
    • 3554 466378
    Типичная опечатка, тут и добавить нечего
    Перепутаны пары символов 89
    • 12 34 987987
    • 34 12 987987
    Работает только для серий длиной от четырех символов.

    Считаем за опечатку, только если встретилась в начале строки. Это типичная ошибка операторов при вводе серии документа. И немудрено — на бланке серию печатают двумя парами цифр.

    В середине и конце строки такие перестановки — ошибка
    Один номер целиком входит в другой 88
    • 123456789;
    • 3456789
    Этим сравнением мы отлавливаем случаи «потеряли серию».

    Работает только для строк длиной от шести символов. Шесть символов — минимальная длина номера в известных нам документах.

    За опечатку считаем только в начале или в конце строки. Иначе вместо случайно обрезанного реквизита найдутся фрагментарные вхождения одних последовательностей в другие. Так можно и почтовый индекс внутри ИНН принять за добросовестную опечатку
    Две любые опечатки 80
    • 15 02 478643;
    • 15 05 478648

    Уже довольно близко к границе, но ошибки все еще походят на «честные» опечатки
    Все остальные случаи 0
    • 46 07 987987;
    • 32 34 987987
    Объяснять опечатками остальные расхождения опасно. Вероятность ошибиться слишком велика

    «Похожесть» берем параметром, когда ищем одинаковых клиентов


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

    При интеграции мы корректируем сценарии поиска дубликатов так, чтобы учитывать «похожесть» номеров в документах.

    Вернемся к типичным правилам поиска дубликатов, я описал их в начале:

    • «Полностью совпали ФИО, адрес и ДУЛ» — коэффициент дублирования — 100;
    • «Полностью совпали ФИО и ДУЛ» — 97;
    • «Полностью совпали ФИО и адрес» — 95
    • «Полностью совпали ФИО» — 80.

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

    • «Полностью совпали ФИО, адрес, ДУЛ» — 100;
    • «Полностью совпали ФИО, адрес, ДУЛ совпали на 90 и выше» — 98;
    • «Полностью совпали ФИО и ДУЛ» — 97;
    • «Полностью совпали ФИО и адрес» — 95;
    • «Полностью совпали ФИО» — 80.

    Автоматика по-прежнему «склеит» все карточки с коэффициентом выше 97. Но при новых порядках на ручной разбор не уйдут карточки, которые отличаются лишь опечатками в номерах документов. Явные дубли мгновенно схлопываются, а дата-стюарды разбирают действительно сложные случаи.

    Статья впервые вышла в блоге HFLabs.
    HFLabs
    Повышаем качество клиентских данных для бизнеса

    Комментарии 22

      0

      Не очень понятно из текста каким образом определяется какой из номеров считается оригинальным в таком случае? Или сохраняются оба, просто с ссылкой друг на друга?

        0
        Вопрос для целой статьи!

        Первым делом важно, что мы исходные данные ни в коем случае не удаляем, они остаются в своих записях. Объединяя дубли, мы создаем новую — «золотую» — карточку. И уже в нее пойдет номер и другие данные, которые алгоритмы признали «оригинальным».

        Решение о том, какой номер пойдет в «золотую» карточку, принимают алгоритмы MDM (master data management). У них вагон входных параметров, начиная с «веса» базы данных, из которой пришла каждая запись (у заказчиков обычно бывают более доверенные источники и менее доверенные). Есть еще свежесть данных, код качества данных (насколько условный номер паспорта или телефон похож на настоящий) и еще очень много разных параметров.

        Это если очень кратко объяснять.
          0

          Интересная задача.


          Вот интересно, слышал что в забугорье часто используются персональные номера (что-то между нашим ИНН и номером паспорта) и есть служба с API, в которой можно сверить эти данные на правильность. Но что самое интересное — эти номера содержат чек-сумму и проверяют на ошибку. Почему в России до такого не додумались? И вообще, номера и серия паспорта идут по порядку или все же кодируют какую-то информацию?


          Edit: служба с API — налоговая. Они же эти номера и выдают.

            +2
            Кто сказал, что не додумались? В ИНН и СНИЛС есть чек-сумма. Есть и всякие API, не для всех, конечно… а вот паспорт – это просто номер бумажки-бланка.
              0
              Если интересно почитать о сериях, номерах и других реквизитах паспорта, посмотрите на нашу предыдущую статью «Как проверить паспорт на действительность». Здесь не перескажешь — в ней много всего, особенно если с комментариями.

              Что до контрольных сумм — верно, в паспорте не хватает. В некоторых документах они есть, как подсказали выше. Еще говорят, что в паспорта недавно добавили машиночитаемую полосу с контрольной суммой, но мы пока с этим не разбирались.
                +1

                Да, там с контрольными суммами. Формат очень удобный, писал для него распознавание. Единственное — у серии нет одной цифры, пожертвовали, чтобы вписаться в международный формат. Подробное описание формата есть в приказе МВД: http://www.consultant.ru/document/cons_doc_LAW_284759/bc855030a3b448fca0965bbf45ee3ff7e77314e3/

          0
          Не совсем понятно, почему «Одна перестановка двух символов» имеет существенно меньший коэффициент похожести, чем «Одна распространенная опечатка». ИМХО, обе примерно схожи по природе и по частоте.

          Ну и ещё, зачастую номера документов имеют одну контрольную цифру. Можно добавить маркер «неверная контрольная цифра» как повышающий вероятность того, что случилась опечатка
            0
            Не совсем понятно, почему «Одна перестановка двух символов» имеет существенно меньший коэффициент похожести, чем «Одна распространенная опечатка». ИМХО, обе примерно схожи по природе и по частоте.

            Тут смотрите, какая штука. Мы скорим перестановку символов так же, как нераспространенную опечатку. Принципиально это одно и тоже.

            А распространенные опечатки — это те, которые мы за 15 лет выделили статистически как наиболее часто встречающиеся. Это как бы «сертифицированные» опечатки, что ли. Мы за эту группу можем поручиться, поэтому и коэффициент у них выше. За таблицей «похожести» — большой труд и опыт.

            Ну и ещё, зачастую номера документов имеют одну контрольную цифру. Можно добавить маркер «неверная контрольная цифра» как повышающий вероятность того, что случилась опечатка

            Все верно, просто мы пока до этого не дошли.
            0
            А здесь был ошибочный комментарий, который невозможно удалить
              +2
              Жена подала документы на учетку в налоговой. Сделали… ИНН ее, паспортные данные ее, а все остальные данные ее полной тезки (ФИО, дата рождения) из Самары: недвижимость (с адресом), долги по налогам и прочее. То что паспорта и прописка разные- никого не смутило. Для опротестования результатов предлагали ехать разбираться в Самару (из Московской области). Года два бодались, почти до суда дошли. Теперь у жены «голая» учетка: только ИНН и паспорт, никакой собственности, никаких долгов, ничего. Готовимся к второму кругу.
              На очереди третий. (За мной числится два объекта недвижимости (квартира), по одному адресу, с разными кадастровыми номерами. Пока плачу за оба)
              Потом четвертый круг: ОСАГО. Данные страховщикам предоставляет РСА. В семье две машины, в страховках по два водителя (я и жена). Водительские права у каждого в одном экземпляре, но коэффициент водителя для каждой машины свой!
              А скоро обязуют на электронные трудовые. Уже ничему не удивляюсь…
                0
                Что-то подобное регулярно случается, к сожалению. Мы и боремся за то, чтобы подобных случаев было меньше. С налоговой не работаем, но в госсектор понемногу заходим.

                Сил вам!
                0
                Судя по описанию вы построили систему основанную на правилах выведеных вручную. Насколько я понимаю у компании уже есть довольно много данных, на которых можно обучить модель, которая выведет все правила сама. При этом машинные правила могут учитавать больше нюансов в данных, например распространенность ФИО (для фамилии Кузнецов вероятность совпадения будет больше, чем для фамилии Вовк, например)
                Пробовали ли вы применять машинное обучение в своей области?
                  0
                  Это не моя система, это реальная жизнь. Самые реальные Федеральная налоговая служба, ГосУслуги, РСА, Ингосстрах. Их услугами вынужденна пользоваться вся Российская Федерация. Правда «Ингосстрах» тоже косвенно пострадавший — для расчетов он использует данные РСА, а претензии выслушивает от меня.
                    0
                    Машинное обучение не применяли. К сожалению, в нашем случае оно не имеет практического смысла.

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

                    Грубый пример навскидку. Допустим, на входе у нас граждане Иванов и Ованов. Машине справедливо кажется, что это люди с разной буквой в фамилии. Возможно, это опечатка.

                    Но мы знаем, что во вторую учетную систему данные вводят на латинице, поэтому Иванова вписывали как «Ovanov». А это совершенно другой коленкор, потому что I с O на клавиатуре находятся рядом. И вероятность опечатки выше, чем в случае с изначальными «Иванов» и «Ованов».

                    У другого же заказчика вообще другие правила и другие форматы хранения данных, и так у каждого.

                    Машинное обучение не подходит, увы, как бы нам ни хотелось.
                    0
                    ДУЛ
                    Спасибо, что не ВДУЛ
                      0
                      Возможно, мы к этому еще придем :)
                      0
                      Надеялся увидеть подобное решение:

                      var a = [1,4,7,3,4,9,8]; // Образец 1
                      var b = [1,4,7,3,5,9,8]; // Образец 2
                      var sum = 0;
                      var result = 0;

                      a.forEach((item, i)=> {
                      sum += Math.pow(item - b[i], 2);
                      });

                      // Чем больше result, тем менее похожи образцы. При полном совпадении result = 0.
                      // В данном случае result = 1, что означает минимальное отличие.
                      result = Math.sqrt(sum);
                        +1
                        У вас в случаях

                        b = [1,4,7,3,5,9,8];
                        и
                        b = [1,4,7,3,3,9,8];

                        результат одинаков, хотя набирая на маленькой клавиатуре одну ошибку допустить сложнее, чем другую

                        А для случая
                        var a = [1,4,7,3,4,9,8]; // Образец 1
                        var b = [1,4,3,7,4,9,8]; // Образец 2
                        у вас вообще «все плохо». Хотя просто 2 цифры местами поменяли при наборе
                          0
                          losse_narmo верно ответил — в жизни все намного сложнее, к сожалению. Не все опечатки равнозначны, об этом и публикация.
                          0
                          Не очень понятен исходный набор атрибутов. Если я правильно понял, описанный алгоритм применяется только к паспортам и даже там есть такой важный атрибут как ДР (дата рождения). Почему он не участвует в алгоритмах? Если же смотреть на тему чуть шире, то ДУЛы редко живут сами по себе. В компаниях есть другие идентифицирующие данные клиента, которые активно используются: email, тел., аккаунт на сайте компании или в соцсетях. Вы не применяете обогащение данных для повышения вероятности/качества идентификации?
                            0
                            Сравнивая клиентов, мы учитываем все о них известное: и дату выдачи ДУЛ, и адрес регистрации, и телефон, и рабочий адрес, и емейл, и другие свойства. Сравнение двух карточек выглядит примерно так:

                            • ФИО в двух клиентских карточках — совпадают.
                            • Адреса регистрации — разные.
                            • ДР — разные.
                            • Номера ДУЛ — разные.

                            Система видит: ФИО совпадают, значит, карточки могут быть дублями. Но остальные параметры различаются, поэтому коэффициент дублирования невысок — условно 70.

                            Теперь же мы добавили гибкости, и алгоритм заработал так:

                            • ФИО в двух клиентских карточках — совпадают.
                            • Адреса регистрации — разные.
                            • ДР — разные.
                            • Номера ДУЛ — совпадают с коэффициентом 95.

                            Тут ситуация уже совершенно другая: системе видит, что ФИО одинаковые и ДУЛ наверняка тоже. Поэтому она посчитает карточки дублями с коэффициентом 90.

                            А дальше уже включают правила объединения. Кто-то из заказчиков все равно отправит оба варианта на ручной разбор. Другие же коэффициент 90 считают достаточным для автоматического слияния.
                              0
                              … считают достаточным для автоматического слияния

                              Вот так одного товарища и «слили».
                              Пришли к нему приставы и требуют погашения алиментов на сумму приближающуюся к миллиону… возможно, что сверху.
                              А он понять не может. Женат, не разводился, детей на стороне не имеет…

                              Оказалось, что его перепутали с другим полным тезкой. А этот тезка уже несколько лет любуется небом в клеточку, вот алименты и не платит.
                              Но мало того, что его перепутали. Их в самом деле по какой-то картотеке «слили» в одно лицо. Места работы, проживания, судимости — все идет сквозняком по обоим сразу. И разделить не торопятся. Ибо не предусмотрена такая процедура.

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

                              А у меня дочь в ФОМС «слили» с кем-то… Человек родился в том же городе и в тот же день (год другой), что и она. ФИО совсем другое, но где-то вышла ошибочка и номер полиса забили у него такой же.
                              Но т.к. она в том городе уже не жила давно, то территориальные отделения ФОМС были разные. И они больше года не могли договориться, что делать. Все это время ей каждый месяц выдавали временный полис.

                              Потом заменили полис совсем.

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое