определение пола по имени python
Определяем возраст и пол человека используя нейронную сеть
У нас была задача отсортировать профили людей по возрасту и полу. Нам нужно было сегментировать базу потенциальных клиентов для запуска тестовых рекламных компаний, для каждой рекламной компании мы подбирали индивидуальные видео которые лучше всего подошли бы людям определенного возраста и пола.
Если вам интересны такие темы и вы хотите и дальше видеть новые публикации и развитие данного модуля, то просим вас поставить нам звездочку ⭐ на Github!
После анализа доступных библиотек, мы нашли интересный репозиторий на Github: https://github.com/davisking/dlib-models
Автор Davis E. King @davisking, он же создатель замечательной библиотеки dlib, предоставил уже натренированную модель на несколько тысяч лиц людей. Но, вот беда… код написан на C++ а рабочей альтернативы на Python мы не нашли.
Модель для определения формы лица (shape_predictor_5_face_landmarks.dat)
Это 5-точечная модель, которая определяет уголки глаз и дно носа. Она обучена на наборе данных из 5-точечных ориентиров от 7198 лиц людей. Автор @davisking создал этот набор данных, загружая изображения из Интернета и комментируя их с помощью инструмента imglab от dlib.
Модель для предсказывания возраста (dnn_age_predictor_v1.dat)
Первоначальный источник для создания модели пришел из документа Z. Qawaqneh: «Глубокая сверточная нейронная сеть для оценки возраста на основе модели VGG-Face». Тем не менее, наши исследования привели нас к значительным улучшениям в CNN модели, что позволило нам оценить возраст человека, превосходящего существующие результаты, с точки зрения точности результата.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Таким образом, эта модель является определителем возраста, использующим архитектуру ResNet-10, и обучается с использованием частного набора данных из примерно 110 тыс. различных изображений людей с комментарием в виде их возраста.
Эта модель прогнозирования возраста предоставляется компанией Cydral Technology бесплатно и распространяется по лицензии Creative Commons Zero v1.0 Universal.
Модель для определения пола человека по лицу (dnn_gender_classifier_v1.dat)
Эта модель является гендерным классификатором, обученным с использованием частного набора данных из примерно 200 000 различных изображений лиц, и она была сгенерирована в соответствии с определением сети и настройками, заданными в «Минималистической модели на основе CNN для прогнозирования пола по изображениям лиц«. Даже если набор данных, использованный для обучения, отличается от того, который использовался Г. Антиповым, результаты классификации по оценке LFW в целом схожи (± 97,3%).
Эта гендерная модель предоставляется бесплатно компанией Cydral Technology и распространяется по лицензии Creative Commons Zero v1.0 Universal.
Перенос C++ кода на Python
Изначально, @davisking предоставил два C++ файла которые показывали как работать с натренированными им моделями:
Они выводили результат сразу в консоль, но вот использовать код в рабочем проекте даже на C++ было крайне неудобно. Используя pybind11 мы имеем возможность применить код на C++ в нашем коде на Python. Мы не будем акцентироваться долго на pybind11, но если вы хотите ознакомиться с ним, то рекомендуем статью: Создаем С++ Python расширения с помощью pybind11
Определение пола по ФИО – когда точность действительно важна
Некоторое время назад меня заинтересовала задача определения пола человека по его ФИО. В тот момент я работал в области медицинского страхования, где эта проблема была действительно актуальна – расходы на одного застрахованного, а значит и тарифы, по которым людей принимали на страхование, в зависимости от пола клиента, могли отличаться в несколько раз. Большая часть договоров – корпоративные, застрахованные являются сотрудниками работодателя.
Мы никогда не видели большинство из них в глаза, все, что мы имели – списки застрахованных, где пол иногда был указан (с большим количеством ошибок), но чаще – не указан вообще. Большинство компаний имеют свою специфику работы и профессиональные традиции, в силу чего, в их коллективах преобладают люди одного пола. Даже небольшая ошибка могла сделать потенциально прибыльный договор убыточным (или наоборот, но на такое, по странному стечению обстоятельств, случалось с нашими клиентами гораздо реже). В целом, при объеме портфеля договоров в несколько миллиардов, и характерном количестве ошибок около процента, цена корректного определения пола по ФИО была в районе нескольких десятков миллионов.
В рунете тема определения пола по ФИО поднималась уже неоднократно, но, в большинстве случаев, все сводилось к рекомендации внимательно смотреть на окончание отчества («вич»/«вна») или использовать какие-то подобные найденные вручную закономерности. К сожалению, в моей ситуации этот метод не подходил – среди застрахованных было много, действительно много, иностранцев. Правильное написание их отчества не содержало никаких признаков искомого окончания (а в некоторых случаях отсутствовало и само отчество).
Как ни странно, подобный, очень простой алгоритм, позволил добиться потрясающей точности – на выборке в несколько сотен тысяч человек (при базе для обучения в полтора миллиона) было допущено всего 6 ошибок (которые будут описаны ниже и каждую из которых, вполне вероятно, живой человек тоже совершил бы).
Некоторые подробности предварительной подготовки обучающей выборки:
Поскольку каждый раз, когда требуется определить пол человека, пробегаться по таблице контрагентов со всеми записями долго, то агрегированную информацию о частотах появления определенной части ФИО в хранимых данных я разместил во вспомогательной таблице. Выглядит это как четверка параметров – [часть ФИО – тип (Ф, И или О)– пол – число записей в базе]. Статистика обновляется еженедельно, автоматически.
Для определения того, какое соотношение мужчин и женщин для одной части ФИО считать достаточным основанием для причисления его к тому или иному полу, я использовал следующую функцию:
Ошибки алгоритма. Я обнаружил три ситуаций, когда алгоритм может выдать некорректный результат:
К сожалению, данный метод не является серебряной пулей, он просто лучше всех других, которые я встречал. Я тестировал метод на нескольких базах данных в разных компаниях. К минусам можно отнести то, что для части людей из-за недостаточной статистики определить пол по ФИО нельзя: на базе в 1,5 млн человек таких людей чуть больше 1%, на базе в 300 тыс человек таких около 3%, на базе в 6 млн человек не удалось определить пол для 0,8%. У меня есть предположение, что процент людей, для которых пол не может быть определен, обратно пропорционален корню из размера обучающей выборки, но никакого объяснения — почему именно так происходит, у меня нет. Конечно, процент людей, для которых пол может быть определен можно увеличить (и даже довести почти до 100%) установив более мягкие условия на то, когда человеку можно присвоить какой-либо пол, но для задач, с которыми я работал, была важнее точность, чем 100%-ное отнесение к одному из двух классов.
Другой недостаток, которому подвержен данный метод – плохая работа с опечатками. Несмотря на то, что некоторые из них довольно стандартны (имя «Олга» встречается чаще, чем, например, вполне правильное «Октябрина»), для большинства опечаток статистика будет отсутствовать => определить пол по такому имени будет не всегда возможно. К сожалению, обратное утверждение (если искомое имя еще ни разу не встречалось в базе, значит оно написано не правильно) не верно – людей с уникальными именами не меньше, чем опечаток в именах обычных людей.
Как и у любого инструмента, у этого есть особенности, о которых не задумываешься при создании.
Определение пола по ФИО
Подскажите, пожалуйста, алгоритм определения пола по ФИО. Может есть на питоне какие-то решения? Я пробовал: 1-по окончаниям; 2-с помощью pymorphy разбивал ФИО на слова и определял род каждого слова. Есть еще какие-нить библиотеки или может алгоритм? ФИО могут быть не только русские.
4 ответа 4
Сначала достанем базу данных на этом сайте
Также давайте закажем для генерации базу и для английских имён по аналогии.
Процесс не быстрый, так что можно пойти заварить чаёк и выкурить сигаретку. Как придём, нам придёт 2 письма со ссылками на скачивание наших БД.
Давайте протестируем что у нас получилось на нескольких входных данных:
Можно воспользоваться pymorphy2 для определения пола по имени:
Также для определения пола по фио можно использовать нейронную сеть. Пример можно взять здесь: https://github.com/Rai220/MlSexDetector
В дополнение к ответу user243273:
Для более широкой проверки я предлагаю:
Пример работы кода:
Всё ещё ищете ответ? Посмотрите другие вопросы с метками python python-3.x алгоритм nlp или задайте свой вопрос.
Связанные
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.9.24.40305
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Автоматическое определение пола по имени
Но мы не лингвисты, поэтому реализовать такой модуль было бы слишком сложно для нас, да и функция “не первой необходимости”. Но недавно, работая над склонениями текстов бесконечных актов, договоров и прочих юридических документов, мы вспомнили об используемом нами уже 2 года сервисе Морфер. Это прекрасный лингвистический сервис, специализирующийся на русском языке и позволяющий склонять по падежам слова, целые предложения, числительные, а также получать текст из цифр. В общем, потрясающая разработка всего одного человека — Сергея Слепова.
Итак, открываем спустя некоторое время его сайт и обнаруживаем — есть удобный и простой модуль для PHP, который позволяет определять род существительного. Т.е. подставляя сочетания ФИО можно получить достаточно точное определение пола (мужской, женский). Супер! Реализация функции не заставила себя долго ждать. Все сделано в виде шаблонов в тексте рассылки.
С помощью хитрой конструкции склонения:
В результате на выходе получится или “Уважаемый” или “Уважаемая”.
Вот еще пример конструкции:
=> в результате будет “Дорогой Иван” или “Дорогая Маргарита” или «Дорогой клиент» (если имя не задано)
Для тех, кто пользуется нашим онлайн-редактором, все еще проще:
Удобные ссылки в панели управления по нажатию на кнопку человечка справа вверху, которые вы видите на скриншоте выше.
Написать подобную обертку действительно не сложно. Производительность модуля поражает и позволяет использовать такое определение пола и автоподстановку шаблона “на лету” в процесс отправки рассылки без потери скорости.
Поэтому, если у вас стоит задача “живой” работы с текстами, склонением различных слов и словосочетаний, работы с числительными — то библиотека Сергея вам в помощь! Огромное ему за нее спасибо!
Python | Половая идентификация по имени с использованием NLTK
Natural Language Toolkit (NLTK) — это платформа, используемая для создания программ для анализа текста. Мы можем наблюдать, что мужские и женские имена имеют некоторые отличительные характеристики. Имена, оканчивающиеся на a, e и i, скорее всего, будут женскими, а имена, оканчивающиеся на k, o, r, s и t, скорее всего, будут мужскими. Давайте построим классификатор для более точного моделирования этих различий.
Чтобы запустить приведенную ниже программу на Python, вам необходимо установить NLTK. Пожалуйста, следуйте инструкциям по установке.
Первым шагом в создании классификатора является определение того, какие функции входных данных актуальны и как их кодировать. Для этого примера мы начнем с простого взгляда на последнюю букву имени. Следующая функция извлечения функций создает словарь, содержащий соответствующую информацию о данном имени.
Пример :
Появится графический интерфейс, затем выберите «все» для всех пакетов и нажмите «скачать». Это даст вам все токенизаторы, чанкеры, другие алгоритмы и все корпуса, поэтому установка займет довольно много времени.
Классификация — это задача выбора правильной метки класса для данного ввода. В базовых задачах классификации каждый вход рассматривается отдельно от всех других входов, а набор меток определяется заранее. Некоторые примеры задач классификации:
Основная классификационная задача имеет ряд интересных вариантов. Например, в классификации нескольких классов каждому экземпляру может быть назначено несколько меток; в классификации открытого класса набор меток заранее не определен; и в классификации последовательности список входов классифицируется совместно.
Классификатор называется контролируемым, если он построен на основе учебного корпуса, содержащего правильную метку для каждого входа. Структура, используемая контролируемой классификацией, показана на рисунке.
Набор для обучения используется для обучения модели, а набор для тестирования — для анализа ошибок. Тестовый набор служит для нашей окончательной оценки системы. По причинам, обсуждаемым ниже, важно, чтобы мы использовали отдельный набор dev-test для анализа ошибок, а не просто использовали тестовый набор.
Разделение данных корпуса на различные подмножества показано на следующем рисунке:
Получить ссылку текстового файла, используемого здесь —
from nltk.corpus import names
# подготовка списка примеров и соответствующих меток классов.
labeled_names = ([(name, ‘male’ ) for name in names.words( ‘male.txt’ )] +
[(name, ‘female’ ) for name in names.words( ‘female.txt’ )])
# мы используем экстрактор функций для обработки данных имен.
featuresets = [(gender_features(n), gender)
for (n, gender) in labeled_names]
# Разделить полученный список функций
# устанавливает в тренировочный набор и тестовый набор.
train_set, test_set = featuresets[ 500 :], featuresets[: 500 ]
# Тренировочный набор используется для
# обучить новому «наивному байесовскому» классификатору.
print (classifier.classify(gender_features( ‘mahavir’ )))
# вывод должен быть «мужской»
print (nltk.classify.accuracy(classifier, train_set))
# показывает точность нашего классификатора и
# train_set. который должен быть больше 99%
# classifier.show_most_inforrative_features (10)
Получение информационных функций от классификатора:
№ 10 обозначает 10 строк
Выход: