Визначення статі по ПІБ – коли точність дійсно важлива

Деякий час тому мене зацікавила завдання визначення статі людини за його ПІБ. В той момент я працював в галузі медичного страхування, де ця проблема була дійсно актуальна – витрати на одного застрахованого, а значить і тарифи, за якими людей приймали на страхування, в залежності від статі клієнта, могли відрізнятися в кілька разів. Велика частина договорів – корпоративні, застраховані є співробітниками роботодавця.

Ми ніколи не бачили більшість з них в очі, все, що ми мали – списки застрахованих, де підлога іноді був зазначений (з великою кількістю помилок), але частіше – не вказано взагалі. Більшість компаній мають свою специфіку роботи та професійні традиції, в силу чого, в їх колективах переважають люди однієї статі. Навіть невелика помилка могла зробити потенційно прибутковий договір збитковим (або навпаки, але на таке, за дивним збігом обставин, траплялося з нашими клієнтами набагато рідше). В цілому, при обсязі портфеля договорів у кілька мільярдів, і характерному кількості помилок близько відсотка, ціна коректного визначення статі по ПІБ була в районі декількох десятків мільйонів.

У рунеті тема визначення статі по ПІБ піднімалася вже неодноразово, але, в більшості випадків, все зводилося до рекомендації уважно дивитися на закінчення по батькові («віл»/«вна») або використовувати якісь подібні знайдені вручну закономірності. На жаль, в моїй ситуації цей метод не підходив – серед застрахованих було багато, дійсно багато, іноземців. Правильне їх написання по батькові не містило жодних ознак шуканого закінчення (а в деяких випадках відсутнє і саме по батькові).

Тому для розв'язання задачі я вирішив використовувати статистичний підхід – за існуючої бази клієнтів визначати до якого підлозі зазвичай належать люди з шуканими прізвищем, ім'ям та по батькові і, за цими даними, відносити нових застрахованих до того чи іншого класу. Якщо частина ПІБ належала переважно чоловікам – я нараховував +1 бал, якщо жінкам – мінус один бал, якщо було приблизно порівну – нараховувалося 0 балів. Результат по всім трьом частинам складався і, якщо сума була більше або дорівнює +2, підлогу визначався як чоловічий; менше або дорівнює -2 – як жіночий; в іншому випадку вважалося що підлогу визначити не вдалося і потрібно розраховувати його іншими методами.

Як не дивно, подібний, дуже простий алгоритм, що дозволив добитися приголомшливої точності – на вибірці в кілька сотень тисяч чоловік (при базі для навчання в півтора мільйона) було допущено всього 6 помилок (які будуть описані нижче, і кожну з яких, цілком ймовірно, жива людина теж зробив би).

Деякі подробиці попередньої підготовки навчальної вибірки:

  • Всі ПІБ повинні містити у своєму складі лише кирилицю, або тільки латиницю;
  • Допустимі тільки літери, пробіли, тире та символ одинарних лапок. Всі інші символи мають бути видалені або замінені на близькі їм. Між дефісом і близькими до нього літерами повинні бути відсутні прогалини;
  • Всі букви повинні бути в одному регістрі (або всі повинні мати першу букву – головну, решта – малі);
  • Між частинами ПІБ повинні бути тільки одинарні прогалини, з країв ПІБ не повинно бути зайвих пробілів;
  • Поділ рядка з ПІБ на три частини здійснюється по першому і другому прогалині. Якщо частини всього дві – по батькові дорівнює null, якщо більше трьох – батькові це все, що після другого пробілу.
Оскільки всю логіку я писав на PL/SQL, то викладати цілком пакет з реалізацією алгоритму я не буду – він дуже зав'язаний на внутрішню структуру бази і особливості зберігання даних, однак я хотів би згадати кілька особливостей:

Оскільки кожен раз, коли потрібно визначити стать людини, пробегаться по таблиці контрагентів з усіма записами довго, то агреговану інформацію про частоти появи певної частини ПІБ в збережених даних я розмістив в допоміжній таблиці. Виглядає це як четвірка параметрів – [частина ПІБ – тип (Ф., І або О)– пол – кількість записів в базі]. Статистика оновлюється щотижня автоматично.

Для визначення того, яке співвідношення чоловіків і жінок для однієї частини ПІБ вважати достатньою підставою для віднесення його до тієї чи іншої статі, я використовував наступну функцію:

-- за кількістю чоловіків (перший параметр) і жінок (другий параметр) визначає стать
-- +1 - чоловік
-- 0 - не відомо
-- -1 - жінка
function get_sex_by_cnt (mcnt number, fcnt number) return number
is
begin
if mcnt=fcnt then return 0; end if; -- очевидна невизначеність
if mcnt<=2 and fcnt<=2 then return 0; end if; -- занадто мало інформації для аналізу
if mcnt>=3 and fcnt=0 then return 1; end if; -- обробка нулів номер 1
if mcnt=0 and fcnt>=3 then return -1; end if; --обробка нулів номер 2
if mcnt/fcnt>0.5 and mcnt/fcnt<2 then return 0; end if; -- перевагу однієї статі не вирішує
if mcnt>fcnt then return 1; end if; -- ну і нарешті. очевидно чоловік
if mcnt<fcnt then return -1; end if; -- очевидно жінка
end; -- get_sex_by_cnt

Якщо по ПІБ визначити стать не вдалося (сумарне значення оцінок у діапазоні [-1;1]), то, в більшості випадків, можна знехтувати прізвищем і використовувати тільки ІО – з тим же критерієм коректності роботи (+2 – чоловік, -2 – жінка, інакше – пол не визначений). Це допомагає обійти ситуації, коли незмінна прізвище кшталт «Тимошенко» помилково приписується одному полу, а ім'я та по батькові належать протилежного.

Помилки алгоритму. Я виявив три ситуацій, коли алгоритм може видати некоректний результат:

  1. Азіати. У китайській мові відсутні формальні ознаки дозволяють віднести ім'я до певної статі. Ймовірно, сказане відноситься і до деяких інших мов (як мінімум, можу припустити це про тайський, в'єтнамський і корейська) тобто по ПІБ визначити стать неможливо в принципі. Дана причина відповідальна за 3 виявлені помилки роботи функції з 6. У середньому, число чоловіків і жінок з азіатськими іменами виявилося одно, проте деякі (в основному рідкісні імена і прізвища) належали переважно одному підлозі. Якогось простого рішення, крім подальшого набору статистики важко запропонувати, проте це не вирішить проблему повністю. Важкий, але відносно надійне рішення — можна написати визначальну функцію – є ім'я азійським чи ні (я ще не зробив цього, але, судячи по моїй розмові з колегою перекладачем, це можливо) і для всіх азіатів повертати 0 незалежно від зібраної статистики.
  2. Ініціали. У деяких випадках ПІБ заноситься у базу у вигляді «Іванов І І». Окремі літери сприймаються функцією як ім'я та по батькові, вони беруть участь в загальній статистиці та впливають на прийняття рішення про поле людини. При занесенні в базу нової людини з ПІБ на кшталт «Ковальчук О І» можуть виникнути розбіжності реального підлоги з обчисленим. Ця причина відповідальна за одну помилку з виявлених шести. Боротися з такими помилками можна, наприклад, привласнюючи однолітерним прізвищ імен та по батькові нульовою підлогу незалежно від зібраної статистики.
  3. Імена, які значно частіше використовує один підлога, ніж інший або практика застосування яких відрізняється в різних країнах. Дві помилки з виявлених шести. Приклад (я трохи спотворив реальні імена, на яких виникла помилка, щоб не розголошувати персональні дані): Мохамад Сулейман Фархонда (жінка) і Саша Олександр Джеферсон (жінка, громадянка США). Я не знаю, можливо подібні випадки виправити алгоритмічно, тому просто додав ці імена в таблицю винятків.
Як шукалися помилки роботи функції: було встановлено заборону на занесення в базу компанії нових застрахованих підлогою відмінним від певного функцією. У разі виникнення подібної помилки, співробітники компанії зв'язувалися з організацією надала списки застрахованих і уточнювали у неї реальний стать людини. Таким чином, всі випадки розбіжності реальних і розрахункових даних оброблялися в ручному режимі. Загальна кількість людей, що пройшли таку перевірку – близько 250 тис.

На жаль, даний метод не є срібною кулею, він просто краще всіх інших, які я зустрічав. Я тестував метод на декількох базах даних у різних компаніях. До мінусів можна віднести те, що для частини людей із-за недостатньої статистики визначити підлогу по ПІБ не можна: на базі в 1,5 млн осіб таких людей трохи більше 1%, на базі 300 тис осіб таких близько 3%, на базі в 6 млн людина не вдалося визначити стать для 0,8%. У мене є припущення, що відсоток людей, для яких стать не може бути визначений, обернено пропорційний кореню з розміру навчальної вибірки, але жодного пояснення — чому саме так відбувається, у мене немає. Звичайно, відсоток людей, для яких підлога може бути визначений можна збільшити (і навіть довести майже до 100%) встановивши більш м'які умови, коли людині можна присвоїти будь-якої підлогу, але для завдань, з якими я працював, була важливіше точність, ніж 100%-ве віднесення до одного з двох класів.

Інший недолік, якого схильний даний метод – погана робота з друкарськими помилками. Незважаючи на те, що деякі з них досить стандартні (ім'я «Олга» зустрічається частіше, ніж, наприклад, цілком правильне «Октябрина»), для більшості помилок статистика буде відсутня => визначити підлогу по такого імені не завжди можливо. На жаль, зворотне твердження (якщо шукане ім'я ще жодного разу не зустрічалося в базі, отже воно написано не правильно) не вірно – людей з унікальними іменами не менше, ніж помилок в іменах звичайних людей.

Як і у будь-якого інструменту, у цього є особливості, про які не замислюєшся при створенні.

  1. Набрана статистика дозволяє шукати імена написані з помилками певного типу. Якщо одна частина ПІБ згідно набраної статистикою має один підлогу, а інша – іншого, ймовірно має місце друкарська помилка. Приклад – «Іванов Наталія Сергіївна». В даному випадку, найбільш ймовірно, що допущена помилка у прізвищі – забута буква «а» в кінці.
  2. Якщо більша частина даних в обучащей вибірці буде представлена переважно в одному форматі (Ф-І-О), то спираючись на зібрані дані з'являється можливість шукати ПІБ написані в іншому порядку (наприклад, І-O-Ф) – просто на основі того, до якої частини ПІБ зазвичай належить шукана частина. Це може мати значення, якщо компанія проводить розсилки в дусі «Шановний Олег Костянтинович!».
  3. В тих випадках, які я спостерігав на практиці, відсоток помилок в навчальній вибірці не впливає ні на точність прогнозу, ні на кількість імен, які не вдалося віднести до того чи іншого класу. В одному з випадків, з якими я мав справу, відсоток помилок визначення статі в навчальній вибірці був близько 4%, після їх виправлення і повторного збору статистики кількість імен для яких не вдалося визначити ПІБ, змінилося менше ніж на 1%.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.