Определяне на пола по пълно име - когато точността е наистина важна

Преди време се заинтересувах от задачата за определяне на пола на човек по пълното му име. В този момент работех в областта на здравното осигуряване, където този проблем беше наистина актуален - цената на осигурено лице, а оттам и тарифите, по които хората се приемат за осигуряване, в зависимост от пола на клиента, можеха да се различават няколко пъти. Повечето от договорите са фирмени, осигурените са служители на работодателя.

Повечето от тях никога не сме ги виждали на живо, имахме само списъци на осигурените лица, където полът понякога беше посочен (с много грешки), но по-често изобщо не беше посочен. Повечето компании имат своя специфика на работа и професионални традиции, поради което в екипите им преобладават хора от един и същи пол. Дори една малка грешка може да направи потенциално печеливш договор неизгоден (или обратното, но това, по странно съвпадение, се случва на нашите клиенти много по-рядко). Като цяло, с портфолио от договори от няколко милиарда и типичен брой грешки от около процент, цената на правилното определяне на пола по пълно име беше в района на няколко десетки милиона. В Runet темата за определяне на пола по пълно име вече е повдигната повече от веднъж, но в повечето случаи всичко се свежда до препоръка внимателно да се погледне края на бащиното име („vich“ / „vna“) или да се използват някои подобни ръчно намерени модели. За съжаление в моята ситуация този метод не беше подходящ - сред застрахованите имаше много, наистина много чужденци. Правилното изписване на бащиното им име не съдържаше никакви знаци за желания край (а в някои случаи самото бащино име липсваше).

Ето защо, за да реша проблема, реших да използвам статистически подход - да определя съществуващата клиентска базакакъв пол обикновено принадлежат на хората с изискваното фамилно име, име и бащино име и според тези данни причисляват нови осигурени лица към един или друг клас. Ако част от пълното име принадлежеше предимно на мъже, получих +1 точка, ако жените - минус една точка, ако беше приблизително равно - бяха присъдени 0 точки. Резултатът и за трите части се сумира и ако сумата е по-голяма или равна на +2, полът се определя като мъжки; по-малко или равно на -2 - като женски; в противен случай се смяташе, че полът не може да се определи и е необходимо да се изчисли по други методи.

Колкото и да е странно, такъв много прост алгоритъм направи възможно постигането на невероятна точност - на извадка от няколкостотин хиляди души (с тренировъчна база от милион и половина) бяха направени само 6 грешки (които ще бъдат описани по-долу и всяка от които, доста вероятно, би направил и жив човек).

Някои подробности за предварителното обучение на извадката за обучение:

  • Всички пълни имена трябва да съдържат или само кирилица, или само латиница;
  • Разрешени са само букви, интервали, тирета и единични кавички. Всички други символи трябва или да бъдат премахнати, или заменени с такива, близки до тях. Не трябва да има интервали между тирето и буквите близо до него;
  • Всички букви трябва да са с еднакъв регистър (или всички трябва да имат първата буква с главна буква, останалите трябва да са малки);
  • Между частите на пълното име трябва да има само единични интервали, не трябва да има допълнителни интервали от краищата на пълното име;
  • Разделянето на реда с пълното име на три части се извършва от първия и втория интервал. Ако има само две части, бащиното име е нула, ако са повече от три, бащиното име е всичко след втория интервал.
Тъй като написах цялата логика на PL / SQL, не качвам целия пакет с внедряването на алгоритъмаЩе го направя - тя е много свързана с вътрешната структура на базата данни и характеристиките на съхранение на данни, но бих искал да спомена няколко функции:

Тъй като всеки път, когато се изисква да се определи пола на дадено лице, преминаването през таблицата на контрагентите с всички записи отнема много време, поставих обобщена информация за честотите на срещане на определена част от пълното име в съхранените данни в спомагателна таблица. Изглежда като четири параметъра - [част от пълното име - тип (F, I или O) - пол - брой записи в базата данни]. Статистиката се актуализира ежеседмично, автоматично.

За да определя какво съотношение на мъже и жени за една част от пълното име се счита за достатъчна причина за приписването му на определен пол, използвах следната функция:

Ако не е възможно да се определи пола по пълното име (общата стойност на оценките е в диапазона [-1;1]), тогава в повечето случаи можете да пренебрегнете фамилията и да използвате само собственото име - със същия критерий за коректност на работата (+2 - мъж, -2 - жена, в противен случай - полът не е дефиниран). Това помага да се заобиколят ситуации, при които неизменно фамилно име като „Тимошенко“ погрешно се приписва на един пол, докато даденото име и бащино име принадлежат на противоположния.

