Появилась потребность определять пол клиентов в базе и автоматически склонять ФИО для интернет-магазина. Специфика магазина – подарки и доставка цветов с поздравлениями.


Магазин принимает информацию о пользователях через форму быстрого заказа. Есть и обычная корзина, но многие пользуются именно быстрым заказом – там можно заполнить только телефон и сразу же перейти к оплате. Клиенты пользуются возможностью и часто вообще не указывают имя. Делать поля для ФИО обязательными бессмысленно – вписывать мусор вместо данных не запретить. Также как не запретить неправильно писать собственное имя.
Между тем правильное обращение к клиенту необходимо, иначе возможны казусы:


image



Сейчас сотрудники магазина уточняют данные доисторическим способом: клиент делает заказ, приходит СМС с подтверждением и способом доставки. А затем звонит оператор, чтобы подтвердить заказ и заодно уточнить пол и ФИО, после чего вносит данные в CRM.


Но вообще на дворе 2016 год, и это не круто:


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

Ручной метод — долго, дорого и не как у Тёмы Лебедева. В идеале хочется все автоматизировать и избавиться от человеческого фактора. И задалбывать человека звонками только по пограничным случаям, где точно не разберется даже человек (нейронная сеть может нарисовать картину лучше Ван Гога, но никогда не угадает пол Саши Пархоменко).


Что хотелось:


  • определить пол пользователей в базе для сегментации — чтобы готовить рекламные предложения по подаркам на гендерные праздники для клиентов;
  • проверить правильность написания имен;
  • автоматически склонять имена для умной генерации открыток, поздравлений, подписей к доставленным цветам;
  • качественно, бесплатно и вчера недорого и без ошибок.

Поисследовав предметную область, я пошел изучать Хабр и интернеты в поисках вменяемого готового решения. Чтобы и пол определило, и просклоняло, и объединило в себе 2 этих фишки (в идеале). Возможно, мой обзор кому-то будет полезен.


К исследованию решил подойти обстоятельно и взял выборку от простых до сложных имен. Вооружился грамотой.ру и своей фантазией.


В результате получился простой тест на имена:


  • простые русские ФИО в разных комбинациях (Маша Цветкова, Антон Сергеевич Журавлев);
  • пограничные случаи, где пол неочевиден даже для человека (Валя Дрозденко);
  • двойные фамилии (Демут-Малиновский);
  • несклоняемые женские имена и фамилии (Раисат Магомедова, Анна Друзь);
  • женские имена на -ль (Адель, Айгуль). В них есть подвох — нет единого правила, как склонять такие имена;
  • классное мужское имя Жалиль, которое внезапно встретилось в базе несколько раз;
  • русские нестандартные: Ремесло.

А вот нетривиальные случаи, про которые мало кто знает:


  • склонение фамилии без потери гласной: Иван Плетень — Ивана Плетеня;
  • кейс с потерей гласной в фамилиях на -онок/-енок: Василий Лученок — Василия Лученка;
  • отчества с оглы/кызы (Магомедова Гюльчатай Абдурахман кызы).

Всего нашел 2 библиотеки и 3 сервиса, которые вызвали доверие.


Библиотека NameCaseLib


image


Плюсы


  • работает с русскими и украинскими именами.

Минусы


Исходя из описания API, определение пола — это не основной функционал, а добавочная фишка. Сервису можно переслать параметром пол пользователя, и это влияет на дальнейшую логику работы с именами.
Библиотека:


  • не знает, кто такой Жалиль;
  • пограничный кейс «Саша Пархоменко» уверенно определила как женщину;
  • «Раисат» определила как мужчину;
  • сложный случай «Иван Плетень» просклоняла как «Ивана Плетеого».
  • «Бонч-Бруевич» в украинском — имя, а в русском почему-то считается отчеством. Криминал, честно говоря.

А судя по тому, что на сайте стоит 2011 год, поддержку библиотеки давно прекратили.


Библиотека Петрович


image


Плюсы:


  • реализована на нескольких ЯП, в том числе на JS и Ruby;
  • неплохо склоняет простые кейсы, если им проставить пол.

Минусы:


  • пол не определяет;
  • склоняет женские имена как мужские (Айгуль – Айгуля);
  • не смогла прожевать сложное ФИО «Алиев Руслан Гейдар оглы». Приставку к отчеству библиотека молчаливо обрезала;
  • некорректно просклоняла двойные фамилии (например, Гресь-Янковский > Гресю-Янковскому).

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


Gender.Wim.Agency


“валера;;female”. Nuff said.


AHunter.ru


Плюсы:


  • есть REST API;
  • не только определяет и склоняет имя, но и работает с адресами;
  • пытается определять этнос по фамилии, и весьма неплохо;
  • подсказывает варианты прямо в форме ввода: одной строкой и несколько полей (отдельно фамилия, имя, отчество);
  • хорошо работает определение пола и склонение на простых и средних кейсах. Дружит с Жалилем и Юдифью.

