AVP Gender Review - Многопоточный определитель сексуальной принадлежности !

  • Автор темы Автор темы Mikhail B.
  • Дата начала Дата начала

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 449
Реакции
5 477
Баллы
113
male-or-female.jpg


Всем привет. Я решил поделится интересным решением по определению пола.

При парсинге данных с сайта Авито возникла задача определить пол. Сам сайт не давал подобных данных, по этому я приступил к поиску решений данной задачи. Сразу же подумал проверять имя на наличие в списке, но мне это показалось затратным по ресурсам. Спустя время я пришел к выводу, что поиск имени является самым доступным и эффективным вариантом.
По скольку предыдущее обновление парсера включало в себя блэклист, то за основу я взял сниппет @Adigen который отлично выполнял функции блэклиста.
C#:
Развернуть Свернуть Копировать
IZennoList Names = project.Lists["names"]; //привязываемся к списку
string Element = "Vasya";
return Names.Contains(Element); // True/False

К моему удивлению оказалось, что метод Contains не подошел в случае с определением имен, хотя точные вхождения обрабатывал без проблем.
В переменной Element, было значение Андреева.
Contains нашел Андре. Как так произошло мы так и не поняли.
Мистика! :ea:


В общем было решено все это дело переносить в Regex и парсить регуляркой ^Андреева$
Это немного повысило нагрузку, зато определение было более точным.
Вот так выглядит итоговый сниппеет.

C#:
Развернуть Свернуть Копировать
string nameRegexp = project.Variables["NAME"].Value; // NAME - название зенно переменной
IZennoList Names = project.Lists["FEMALE"];
Regex re = new Regex(nameRegexp, RegexOptions.IgnoreCase);
return Names.Any(item => re.IsMatch(item));

NAME - сюда кладем регулярку или просто имя.
FEMALE - это список с женскими именами
return - Ответ будет True (Имя найдено) и False (Имя не найдено)

Если не найдено, чекаем на мужской пол. И тут я решил что все, работа сделана, можно курить бамбук. Запустил чек на 100к имен и офигел. 20к имен он просто не распознал.
Списки с именами для идентификации пола я нашел на форуме, внушительный список около 30к имен. Они были полностью на кириллице, но это же не паспортный стол, "Дашечки", "Юрки" - такие имена улетали в список "Не определен", по мимо этого был всякий треш из смеси англ. и русских букв. Я начал просматривать этот список и собирать имена вручную! Вручную КАРЛ! Это был адовый труд, ох я и ошибок насмотрелся, за пару часов все было готово, основной приоритет отдавал русским именам. Итог по 1к строк я добавил в списки.

Пример имен из списка "Не определен"

Камуфляжный Ниндзя
Красивая Независимая
Лавка тёти Сары
Озорная Семейка
НЕВСКИЙ БЛЯДИНА
разгружаю гардероб
тихорецкие_лизуны
kati
Kati
Katia
Katie
Katina
Katjuscha
Katrin
Katrin&ampVilyam
katrin.s
Katrina
Katrine
katrinka.mо
Katrins
Katrish
Katsunari
Katterina
katty
Katush_k_a
KATVR-SHOP
katyaprosto
Katyasha
Katycha
katyusha
Kaтерина
Kaтя
Kristen
Kristine
Kristinka
Kristinochka
Kristusha
Kristy
Ksela
Ksena
Kseniaaa
Ksenialucky
Kseniia
Ksenija
Kseny
Ksenya
Ksu
ksucha
Ksucha-1977
ksuha
ksush.81
Ksusha
Ksuyshka
Ksyou1992
Ksyunechka
Kарина
Kатерина
Kатя
Kира
Kристина

По скольку проверка идет только по одному слову, то такие имена "Эльмирочка Николаева" приходилось разделять на две переменных и чекать по очереди. т.е. Если "Эльмирочка"(Имя 1) не определилась, то проверяем "Николаева"(Имя 2) если она есть.


Плюс ко всему не экранированные символы приводили к ошибке, по этому я сделал замену этих символов на пробел (Дополнять по мере необходимости, если не знаете как дополнить - пишите в теме).
Код:
Развернуть Свернуть Копировать
(\(|\)|\+|\\|\*|-)

В процессе обкатки, дополнительно ввел пару мелких правок. (Проверку переменной Имя на пустоту и т.д.)

На момент публикации статьи я получил такой результат

Мужских имен: 54506.
Женских имен: 46593.
Не определено: 25665.

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


Примеры полученных данных.

2018-05-11_021024.png
2018-05-11_021124.png


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

Ну и в дополнение ответ на вопрос. А зачем определять пол? Например для формирования баз, по определенным критериям. Допустим женщины продающие автомобиль. Это сэкономит время и позволит более точно определить свою ЦА. Всем спасибо, Удачи!
 
Номер конкурса статей
  1. Девятый конкурс статей
Тема статьи
  1. Парсинг

Вложения

Последнее редактирование:
Есть куча сервисов с апи, которые по имени определят пол на любом языке, например, https://genderize.io/ куча подобных гуглятся легко
 
Есть куча сервисов с апи, которые по имени определят пол на любом языке, например, https://genderize.io/ куча подобных гуглятся легко
Ага, только бы он работал =) Вот так будешь парсить 300к строк и сервис отрубится. И пару суток работы коту под хвост. А тут все на компе и не надо беспокоится и нагрузка на систему приемлемая.

Погуглил вот сайт gender-api.com, я забыл в статье указать про то, что рассматривал данный вариант и он не подошел по простой причине. Это лимиты 500 имен с 1 аккаунта. У меня парсер 500 Номеров-Имен спарсит за 2-3 минуты. И что мне регистрировать каждые 3 минуты новый аккаунт на этом сервисе?
2018-05-14_224911.png
 
Последнее редактирование:
Как идея это-отлично,и за шаблон спасибо.
Списки с именами для идентификации пола я нашел на форуме, внушительный список около 30к имен.
То есть необходимо изначально иметь базу имен чтобы например спарсить и идентифицировать, например, английские имена?
 
  • Спасибо
Реакции: Mikhail B.
Как идея это-отлично,и за шаблон спасибо.
То есть необходимо изначально иметь базу имен чтобы например спарсить и идентифицировать, например, английские имена?
Благодарю =)
Да, для англ имен надо найти базу. По скольку у меня парсинг для РФ, то и списки соответствующие. Могу помочь в поиске англ базы.
 
  • Спасибо
Реакции: andrwork
с mysql можно было сделать, было бы быстрее и ресурсов ноль по затратам)
 
с mysql можно было сделать, было бы быстрее и ресурсов ноль по затратам)
Да мне много кто говорил про это.)) На этапе создания в приоритете было сделать быстрее. Я честно не знаю mysql и не готов был (не хотел) его изучать на тот момент. То решение которое я предоставил не оказывает большой нагрузки на систему. Но вот если значительно расширять базы имен, то конечно лучше БД использовать.
--

Кстати через пару дней, я опубликую во втором сообщении еще один сниппет который теоретически должен решить проблему с именами содержащими смесь англ и русских букв.
 
Последнее редактирование:
Полезная статья. Не только Авито не дает фильтровать по полу. Не встречал таких решений, а применить зенку даже мысль не приходила. Сплошные "не", когда сталкиваешься с такой необходимостью, а тут готовое решение. Спасибо, очень годно. Однозначно пригодится.
 
  • Спасибо
Реакции: Mikhail B.
Чесно думал будет статья посильнее от Михи. :(
 
А если имя фамилия не определяется? например Саша Цой или Женя Ладник и т.п. :-)
 
Александр
Aлексaндp

и что твой код ответит на это ? к какому полу относятся эти имена ?
 
Чесно думал будет статья посильнее от Михи. :(
Я не планировал даже участвовать. Решение принял спонтанно. Извините если не оправдал ожиданий.

А если имя фамилия не определяется? например Саша Цой или Женя Ладник и т.п. :-)
Фамилия попадает в список "Не определен". Понимаешь в чем дело и почему две переменных, имя пишут иногда в начале, а иногда на 2 месте. Бывает еще 3 слова, но это очень редко.
Екатерина Андреева.
Лещенко Ксюня.

Александр
Aлексaндp

и что твой код ответит на это ? к какому полу относятся эти имена ?
Подъебать меня решил? =)
 
Последнее редактирование:
почему подъебать
просто метод сравнивания по имени самый древний и ресурсоёмкий
минус - базы искать или собирать вручную ручками
а люди сейчас имена пишут как хотят, и что когда ты парсить будешь так же им говорить будешь, вы что меня подъёбываете меняете кирилицу на латиницу у меня шаб куёво отрабатывает )))

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

поэтому в своём коде поставь замену латиницы на кирилицу некоторых символов,букв
Я вобще то вчера писал...
Кстати через пару дней, я опубликую во втором сообщении еще один сниппет который теоретически должен решить проблему с именами содержащими смесь англ и русских букв.
 
Я вобще то вчера писал...
не заметил так как не читал все сообщения, ну тогда исправляй )))
а с двойными можешь так придумать, сравнивай два слова, и смотри что выдаст
Екатерина Андреева - выдаст что оба Ж - значит сука ))
Егор Криминалов Криминальщиков - все М - кабель ))
 
Екатерина Андреева - выдаст что оба Ж - значит сука ))
Егор Криминалов Криминальщиков - все М - кабель ))
Не так работает. Шаб оборачивает каждое слово в регулярку, в твоем примере после проверки первого слова шаб определит пол.

Имя 1 = ^Егор$ - М
Имя 2 = ^Криминалов$ - не определен

Имя 1 = ^Екатерина$ - Ж
Имя 2 = ^Андреева$ - не определен
 
поэтому и добавляй и фамилии и отчество, или для начала без базы делаешь проверку кодом по окончанию
что не распознало прогоняешь по базам
 
поэтому и добавляй и фамилии и отчество
Слушай хорошая идея, пополнить список популярными фамилиями и отчествами в женском и мужском роде.

или для начала без базы делаешь проверку кодом по окончанию
Я видел это решение на форуме. Но по сколько на Авито имен с отчество практически нету, эту затею отбросил.

UPD. По отчествам можно сделать проверку о окончанию. А вот с фамилиями сложнее. Некоторые окончания пересекаются с условно популярными именами.
Примеры:
Яков
Вова
Иегова
 
Последнее редактирование:
Да мне много кто говорил про это.)) На этапе создания в приоритете было сделать быстрее. Я честно не знаю mysql и не готов был (не хотел) его изучать на тот момент. То решение которое я предоставил не оказывает большой нагрузки на систему. Но вот если значительно расширять базы имен, то конечно лучше БД использовать.
Что там изучать? Залил готовую базу на сервер https://mydata.biz/ru/catalog/databases/names_db
И спросил у людей как сделать всего один запрос к БД.
 
  • Спасибо
Реакции: DmitryAk и Vavildi
Полезно и практично, пригодится в парсерах 100%! Жаль под бурж имена пока ничего годного нету
 
Полезно и практично, пригодится в парсерах 100%! Жаль под бурж имена пока ничего годного нету
под бурж таким методом сложнее будет распознать, там может быть на гласную имя женское, не может а 100% так и есть
 
  • Спасибо
Реакции: yriy158
Первое обновление.
  • Почистил списки.
  • Добавил 500 популярных фамилий.
  • Добавил проверку по отчеству.
Процент распознавания остался на прежнем уровне. =)
 
  • Спасибо
Реакции: Vavildi
Первое обновление.
  • Почистил списки.
  • Добавил 500 популярных фамилий.
  • Добавил проверку по отчеству.
Процент распознавания остался на прежнем уровне. =)
За самоиронию плюс :)
 
  • Спасибо
Реакции: Mikhail B.
За самоиронию плюс :-)
Знаешь. В списках имен нашел ошибки и удалил (+ удалил Саша, Валя, Женя), соответственно процент снизился. Добавил фамилии и отчества и это компенсировало слегка.
Большую роль играет источник имен. На авито просто тьма ошибок, по этому если человек пишет Отчество или Фамилию, то уже в 90% случаев он напишет грамотно и без ошибок, соответственно на примере авито толку от фамилий и отчеств практически 0. Куда важнее идентифицировать имена со смешанной раскладкой, на днях выкачу решение и сравню еще раз.
 
Данный метод является самым примитивным и первым, что приходит на ум. Но нужно приучить себя к тому, что многие вещи уже были реализованы задолго до того, как данная задача появилась у нас в голове.
Если процент распознавания не критичен, то можно оставить всё как есть - более-менее популярные имена он будет обрабатывать с хорошей степенью корректности, но предложу почитать следующие статьи и вопросы с комментариями для тех, кому процент распознавания критичен:
https://habr.com/post/274499/
https://ru.stackoverflow.com/questions/655179/Определение-пола-по-фио-на-python
https://github.com/vadimiztveri/sex_by_russian_name

Естественно, придется всё переписывать с тех языков или использовать их реализации. Но зато там же можно подцепить себе размеченные базы ;-)

PS: если бы у меня появилась такая задача, то я бы обучил классификатор fastText для этого. Но почему-то мне кажется, что я уже где-то читал, что есть готовый датасет для определения имени под fastText (вроде где-то в issue's для этого репа на гитхабе видел).
 
PS: если бы у меня появилась такая задача, то я бы обучил классификатор fastText для этого. Но почему-то мне кажется, что я уже где-то читал, что есть готовый датасет для определения имени под fastText (вроде где-то в issue's для этого репа на гитхабе видел).
Звучит супер! Только ничего не понятно :D
 
  • Спасибо
Реакции: Vavildi
  • Спасибо
Реакции: kagorec и Mikhail B.
Фамилия попадает в список "Не определен".
С фамилией понятно, а пол получается по имени тоже не определит? Если имя Саша или Женя и т.п. которое есть и у мужчин и у женщин, как тогда пол определить?
 
Если имя Саша или Женя и т.п. которое есть и у мужчин и у женщин, как тогда пол определить?
Никак, необходимо из списка исключить подобные имена. Все привязанно к спискам, если имени в списке нету, то и результат будет "Не определен".
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)