Грешки в алгоритъма. Открих три ситуации, при които алгоритъмът може да доведе до неправилен резултат:

  1. азиатци. В китайския език няма официални знаци, които да позволяват да се даде име на определен пол. Това вероятно се отнася за някои други езици (поне мога да предположа, че това е за тайландски, виетнамски и корейски). Невъзможно е да се определи пола по име. Тази причина е отговорна за 3 от 6 грешки, открити във функцията.Средно броят на мъжете и жените с азиатски имена се оказва равен, но някои (предимно редки имена и фамилии) принадлежат напредимно от един пол. Трудно е да се предложи някакво просто решение, различно от допълнително събиране на статистика, но това няма да реши проблема напълно. Трудно, но сравнително надеждно решение е да се напише функция, която определя дали името е азиатско или не (все още не съм го направил, но съдейки по разговора ми с колега преводач е възможно) и да върне 0 за всички азиатци, независимо от събраната статистика.
  2. Инициали. В някои случаи пълното име се въвежда в базата данни под формата на "Иванов I I". Отделните букви се възприемат от функцията като име и бащино име, те участват в общата статистика и влияят върху решението за пола на дадено лице. При въвеждане на ново лице с пълно име като „Ковалчук ​​О.И.“ в базата данни може да има несъответствия между реалния пол и изчисления. Тази причина е отговорна за една грешка от шест открити. Можете да се справите с такива грешки, например, като присвоите нулев пол на еднобуквени фамилни имена за имена и бащини имена, независимо от събраната статистика.
  3. Имена, които се използват значително по-често от единия пол, отколкото от другия, или чиято употреба варира в различните държави. Открити са две грешки от шест. Пример (леко изкривих истинските имена, на които е възникнала грешката, за да не разкривам лични данни): Мохамад Сюлейман Фархонда (жена) и Саша Александър Джеферсън (жена, гражданин на САЩ). Не знам дали е възможно да се коригират такива случаи алгоритмично, затова просто добавих тези имена към таблицата с изключения.
Как са търсени грешките на функцията: въведена е забрана за въвеждане на нови осигурени лица с пол, различен от определения от функцията в базата данни на компанията. При подобна грешка служителите на компанията са се свързали с организацията, предоставила списъците на осигурените, и са уточнили с нея реалния пол на лицето. ТакаПо този начин всички случаи на несъответствие между реални и изчислени данни бяха обработени ръчно. Общият брой на преминалите такъв тест е около 250 хиляди души.

За съжаление, този метод не е сребърен куршум, той просто е по-добър от всеки друг, който съм срещал. Тествах метода в множество бази данни в различни компании. Недостатъците включват факта, че за някои хора поради недостатъчна статистика е невъзможно да се определи пола по пълно име: на базата на 1,5 милиона души има малко повече от 1% от тези хора, на базата на 300 хиляди души има около 3% от тях, на базата на 6 милиона души не беше възможно да се определи пола за 0,8%. Имам предположение, че процентът на хората, на които не може да се определи пола, е обратно пропорционален на корена от размера на обучителната извадка, но нямам обяснение - защо е точно така. Разбира се, процентът на хората, за които може да се определи полът, може да се увеличи (и дори да се доведе до почти 100%) чрез задаване на по-облекчени условия за това кога човек може да получи произволен пол, но за задачите, с които работих, точността беше по-важна от 100% присвояване на един от двата класа.

Друг недостатък, от който страда този метод, е лошото справяне с печатни грешки. Въпреки факта, че някои от тях са съвсем стандартни (името "Олга" е по-често срещано от, например, съвсем правилното "Октябрина"), статистиката ще липсва за повечето правописни грешки => не винаги ще бъде възможно да се определи пола с такова име. За съжаление, обратното твърдение (ако името, което търсите, никога не е било намерено в базата данни, значи е изписано неправилно) не е вярно - хората с уникални имена са не по-малко, отколкото печатните грешки в имената на обикновените хора.

Като всеки инструмент, този има функции, за които не мислите, когато създавате.

  1. Написаностатистика ви позволява да търсите имена, изписани с грешки от определен тип. Ако едната част от пълното име, според събраната статистика, е с един пол, а другата с друг, вероятно има правописна грешка. Пример е "Иванова Наталия Сергеевна". В този случай най-вероятно е направена печатна грешка в фамилното име - буквата „а“ в края е забравена.
  2. Ако повечето от данните в обучителната извадка са представени главно в един формат (F-I-O), тогава въз основа на събраните данни става възможно да се търсят пълни имена, написани в различен ред (например I-O-F) - просто въз основа на това коя част от пълното име обикновено принадлежи към желаната част. Това може да е важно, ако компанията провежда пощенски съобщения в духа на „Уважаеми Олег Константинович!“.
  3. В случаите, които съм наблюдавал на практика, процентът на грешки в обучителната извадка не влияе нито върху точността на прогнозата, нито върху броя на имената, които не могат да бъдат приписани на един или друг клас. В един от случаите, с които се занимавах, процентът на грешки в пола в обучителната извадка беше около 4%, след коригирането им и повторното събиране на статистика, броят на имената, за които не беше възможно да се определи пълното име, се промени с по-малко от 1%.

Hardcore conf в C++. Каним само професионалисти.