Некоторое время назад меня заинтересовала задача определения пола человека по его ФИО. В тот момент я работал в области медицинского страхования, где эта проблема была действительно актуальна – расходы на одного застрахованного, а значит и тарифы, по которым людей принимали на страхование, в зависимости от пола клиента, могли отличаться в несколько раз. Большая часть договоров – корпоративные, застрахованные являются сотрудниками работодателя.

Мы никогда не видели большинство из них в глаза, все, что мы имели – списки застрахованных, где пол иногда был указан (с большим количеством ошибок), но чаще – не указан вообще. Большинство компаний имеют свою специфику работы и профессиональные традиции, в силу чего, в их коллективах преобладают люди одного пола. Даже небольшая ошибка могла сделать потенциально прибыльный договор убыточным (или наоборот, но на такое, по странному стечению обстоятельств, случалось с нашими клиентами гораздо реже). В целом, при объеме портфеля договоров в несколько миллиардов, и характерном количестве ошибок около процента, цена корректного определения пола по ФИО была в районе нескольких десятков миллионов.

В рунете тема определения пола по ФИО поднималась уже неоднократно, но, в большинстве случаев, все сводилось к рекомендации внимательно смотреть на окончание отчества («вич»/«вна») или использовать какие-то подобные найденные вручную закономерности. К сожалению, в моей ситуации этот метод не подходил – среди застрахованных было много, действительно много, иностранцев. Правильное написание их отчества не содержало никаких признаков искомого окончания (а в некоторых случаях отсутствовало и само отчество).

Поэтому для решения задачи я решил использовать статистический подход – по существующей базе клиентов определять к какому полу обычно принадлежат люди с искомыми фамилией, именем и отчеством и, по этим данным, относить новых застрахованных к тому или иному классу. Если часть ФИО принадлежала преимущественно мужчинам – я начислял +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%.


UPD 1
В комментариях было предложено много необычных имен, я проверил — как они будут определяться предложенным выше алгоритмом. По ссылке – предложенные имена и их вариации с оценками пола по фамилии, имени и отчеству.
UPD 2
Ниже было высказано предположение, что определение пола по ФИО является типичной задачей классификации. Я нашел у себя данные по 500 тыс человек для каждого из которых известны последние буквы фамилии (ssecondname), имени (sname) и отчества (sthirdname), цифры 3, 2 и 1 означают сколько последних символов от этой части ФИО было использовано. К сожалению, другой подобной выборки у меня нет, как и возможности сделать ее с другим набором признаков для исследования.
Также я построил на этих данных дерево решений:
Не усеченное (а значит, и, неизбежно, переобученное): h1analysis.ru/analysis/download/89
Усеченное таким образом, чтобы удалить все ветви содержащие менее 10 человек: h1analysis.ru/analysis/download/90
Качество классификации я не проверял. Усечений методами вроде 30/70 тоже не делал.

