Появилась потребность определять пол клиентов в базе и автоматически склонять ФИО для интернет-магазина. Специфика магазина – подарки и доставка цветов с поздравлениями.
Магазин принимает информацию о пользователях через форму быстрого заказа. Есть и обычная корзина, но многие пользуются именно быстрым заказом – там можно заполнить только телефон и сразу же перейти к оплате. Клиенты пользуются возможностью и часто вообще не указывают имя. Делать поля для ФИО обязательными бессмысленно – вписывать мусор вместо данных не запретить. Также как не запретить неправильно писать собственное имя.
Между тем правильное обращение к клиенту необходимо, иначе возможны казусы:
Сейчас сотрудники магазина уточняют данные доисторическим способом: клиент делает заказ, приходит СМС с подтверждением и способом доставки. А затем звонит оператор, чтобы подтвердить заказ и заодно уточнить пол и ФИО, после чего вносит данные в CRM.
Но вообще на дворе 2016 год, и это не круто:
- операторы — всего лишь человеки и периодически фейлят. Если имя изначально не указано, легко путают цветы для Вали с цветами для Вари;
- в телефонном разговоре сотрудники переспрашивают имена по буквам, чем неимоверно бесят людей;
- для поздравлений имена в открытках и подписях к цветам иногда склоняются, и это не всегда тривиальная задача (пример — Артема Лученка написали как «Лученока»).
Ручной метод — долго, дорого и не как у Тёмы Лебедева. В идеале хочется все автоматизировать и избавиться от человеческого фактора. И задалбывать человека звонками только по пограничным случаям, где точно не разберется даже человек (нейронная сеть может нарисовать картину лучше Ван Гога, но никогда не угадает пол Саши Пархоменко).
Что хотелось:
- определить пол пользователей в базе для сегментации — чтобы готовить рекламные предложения по подаркам на гендерные праздники для клиентов;
- проверить правильность написания имен;
- автоматически склонять имена для умной генерации открыток, поздравлений, подписей к доставленным цветам;
качественно, бесплатно и вчеранедорого и без ошибок.
Поисследовав предметную область, я пошел изучать Хабр и интернеты в поисках вменяемого готового решения. Чтобы и пол определило, и просклоняло, и объединило в себе 2 этих фишки (в идеале). Возможно, мой обзор кому-то будет полезен.
К исследованию решил подойти обстоятельно и взял выборку от простых до сложных имен. Вооружился грамотой.ру и своей фантазией.
В результате получился простой тест на имена:
- простые русские ФИО в разных комбинациях (Маша Цветкова, Антон Сергеевич Журавлев);
- пограничные случаи, где пол неочевиден даже для человека (Валя Дрозденко);
- двойные фамилии (Демут-Малиновский);
- несклоняемые женские имена и фамилии (Раисат Магомедова, Анна Друзь);
- женские имена на -ль (Адель, Айгуль). В них есть подвох — нет единого правила, как склонять такие имена;
- классное мужское имя Жалиль, которое внезапно встретилось в базе несколько раз;
- русские нестандартные: Ремесло.
А вот нетривиальные случаи, про которые мало кто знает:
- склонение фамилии без потери гласной: Иван Плетень — Ивана Плетеня;
- кейс с потерей гласной в фамилиях на -онок/-енок: Василий Лученок — Василия Лученка;
- отчества с оглы/кызы (Магомедова Гюльчатай Абдурахман кызы).
Всего нашел 2 библиотеки и 3 сервиса, которые вызвали доверие.
Библиотека NameCaseLib
Плюсы
- работает с русскими и украинскими именами.
Минусы
Исходя из описания API, определение пола — это не основной функционал, а добавочная фишка. Сервису можно переслать параметром пол пользователя, и это влияет на дальнейшую логику работы с именами.
Библиотека:
- не знает, кто такой Жалиль;
- пограничный кейс «Саша Пархоменко» уверенно определила как женщину;
- «Раисат» определила как мужчину;
- сложный случай «Иван Плетень» просклоняла как «Ивана Плетеого».
- «Бонч-Бруевич» в украинском — имя, а в русском почему-то считается отчеством. Криминал, честно говоря.
А судя по тому, что на сайте стоит 2011 год, поддержку библиотеки давно прекратили.
Библиотека Петрович
Плюсы:
- реализована на нескольких ЯП, в том числе на JS и Ruby;
- неплохо склоняет простые кейсы, если им проставить пол.
Минусы:
- пол не определяет;
- склоняет женские имена как мужские (Айгуль – Айгуля);
- не смогла прожевать сложное ФИО «Алиев Руслан Гейдар оглы». Приставку к отчеству библиотека молчаливо обрезала;
- некорректно просклоняла двойные фамилии (например, Гресь-Янковский > Гресю-Янковскому).
Не понравилось.
UPD. В комментариях выяснилось, что основная задача библиотеки – склонение ФИО. Определение пола – не прямая задача библиотеки, и для корректной работы пол стоит указывать. С указанным полом Петрович работает намного лучше.
Gender.Wim.Agency
“валера;;female”. Nuff said.
AHunter.ru
Плюсы:
- есть REST API;
- не только определяет и склоняет имя, но и работает с адресами;
- пытается определять этнос по фамилии, и весьма неплохо;
- подсказывает варианты прямо в форме ввода: одной строкой и несколько полей (отдельно фамилия, имя, отчество);
- хорошо работает определение пола и склонение на простых и средних кейсах. Дружит с Жалилем и Юдифью.
Минусы:
- Сашу Пархоменко посчитал мужчиной, та же ситуация для всех пограничных кейсов. То есть все сомнительные случаи станут мужчинами, и это неправильно. Нельзя однозначно считать пограничный случай мужчиной или женщиной, нужно предупредить человека о том, что робот запутался и страдает;
- мужская интерпретация Саши Пархоменко считается славянским именем, а женская — индоевропейским. Заставило задуматься о точности алгоритмов;
- в форме подсказок попадаются несочетаемые сочетания: «Алиса Васильев», «Николай Владимирова». Неизвестно, чего ждать в дальнейшем, раз проскакивают такие откровенные опечатки в простых случаях;
- в автокомплите по отдельным полям данные не всегда сочетаются по полу. По закону Мёрфи пользователь обязательно ошибется там, где можно ошибиться.
Саша Пархоменко напрягла, решил поискать еще варианты.
DaData.ru
Плюсы:
- есть API с нормальной документацией и примерами;
- отлично склоняет имена, справилась почти со всеми случаями;
- если пол не определен, API уведомляет об этом отдельным значением. Саша Пархоменко наконец-то не мужчина и не женщина;
- на форму заказа можно поставить JS-плагин и определять пол для всех новых клиентов.
Минусы:
- если сервис не знает фамилию — не склоняет, просто определяет пол;
- автокомплит ФИО бесплатный, но обработка через АПИ — платная.
Морфер
Плюсы:
- склоняет все, что можно склонить: имена, города, словосочетания, числительные, даты;
- отдает данные через веб-сервис, есть отдельные библиотеки, модули для Excel, интеграция с Mailchimp;
- склоняет действительно круто и простые, и сложные, и суперсложные кейсы. Не путается в -оглы/-кызы, в двойных фамилиях, в библейских именах;
- бесплатной функциональности хватает для нормального склонения (1000 запросов в сутки).
Минусы:
- не умеет определять пол в пограничных случаях (Саша Пархоменко по умолчанию считается мужчиной);
- не указана стоимость библиотеки, возникает ощущение, что с меня хотят заработать побольше бабла.
Особенность — не склоняет женские имена на -ль (Айгуль). Это не ошибка, один из возможных вариантов (по правилам такие имена можно либо склонять, либо нет).
Сервис меня очень впечатлил в плане склонений. Легко справился с простыми и сложными случаями.
Но Саша Пархоменко огорчен(а).
Самыми достойными сервисами показались Морфер и DaData. На склонении показали себя почти одинаково за исключением имен вроде Айгуль — видимо, у создателей разная философия. Мне показалось, что Морфер – эдакий робот Бендер, гнет все что гнется и делает это очень круто. Дадата – что-то вроде Валли, умеет меньше, но делает более заботливо. С удовольствием рекомендую оба сервиса.
Какой сервис я выбрал – не скажу. Считаю, что для каждой задачи свой инструмент, и надеюсь, что обзор поможет понять, кому что подходит.
Если кто-то знает хорошие аналогичные сервисы и гуглит лучше меня, буду очень рад комментариям и советам.
Комментарии (46)
gorlov
02.08.2016 14:34+1Спасибо за обзор. Стоимость на Морфер указана на страничке описания модуля, например morpher.so для PHP 7000 р.
Kakao
02.08.2016 14:49+1Вопрос как сервисы будут реагировать на имена набранные латиницей.
shaddyk
02.08.2016 15:04+4На латиницу среагировала только Дадата — транслитерировала и потом просклоняла.
К качеству транслитерации есть вопросы, но в целом ок. После строки «Moskva, Panfilovcev heroes street» я вообще не верю в возможность автоматически побороть фантазию людей, указывающих свои адреса на посылках из Китая.
rmpl
02.08.2016 15:11К сожалению, транслит я не тестировал, потому что такой задачи не было – адреса в базе изначально введены на русском :)
shaddyk
02.08.2016 15:17+6Сервис от ahunter — огонь!
В примерах есть три ФИО:
1. Грозный Иван Васильевич — не распознался совсем.
2. Чак Норрис — не распознался совсем.
3. Жак Ширак — распознался как Жак Ишрак, FEMALE.
К Иванову Ивану Ивановичу он предложил мне два таких варианта как «Иавнов Иван Иванович» и «Иванво Иван Иванович». Я в растерянности.
Wim.agency напомнил мне школу, где на информатике было задание написать определялку пола по имени. Так вот, подход к реализации не обсуждался — если имя заканчивается на гласную, то признаем человека женщиной. А я — Никита. Эх.
А вот Петрович визуально понравился. Сайт какой-то весь такой стильный. Даже неважно как склоняет :)
С Дадатой и Морфером интересная история — Морфер действительно выглядит как Бендер, который готов склонить всех и вся, но у Дадаты сервис склонения явно не основной. Тут уж действительно надо сравнивать стоимость.
WarFollowsMe
02.08.2016 15:54+1Есть небольшой опыт использования инструмента Кириллер: https://github.com/miyconst/Cyriller
Позиционирует себя как открытая и бесплатная альтернатива Морферу.
С моими задачами он справился, хотя и пришлось добавить немного слов в словарь.
Keyten
02.08.2016 16:06Спасибо за интересный обзор.
Забавно, что ahunter у вас — мужчина («посчитал»), а все остальные — женщины.
Сашу Пархоменко посчитал мужчиной
Например, Петрович не смогла и обрезала.
не смогла прожевать сложное ФИО «Алиев Руслан Гейдар оглы». Приставку к отчеству библиотека молчаливо обрезала;
rmpl
02.08.2016 16:45+1Вы очень любопытно подметили, спасибо! Ahunter – охотник за адресами, видимо я воспринял его как добытчика-мужчину. А Петрович – библиотека, она-моя. Вообще это к вопросам позиционирования и восприятия.
staticlab
02.08.2016 16:18+3NameCaseLib и Петрович — опенсорс. Можно было бы попробовать пофиксить или хотя бы отправить issue в гитхаб с вашими тест-кейсами.
eveel
02.08.2016 16:25Добавлю пару слов по поводу Petrovich.
Библиотека разрабатывалась для решения задачи склонения имён в случаях, когда пол известен. Например, в личных кабинетах и индивидуальных рассылках. Задача автоматического определения пола напрямую не относится к задаче склонения имён, но тоже обсуждается в контексте библиотеки. Среди несложных подходов обратите внимание на анализ окончаний и машинное обучение.
Основная работа в Petrovich велась над открытой базой правил и её репрезентативностью. Правила переносимы и централизованно используются всеми портами. Это же позволяет довольно быстро реагировать на возможные неточности по отчётам и правкам.
Сравнение в данной статье покрывает большое количество существующих инструментов, но является качественным сопоставлением. Очень интересно увидеть и количественный анализ. Например, сравнить аккуратность инструментов на основе набора данных, который используется для автоматического тестирования каждого изменения в правилах Petrovich, или любом другом.
HunterXXI
02.08.2016 16:27Но вообще на дворе 2016 год, и это не круто:
судя по тому как справляются сервисы, звонок клиенту для уточнения, это всё ещё круто.
Как раз для таких целей нужны нейронные сети и машинное обучение. Какой-нибудь из этих сервисов развивается в данном направлении?shaddyk
02.08.2016 16:35-1Поздравляю, вы почти собрали буллшит-бинго! Микросервисы уже не в моде, а блокчейн только набирает силу. Что остается? Правильно, бигдата!
Нейронные сети и машинное обучение не имеют никакого отношения к этой задаче — свалить них всю ответственность весело, но здесь нужно не нейроны крутить, а справочники внимательно пополнять.eveel
02.08.2016 16:41Не совсем так, см. выше. Применение машинного обучения полезно в задаче определения пола. Правда, в упомянутом примере используются не нейронные сети, а логистическая регрессия: http://research.digsolab.com/gender.
shaddyk
02.08.2016 16:50С одной стороны я писал только о склонениях, с другой — сервис по вашей ссылке определяет «Иванко Мария» мужчиной с уверенностью 0.932. Вы можете сказать, что я его неправильно держу (с), но это уже вопрос веры.
eveel
02.08.2016 17:04Увы, я не имею к этому сервису совсем никакого отношения и не располагаю набором данных, по которому обучалась модель. Держать в руках эту демонстрацию нужно правильно: сначала указывается имя, затем фамилия. Пример показан перед формой, «Мария Иванко» отлично распознаётся.
potan
02.08.2016 16:48+2В 1996 я склонял фамилии 12000 акционеров. Программкой на C.
Ручной контроль потом нашел две неправильные — Ручей (Ручею) и Заяц (Заяцу).
А эти сервисы с ними справятся?rmpl
02.08.2016 17:22+1Уточните, а какой способ склонения в вашем случае был верный и какой – неверный?
potan
02.08.2016 18:00Я написал, как я просклонял. Верный, как предположили девушки с пятеркой по русскому, такой же, как и для обычных слов — Ручью и Зайцу.
rmpl
02.08.2016 18:10+4Грамота.ру говорит, что тут неоднозначно (пункт 4.4). То есть можно и «Зайцу», и «Заяцу». Но в документах рекомендуют не терять гласные, чтобы не было юридических проблем в будущем. Поэтому «Заяцу» правильнее.
ad1Dima
02.08.2016 17:09+1Если в исходных данных допускаются уменьшительно-ласкательные и прозвища, то определить пол по имени вообще непосильная задача. Даже Вася Пархоменко может оказаться Василисой. И таких уменьшительных много.
Phizio
02.08.2016 17:30Как-то пилили црм-систему, автоматически готовящую сложные юридические документы и формы. Морфер склонял все и вся.
не указана стоимость библиотеки, возникает ощущение, что с меня хотят заработать побольше бабла.
Насколько помню, лицензия морфера для установки на свой сервер около 100$ была. И вроде как на офсайте это было указано открыто. Странно, что не нашли ;)
В этой же системе мы юзали и Дадату — но уже не для склонений, а для сегментации и нормализации адресов, подсказок autocomplete по юрлицам. Тут уже упоминали, что эти фичи для «дадаты» роднее, чем склонения имен.
Правда, базу по юрикам ей поактуальнее бы… )
algenon
02.08.2016 18:48У Дадаты сейчас актуальность по юрлицам на 10 июля 2016. Где-нибудь есть еще актуальнее (ну кроме сайта налоговой с капчей)?
tankomazzz
02.08.2016 23:10https://name2gender.com — определить пол по имени. По правде говоря ФИО склонять не умеет, но и функционал то делал для определения пола в первую очередь, готов предоставить премиум ключик автору для тестов
gaki
03.08.2016 04:57+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; }
gaki
03.08.2016 18:16-3Хуерга Хелицеровна Ябдалаева
Фамилия Ябдалаева
Имя Хуерга
Отчество Хелицеровна
Пол женский
Им. падеж (кто?) Ябдалаева Хуерга Хелицеровна
Род. падеж (кого?) Ябдалаевой Хуерги Хелицеровны
Дат. падеж (кому?) Ябдалаевой Хуерге Хелицеровне
Твор. падеж (кем?) Ябдалаевой Хуергой Хелицеровной
Отлично справился первый сервис и последние два. Петрович, несмотря на явное указание пола, не осилил просклонять «фамилию», хотя вполне справился с «именем» и «отчеством». AHunter вообще отказался такое обрабатывать. Gender.Wim.Agency я сам ниасилил.gaki
03.08.2016 19:17-3Бельдыбай Залупаевич Козымагомедов. NameCaseLib выбывает из нашей специальной олимпиады, потому что, несмотря на явную абсурдность, считает, что это две фамилии, а между ними отчество.
Усложним задачу и уберём «отчество» — с этим справляется только Морфер, ДаДата путает «имя» с «фамилией» и, в результате, ничего не склоняет.
Моржовый Хуй Анаксимандрович. ДаДата правильно распознаёт фамилию, отчество принимает за имя, а имя, видимо, цензурирует и вообще исключает из дальнейшего рассмотрения. И только Морфер всё ещё справляется, ему всё ни по чём!
algenon
С Владиславом хорошо :–)
Vapaamies
Угу. В моей жизни, оказывается, еще не всё потеряно. Купил электрокачалки — и уже молодая мама.