Минусы:


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

Саша Пархоменко напрягла, решил поискать еще варианты.


DaData.ru


image


Плюсы:


  • есть API с нормальной документацией и примерами;
  • отлично склоняет имена, справилась почти со всеми случаями;
  • если пол не определен, API уведомляет об этом отдельным значением. Саша Пархоменко наконец-то не мужчина и не женщина;
  • на форму заказа можно поставить JS-плагин и определять пол для всех новых клиентов.

Минусы:


  • если сервис не знает фамилию — не склоняет, просто определяет пол;
  • автокомплит ФИО бесплатный, но обработка через АПИ — платная.

Морфер


Плюсы:


  • склоняет все, что можно склонить: имена, города, словосочетания, числительные, даты;
  • отдает данные через веб-сервис, есть отдельные библиотеки, модули для Excel, интеграция с Mailchimp;
  • склоняет действительно круто и простые, и сложные, и суперсложные кейсы. Не путается в -оглы/-кызы, в двойных фамилиях, в библейских именах;
  • бесплатной функциональности хватает для нормального склонения (1000 запросов в сутки).

Минусы:


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

Особенность — не склоняет женские имена на -ль (Айгуль). Это не ошибка, один из возможных вариантов (по правилам такие имена можно либо склонять, либо нет).
Сервис меня очень впечатлил в плане склонений. Легко справился с простыми и сложными случаями.
Но Саша Пархоменко огорчен(а).


Самыми достойными сервисами показались Морфер и DaData. На склонении показали себя почти одинаково за исключением имен вроде Айгуль — видимо, у создателей разная философия. Мне показалось, что Морфер – эдакий робот Бендер, гнет все что гнется и делает это очень круто. Дадата – что-то вроде Валли, умеет меньше, но делает более заботливо. С удовольствием рекомендую оба сервиса.


Какой сервис я выбрал – не скажу. Считаю, что для каждой задачи свой инструмент, и надеюсь, что обзор поможет понять, кому что подходит.
Если кто-то знает хорошие аналогичные сервисы и гуглит лучше меня, буду очень рад комментариям и советам.