Комментарии (57)


  1. tumikosha
    04.01.2016 11:36

    Я для этих целей как-то распарсил
    www.familytree.ru/ru/dbf/index.php
    там указывается пол для имени и фамилии
    Махнемся базами? ;))


    1. giffok
      04.01.2016 12:26
      +2

      Боюсь, что нет)
      Несмотря на то, что фамилия имя и отчество по отдельности не являются персональными данными, я уверен, что начальство будет против такого моего шага, а в обход их это было бы делать очень недальновидно.
      Но да, я хотел бы выложить подобную базу если бы появилась возможность ее собрать на основе данных уже находящихся в открытом доступе (и если бы у меня хватало бы технических навыков для этого, что тоже важно).


      1. tumikosha
        04.01.2016 16:32
        +2

        А я не прошу оригинал базы.
        Я прошу 2 таблички формата
        ИМЯ, ПОЛ
        Фамилия, ПОЛ


        1. giffok
          04.01.2016 16:40
          +2

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


          1. ALIron
            08.01.2016 11:19

            Присоединюсь к обмену.
            В общую копилку Фамилия — пол, Имя- Пол, Отчество- пол. Выстраданное в том числе и операторами на местах.
            Решал похожую задачу. Только тарифы были не на год а на 20-50 лет=) (НПФ)

            Оформляли как то это решение?
            Получается что система определяет пол если не указан + переопределяет если указан не верно(?) что в конечном итоге влияет на тариф => на финансовые результаты организации. А тем где есть деньги — много бумаг (особенно в больших компаниях «при объеме портфеля договоров в несколько миллиардов» )
            Или всё же назначение пола сотрудник утверждает => берет на себя ответственность.


            1. giffok
              08.01.2016 13:27

              Нет, никаких особенно это не оформляли. Отдел, в котором я работал, занимался актуарными расчетами + аналитикой (как внешней так и внутренней) + автоматизацией. Из-за этого весь процесс разработки и одобрения был предельно коротким:
              — я пришел в сб чтобы поиграть с данными, попутно написал первую версию функции и проверил ее качество
              — в пн скинул начальнику результаты и спросил можно ли мне проапдейтить исторические данные + установить запрет на занесение новых людей с неправильным полом на уровне триггера. за 15 минут получил одобрение.
              — в среду, когда появилось свободное время, сделал задуманное + оповестил тех сотрудников, которые должны были с этой проверкой столкнуться.

              Поскольку хренение [застрахованных-физлиц для медицинских договоров] и [всех прочих контрагентов] было в разных таблицах (по историческим причинам), то все прошло довольно безболезненно.

              Первая ошибка определения пола пришла примерно через месяц после того, как я установил эту проверку.


              1. Wesha
                08.01.2016 17:49

                Поскольку хренение
                «Нет-нет, это не опечатка. Ты посмотри на него — какое ж это мясо? Это мсяо! Вот и дальше правильно написано — говюжье


        1. giffok
          11.01.2016 21:46

          извиняюсь, но нет, не смогу предоставить (из-за ограничений на целевое использование данных клиентов)


      1. david_mz
        04.01.2016 16:40
        +5

        Вконтакт в своём API (users.get) позволяет узнать пол юзера. А все юзеры живут тут: https://vk.com/catalog.php (собственно, id-ы растут последовательно, так что этот список и не нужен). Так что можно надёргать достаточно много данных по именам и полу.


        1. tumikosha
          05.01.2016 10:24

          Спасибо. Хорошая идея


  1. tzlom
    04.01.2016 12:01

    Мне попадался текст, вроде даже на хабре, там для задачи «пол по имени» использовался наивный байесовский классификатор по буквам, не пробовали?


    1. giffok
      04.01.2016 12:42

      Вероятней всего имеется ввиду эта статья.
      Нет, я не пробовал брать буквы, только целые слова.Но думаю, что стоит попробовать этот метод для определения пола тех людей, для которых не удалось определить пол моей текущей функцией. Сейчас для этих целей я использую окончания отчеств, но я допускаю что из первой и второй буквы (в т.ч. других частей ФИО) можно извлечь какую-то доп информацию. И да, вероятно этот метод будет более устойчив к опечаткам, чем описанный в статье.


      1. buriy
        04.01.2016 21:41

        Возьмите тогда более сложный классификатор, а не наивный байесовский (который вы полностью повторили в своём решении, с единственным изменением — вы округляете результаты по каждому признаку вместо использования вероятностей).
        Дело в том, что наивный байес склонен переоценивать повторяющиеся признаки (и недооценивать важные, но редко повторяющиеся) — он учтёт их столько раз, сколько раз они встретятся. Например, последние две буквы окончания и последняя буква окончания — это повторяющиеся признаки. За каждое будет "+1".


        1. buriy
          04.01.2016 21:50

          >последние две буквы окончания и последняя буква окончания
          последние две буквы отчества и последняя буква отчества

          (заработался)


  1. HangGlider
    04.01.2016 12:36
    +1

    Одна из районно-школьных олимпиадных задачек по информатике. Но условия чуть другие были.

    Me пустил скупую мужскую слезу.


  1. Ugputu
    04.01.2016 14:20

    Я вот не могу с ходу придумать (в столь раннее утро) какие женские отчества не оканчиваются на «а» (в кириллице). Подскажите?


    1. REU
      04.01.2016 14:33
      +16

      Гадя Петрович Хренова ))


      1. Wesha
        04.01.2016 22:02
        +1

        Спасибо, поржал!

        Кстати, Ваша карма вроде же позволяет линки вставлять


    1. giffok
      04.01.2016 14:35

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


      1. Eklykti
        04.01.2016 17:43

        под названием «отчество» я имел ввиду все что после второго пробела.


        А если одного и того же человека в одном месте запишут как Оксана Владимировна Владимирович, а в другом — как Владимирович Оксана Владимировна, то первая Оксана станет мужик?


        1. giffok
          04.01.2016 19:07

          Могу предположить что в обеих случаях будет 0.
          Случаев когда ФИО пишут в странном порядке гораздо больше, чем можно предположить. Я проверял на имени «Ольга» (она в любой позиции давала стабильно -1) и отчестве «Олегович» (стабильный +1). В данном случае такие же роли у «Оксаны» и «Владимирович». Думаю, что они будут взаимно уничтожать друг друга и тянуть итоговую оценку к 0. Но тоже завтра протестирую.


    1. Meklon
      04.01.2016 17:44
      +14

      image


      1. Wesha
        04.01.2016 19:00
        -7

        Спасибо, поржал! Ловите плюс.


  1. hmpd
    04.01.2016 15:13

    Занятно. Поделюсь своими наблюдениями:

    1. Азиаты. Китайцы по фамилии и имени другого китайца почти всегда правильно определяют его пол. Связано это с тем, что иероглифы имени (фамилия зависит от отца, поэтому на нее ориентироваться нельзя) имеют самостоятельное значение. Девушкам обычно дают имена «весна», «ласка», «счастье», «любовь», «маленькая»; мужчинам — «деньги», «храбрость», «сильный» и т. д. Конечно, алгоритмизировать такое невозможно, да и работает это не всегда.

    2. Европейцы. Вот здесь полный разброд и шатание: есть у меня два/две коллеги по имени Андреа. Та «Андреа», что из Германии, — женщина, а итальянец Андреа — мужчина. У британцев вообще род в языке слабо выражен (ладно хоть у людей есть), отсюда «Саша Александр» из вашего поста. Но больше всего я смеялся над старым испанским мужчиной по имени… Ариэль!


    1. skolk
      04.01.2016 15:39
      +5

      Ариэль — чисто мужское имя, покойного премьера забыли? Это окончание в русском языке обычно звучит как "-ил": Михаил (Михаэль), Гавриил, Самуил, Даниил, Иммануил (Эммануэль).


      1. arkandos
        04.01.2016 16:57
        +1

        Замечу, что в указанном ряду вариация на тему «Эммануэль» не столь очевидна в том же французском кинематографе, если вы понимаете, о чем я.


        1. salas
          04.01.2016 20:02
          +1

          Во французском варианте и Мишель бывает не только Платини, но и ma belle.


      1. hmpd
        04.01.2016 19:51

        К сожалению, это не всегда мужчины. Сходу вспомнил три примера:
        1. Русалочка Ариэль
        2. Андариэль (Диабло)
        3. Галадриэль (Властелин Колец)

        И Эммануэль, конечно, как написал arkandos


        1. gwer
          07.01.2016 14:27

          И Тауриэль там же.
          С другой стороны, у Беляева Ариэль был юношей.


  1. asm0dey
    04.01.2016 15:44

    А что ваш алгоритм выдаст про Маркеса? www.wikiwand.com/ru/Гарсиа_Маркес,_Габриэль
    И про Борхеса? www.wikiwand.com/ru/Борхес,_Хорхе_Луис (ну по полным именам, а не по кратким, понятное дело)
    Это я чисто из интереса, можно не отвечать.


    1. giffok
      04.01.2016 15:50

      Завтра собирался на работу сходить — проверю)
      А пока могу предположить, что для первого выдаст +1 (+1 по первым двум частям («Габриэль Хосе») и 0 по всему остальному), а для второго 0 (единственный +1 в части «Луис» (да и то не факт), по остальным частям — 0)


      1. asm0dey
        04.01.2016 15:59

        А, у вас не такие иностранцы, да? Я подумал что там будет тонна конфликтов мальчик-девочка )


        1. giffok
          04.01.2016 16:08

          Если разные части ФИО имеют разный пол, то автоматически итоговый результат не будет выходить за пределы [-1;+1], так что конфликтные ситуации автоматически попадают в зону «не удалось определить пол». Но существенная часть иностранцев имеет первые две части ФИО достаточные для распознания.


          1. asm0dey
            04.01.2016 16:12

            А если 7 мальчиковых имён и 3 девочковых?


            1. giffok
              04.01.2016 16:15

              То вернет 1. Близко к опасной границе, да. Но статистика по второй части слова, как правило, либо усилит уверенность в правильности определения пола либо обнулит ее.


  1. varagian
    04.01.2016 17:23
    +1

    Очень похоже на классическую задачу классификации из машинного обучения — не было попыток копать в эту сторону? Если были, то в чём подводные камни?


    1. giffok
      04.01.2016 18:56
      +1

      В тот момент, когда я писал этот алгоритм, я уже знал что означает термин машинное обучение, но еще не знал как оно работает)
      А когда предложенный в статье метод начал работать оказалось, что результат меня удовлетворяет в достаточной степени, и в дальнейшем развитии нет особой необходимости. Основная задача которая передо мной стояла — контролировать корректность присвоения текущего пола, а не определять его на 100% выборки (что в наиболее распространенных алгоритмах машинного обучения требуется, на мой взгляд, гораздо чаще, поскольку обычно отказ от классификации рассматривается как принципиальный недостаток).

      Если очень вольно относится к формулировкам, можно сказать, что то что я сделал похож на ансамбль из моделей сделанных методом «ближайших соседей».

      В качестве развлечения я строил дерево решений на основе выборки в 50к (и потом усекал его). Получалось что-то вроде

        --pl/sql code
        result:='N';--count=50000;
        
        if sthirdname3='ВИЧ' then
          result:='Y';--count=22831;
        end if;
      
        if sthirdname3='ГЛЫ' then
          result:='Y';--count=14;
        end if;
      
        if sthirdname3='МИЧ' then
          result:='Y';--count=19;
        end if;
      
        if sthirdname3='ЬИЧ' then
          result:='Y';--count=60;
        end if;
      
        if sthirdname3 is null then
          result:='Y';--count=229;
          
          if sname2='НА' then
            result:='N';--count=20;
          end if;
        end if;
      

      где sthirdname3 — последние 3 буквы отчетсва, sname2 — 2 буквы имени
      result:='Y'; — мужской пол
      result:='N'; — женский пол

      Строил с помощью сервиса который сам писал как развлечение (загружаешь файлик с данными — на выходе получаешь код классификатора с деревом решений на удобном тебея языке программирования), но сейчас этот сервис неработает из-за моих достаточно кривых рук.


      1. salas
        04.01.2016 20:17

        обычно отказ от классификации рассматривается как принципиальный недостаток

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


    1. Stas911
      04.01.2016 20:07

      Да, вот тоже хотел предложить запихать все в какой-нить стандартны классификатор и посмотреть, что получится…


      1. Stas911
        04.01.2016 20:10

        Особенно интересно, каких правил random forest навыращивает :)


        1. giffok
          04.01.2016 20:16

          yadi.sk/i/O8T-ZRN6mfbjA набор данных на котором я играл с классификаторами. Там всего 50 тыс записей, но для экспериментов вполне достаточно. Развлекайтесь))
          параметр WN — специально включенный мусорный столбец чтобы посмотреть насколько хорошо алгоритм справляется со случайным шумом.


          1. Stas911
            04.01.2016 20:17

            О! Спасибо!


            1. giffok
              07.01.2016 15:40

              добавил апдейт в статью — выборку на 500к с теми же параметрами для анализа


  1. Apatic
    04.01.2016 20:09

    Не совсем понял вот какой момент. А если в обучающей выборке по фамилии «Иванченко» есть 5000 мужчин и 5001 женщина, то что вернет алгоритм при разборе очередного(-ой) Иванченко? "-1" по фамилии?


    1. giffok
      04.01.2016 20:20
      +1

      нет, 0. сработает вот это правило:

      if mcnt/fcnt>0.5 and mcnt/fcnt<2 then  return 0; end if; -- перевес одного пола не решающий


      Для того, чтобы пол определился, нужно чтобы один пол превысил другой хотя бы в 2 раза.


      1. Apatic
        04.01.2016 20:25

        Ага, проглядел, спасибо.

        На самом деле хочется вроде что-то сказать, порассуждать, новые идеи подкинуть, да толком нечего. Если у вас всего 6 ошибок на несколько сотен тысяч, то остается только поздравить :)


        1. Wesha
          04.01.2016 20:37
          +2

          И как всегда, во всём виноваты иностранцы. :)


        1. giffok
          04.01.2016 20:38

          Ну, стоит это скептически воспринимать))
          Я просто не придумал никакого более надежного способа проверки, чем ручной. Но в реальности, этот способ может быть ужасен: агент хочет продать страховку китайцу (физлицу) — система говорит что пол не верный — продавец меняет пол на тот, который система требует (не отказываться же от сделки?) и никому ничего не говорит. Да будут какие-то отличия в печатном бланке, но авось клиент не заметит.

          Я смотрел изредка логи — на каких именах срабатывает проверка. В подавляющем большинстве случаев я был согласен с решением функции, но для части срабатываний у меня не было уверенности. Так что, возможно, ошибок было не 6, а в несколько раз больше. Что, впрочем, тоже довольно неплохо.


  1. Wayfarer15
    05.01.2016 00:16
    +2

    Хотя статья не про это, но просто интересно, почему данные от страховщиков попадают без administrative gender. Они приходят в каком-то Excel файле или как? И вторая мысль — а какой пол вы считаете, биологический или административный (особенно для тайландских фамилий, ну вы поняли).


    1. giffok
      05.01.2016 00:44
      +1

      Да, большая часть информации попадает в базу из excel — файлов присылаемых клиентами. Они на своей стороне генерят эти файлы из своих систем, где они ведут кадровый учет. По вполне понятным причинам мы не можем проверять биологический пол при принятии на страхование (особенно когда коллектив 10+ тысяч человек, но даже для одного человека это было бы, гхм, двусмысленной проверкой).
      Ни в одном месте где я работал, не было разделения на биологический и декларируемый пол. Вероятная причина — различие между ними встречается столь редко, что потенциальная недополученная прибыль теряется на фоне других, гораздо более мощных факторов. Если наши сотрудники осуществляющие контроль счетов от мед учереждений увидят, что пол не соответсвует декларации — они просто изменят его или повесят соответсвующий повышающий коэф на человека с уместным случаю комментарием (т.е. при повторном принятии на страхование застраховаться по стандартным тарифам он не сможет).


      1. Wayfarer15
        05.01.2016 01:36
        +1

        А вот тот, кто заминусовал мой коммент не желает мне в личку написать, я ему популярно объясню что такое administrative и biological gender на основе стандартов (HL7, SNOMED CT).

        giffok: Опять же вопрос скорее не к вам, но этот велосипед долго обсуждали и придумали всякие HL7 сообщения, и хотя там administrative gender опционален, но ни чего не мешает constrain the model для совместимости процессов.


  1. Idot
    05.01.2016 04:28
    +1

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

    Пример – «Иванов Наталья Сергеевна». В данном случае, наиболее вероятно, что допущена опечатка в фамилии – забыта буква «а» в конце.

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


  1. vsespb
    05.01.2016 11:20

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

    А нельзя было сделать «как все»: 1) в анкете нужно указать пол 2) если при страховом случае выяснилось, что данные ошибочны, отказывают в выплате (или делаю суброгацию)?


    1. giffok
      05.01.2016 11:41

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


  1. xflower
    05.01.2016 11:59
    +1

    Остап Сулейман Ибрагим Берта Мария Бендер-бей Задунайский


  1. andjel
    05.01.2016 12:46

    Па?бло Дие?го Хосе? Франси?ско де Па?ула Хуа?н Непомусе?но Мари?я де лос Реме?диос Сиприа?но де ла Санти?сима Тринида?д Ма?ртир Патри?сио Руи?с и Пика?ссо
    Хотя наверное это не часто встречается :)

    А если серьезно, вот реальный пример мужского имени (фамилия отброшена), как система обработает? — Дидье Селин Франсис


    1. Meklon
      05.01.2016 14:03

      У меня коллега Неус Фелиу Торрес. Фелиу и Торрес — фамилии матери и отца) в Сбербанке карту выдали на Фелиу Торрес в итоге) Каталонка.