Поделиться с друзьями
-->

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


  1. algenon
    02.08.2016 14:02
    +3

    С Владиславом хорошо :–)


    1. Vapaamies
      02.08.2016 21:50

      Угу. В моей жизни, оказывается, еще не всё потеряно. Купил электрокачалки — и уже молодая мама.


  1. gorlov
    02.08.2016 14:34
    +1

    Спасибо за обзор. Стоимость на Морфер указана на страничке описания модуля, например morpher.so для PHP 7000 р.


    1. shaddyk
      02.08.2016 14:58

      Не для всего. Есть цена для php, 1c и excel, а вот Java и .NET под завесой тайны.


      1. gorlov
        02.08.2016 16:35

        Действительно, спасибо. Меня интересовал php и excel я только туда и заглянул, рановато сделал вывод на маленьких данных :-)


  1. Kakao
    02.08.2016 14:49
    +1

    Вопрос как сервисы будут реагировать на имена набранные латиницей.


    1. shaddyk
      02.08.2016 15:04
      +4

      На латиницу среагировала только Дадата — транслитерировала и потом просклоняла.
      К качеству транслитерации есть вопросы, но в целом ок. После строки «Moskva, Panfilovcev heroes street» я вообще не верю в возможность автоматически побороть фантазию людей, указывающих свои адреса на посылках из Китая.


      1. algenon
        02.08.2016 15:21
        +6

        The Heroes of Panfilovcy


        1. Rastishka
          02.08.2016 15:52
          +13

          and magic.


          1. MerryKaze
            03.08.2016 09:11

            And Power of Steel!!!


    1. rmpl
      02.08.2016 15:11

      К сожалению, транслит я не тестировал, потому что такой задачи не было – адреса в базе изначально введены на русском :)


  1. shaddyk
    02.08.2016 15:17
    +6

    Сервис от ahunter — огонь!
    В примерах есть три ФИО:
    1. Грозный Иван Васильевич — не распознался совсем.
    2. Чак Норрис — не распознался совсем.
    3. Жак Ширак — распознался как Жак Ишрак, FEMALE.

    К Иванову Ивану Ивановичу он предложил мне два таких варианта как «Иавнов Иван Иванович» и «Иванво Иван Иванович». Я в растерянности.

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

    А вот Петрович визуально понравился. Сайт какой-то весь такой стильный. Даже неважно как склоняет :)

    С Дадатой и Морфером интересная история — Морфер действительно выглядит как Бендер, который готов склонить всех и вся, но у Дадаты сервис склонения явно не основной. Тут уж действительно надо сравнивать стоимость.


  1. WarFollowsMe
    02.08.2016 15:54
    +1

    Есть небольшой опыт использования инструмента Кириллер: https://github.com/miyconst/Cyriller
    Позиционирует себя как открытая и бесплатная альтернатива Морферу.
    С моими задачами он справился, хотя и пришлось добавить немного слов в словарь.


  1. Keyten
    02.08.2016 16:06

    Спасибо за интересный обзор.

    Забавно, что ahunter у вас — мужчина («посчитал»), а все остальные — женщины.

    Сашу Пархоменко посчитал мужчиной


    Например, Петрович не смогла и обрезала.
    не смогла прожевать сложное ФИО «Алиев Руслан Гейдар оглы». Приставку к отчеству библиотека молчаливо обрезала;


    1. rmpl
      02.08.2016 16:45
      +1

      Вы очень любопытно подметили, спасибо! Ahunter – охотник за адресами, видимо я воспринял его как добытчика-мужчину. А Петрович – библиотека, она-моя. Вообще это к вопросам позиционирования и восприятия.


    1. bask
      02.08.2016 17:44
      +3

      Гадя Петрович женского пола


    1. samodum
      05.08.2016 00:31

      Ирина Петрович — девушка
      http://sport.tut.by/news/aboutsport/505529.html


  1. staticlab
    02.08.2016 16:18
    +3

    NameCaseLib и Петрович — опенсорс. Можно было бы попробовать пофиксить или хотя бы отправить issue в гитхаб с вашими тест-кейсами.


  1. eveel
    02.08.2016 16:25

    Добавлю пару слов по поводу Petrovich.


    Библиотека разрабатывалась для решения задачи склонения имён в случаях, когда пол известен. Например, в личных кабинетах и индивидуальных рассылках. Задача автоматического определения пола напрямую не относится к задаче склонения имён, но тоже обсуждается в контексте библиотеки. Среди несложных подходов обратите внимание на анализ окончаний и машинное обучение.


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


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


    1. rmpl
      02.08.2016 16:55
      +1

      Спасибо за комментарий!
      Если пол известен, то имена склоняются. Но, к сожалению, всегда известный пол – это идеальный мир :(


      1. TimsTims
        01.12.2016 00:49

        Исправил. Спасибо тем, кто вывел из -2


        1. rmpl
          03.08.2016 21:23
          +1

          Добавил ссылку в описание Петровича. Спасибо!


  1. HunterXXI
    02.08.2016 16:27

    Но вообще на дворе 2016 год, и это не круто:

    судя по тому как справляются сервисы, звонок клиенту для уточнения, это всё ещё круто.

    Как раз для таких целей нужны нейронные сети и машинное обучение. Какой-нибудь из этих сервисов развивается в данном направлении?


    1. shaddyk
      02.08.2016 16:35
      -1

      Поздравляю, вы почти собрали буллшит-бинго! Микросервисы уже не в моде, а блокчейн только набирает силу. Что остается? Правильно, бигдата!
      Нейронные сети и машинное обучение не имеют никакого отношения к этой задаче — свалить них всю ответственность весело, но здесь нужно не нейроны крутить, а справочники внимательно пополнять.


      1. eveel
        02.08.2016 16:41

        Не совсем так, см. выше. Применение машинного обучения полезно в задаче определения пола. Правда, в упомянутом примере используются не нейронные сети, а логистическая регрессия: http://research.digsolab.com/gender.


        1. shaddyk
          02.08.2016 16:50

          С одной стороны я писал только о склонениях, с другой — сервис по вашей ссылке определяет «Иванко Мария» мужчиной с уверенностью 0.932. Вы можете сказать, что я его неправильно держу (с), но это уже вопрос веры.


          1. eveel
            02.08.2016 17:04

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


  1. potan
    02.08.2016 16:48
    +2

    В 1996 я склонял фамилии 12000 акционеров. Программкой на C.
    Ручной контроль потом нашел две неправильные — Ручей (Ручею) и Заяц (Заяцу).
    А эти сервисы с ними справятся?


    1. rmpl
      02.08.2016 17:22
      +1

      Уточните, а какой способ склонения в вашем случае был верный и какой – неверный?


      1. potan
        02.08.2016 18:00

        Я написал, как я просклонял. Верный, как предположили девушки с пятеркой по русскому, такой же, как и для обычных слов — Ручью и Зайцу.


        1. rmpl
          02.08.2016 18:10
          +4

          Грамота.ру говорит, что тут неоднозначно (пункт 4.4). То есть можно и «Зайцу», и «Заяцу». Но в документах рекомендуют не терять гласные, чтобы не было юридических проблем в будущем. Поэтому «Заяцу» правильнее.


          1. potan
            02.08.2016 18:46

            Я всегда верил в силу алгоритма!


  1. ad1Dima
    02.08.2016 17:09
    +1

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


  1. Phizio
    02.08.2016 17:30

    Как-то пилили црм-систему, автоматически готовящую сложные юридические документы и формы. Морфер склонял все и вся.

    не указана стоимость библиотеки, возникает ощущение, что с меня хотят заработать побольше бабла.

    Насколько помню, лицензия морфера для установки на свой сервер около 100$ была. И вроде как на офсайте это было указано открыто. Странно, что не нашли ;)

    В этой же системе мы юзали и Дадату — но уже не для склонений, а для сегментации и нормализации адресов, подсказок autocomplete по юрлицам. Тут уже упоминали, что эти фичи для «дадаты» роднее, чем склонения имен.
    Правда, базу по юрикам ей поактуальнее бы… )


    1. rmpl
      02.08.2016 17:38

      Сейчас там форма запроса цены с указанием нескольких параметров. А прямой цены не указано, либо я плохо смотрю.


    1. algenon
      02.08.2016 18:48

      У Дадаты сейчас актуальность по юрлицам на 10 июля 2016. Где-нибудь есть еще актуальнее (ну кроме сайта налоговой с капчей)?


  1. tankomazzz
    02.08.2016 23:10

    https://name2gender.com — определить пол по имени. По правде говоря ФИО склонять не умеет, но и функционал то делал для определения пола в первую очередь, готов предоставить премиум ключик автору для тестов


    1. rmpl
      02.08.2016 23:10

      Спасибо, буду рад потестировать ваш сервис.


  1. gaki
    03.08.2016 04:57
    +1

    Мне кажется, все эти заморочки только отрицательно повлияют на узнаваемость брэнда. Владислав из первого примера должна вас и так отлично запомнить.


    1. algenon
      03.08.2016 09:00
      +3

      Именно так! Для повышения узнаваемости бренда имя вообще не нужно. Достаточно обращения в письме «привет, вонючка».


      1. sav1812
        03.08.2016 11:42

        И «бренд» станет не только узнаваемым, но и избегаемым… :)


  1. Ogoun
    03.08.2016 16:24
    +1

    Делал определение пола, в итоге остановился на ручном решении, вот таким методом (C#):

    Посмотреть код
    public static Gender Resolve(Client client)
    {
        if (fullgirls_names.Contains(client.FullName))
        {
            return Gender.Female;
        }
        if (fullboy_names.Contains(client.FullName))
        {
            return Gender.Male;
        }
        string[] name_parts = client.FullName.Split(' ');
        List<string> parts = new List<string>();
        foreach (string part in name_parts)
        {
            if (!String.IsNullOrWhiteSpace(part))
            {
                parts.Add(part.ToLower().Trim());
            }
        }
        int male_count = 0;
        int female_count = 0;
        foreach (string part in parts)
        {
            if (girls_names.Contains(part))
            {
                female_count++;
            }
            else if (boy_names.Contains(part))
            {
                male_count++;
            }
        }
        if ((female_count > 0 || male_count > 0) && female_count != male_count)
        {
            if (female_count > male_count)
            {
                return Gender.Female;
            }
            else
            {
                return Gender.Male;
            }
        }
        return Gender.Uncknown;
    }
    


  1. gaki
    03.08.2016 18:16
    -3

    Хуерга Хелицеровна Ябдалаева

    Фамилия Ябдалаева
    Имя Хуерга
    Отчество Хелицеровна
    Пол женский
    Им. падеж (кто?) Ябдалаева Хуерга Хелицеровна
    Род. падеж (кого?) Ябдалаевой Хуерги Хелицеровны
    Дат. падеж (кому?) Ябдалаевой Хуерге Хелицеровне
    Твор. падеж (кем?) Ябдалаевой Хуергой Хелицеровной

    Отлично справился первый сервис и последние два. Петрович, несмотря на явное указание пола, не осилил просклонять «фамилию», хотя вполне справился с «именем» и «отчеством». AHunter вообще отказался такое обрабатывать. Gender.Wim.Agency я сам ниасилил.


    1. gaki
      03.08.2016 19:17
      -3

      Бельдыбай Залупаевич Козымагомедов. NameCaseLib выбывает из нашей специальной олимпиады, потому что, несмотря на явную абсурдность, считает, что это две фамилии, а между ними отчество.
      Усложним задачу и уберём «отчество» — с этим справляется только Морфер, ДаДата путает «имя» с «фамилией» и, в результате, ничего не склоняет.

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


    1. TimsTims
      01.12.2016 00:21

      Спасибо. Дальше будет интереснее ;)


      1. gaki
        04.08.2016 04:03

        Похоже, Петровичу фамилию надо писать строго первой (а я последней писал). Если написать, как вы написали, то, действительно, склоняется.