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

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
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


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

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

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

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

Последнее редактирование:

nole

Client
Регистрация
19.11.2010
Сообщения
368
Благодарностей
213
Баллы
43
Есть куча сервисов с апи, которые по имени определят пол на любом языке, например, https://genderize.io/ куча подобных гуглятся легко
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
113
Есть куча сервисов с апи, которые по имени определят пол на любом языке, например, https://genderize.io/ куча подобных гуглятся легко
Ага, только бы он работал =) Вот так будешь парсить 300к строк и сервис отрубится. И пару суток работы коту под хвост. А тут все на компе и не надо беспокоится и нагрузка на систему приемлемая.

Погуглил вот сайт gender-api.com, я забыл в статье указать про то, что рассматривал данный вариант и он не подошел по простой причине. Это лимиты 500 имен с 1 аккаунта. У меня парсер 500 Номеров-Имен спарсит за 2-3 минуты. И что мне регистрировать каждые 3 минуты новый аккаунт на этом сервисе?
2018-05-14_224911.png
 
Последнее редактирование:

texnorip

Client
Регистрация
22.10.2016
Сообщения
26
Благодарностей
20
Баллы
3
Как идея это-отлично,и за шаблон спасибо.
Списки с именами для идентификации пола я нашел на форуме, внушительный список около 30к имен.
То есть необходимо изначально иметь базу имен чтобы например спарсить и идентифицировать, например, английские имена?
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
113
Как идея это-отлично,и за шаблон спасибо.
То есть необходимо изначально иметь базу имен чтобы например спарсить и идентифицировать, например, английские имена?
Благодарю =)
Да, для англ имен надо найти базу. По скольку у меня парсинг для РФ, то и списки соответствующие. Могу помочь в поиске англ базы.
 
  • Спасибо
Реакции: andrwork

Risk

Client
Регистрация
26.08.2016
Сообщения
75
Благодарностей
26
Баллы
18
с mysql можно было сделать, было бы быстрее и ресурсов ноль по затратам)
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
113
с mysql можно было сделать, было бы быстрее и ресурсов ноль по затратам)
Да мне много кто говорил про это.)) На этапе создания в приоритете было сделать быстрее. Я честно не знаю mysql и не готов был (не хотел) его изучать на тот момент. То решение которое я предоставил не оказывает большой нагрузки на систему. Но вот если значительно расширять базы имен, то конечно лучше БД использовать.
--

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

Strategik

Client
Регистрация
25.05.2016
Сообщения
9
Благодарностей
3
Баллы
3
Полезная статья. Не только Авито не дает фильтровать по полу. Не встречал таких решений, а применить зенку даже мысль не приходила. Сплошные "не", когда сталкиваешься с такой необходимостью, а тут готовое решение. Спасибо, очень годно. Однозначно пригодится.
 
  • Спасибо
Реакции: Mikhail B.

AZANIR

Client
Регистрация
09.06.2014
Сообщения
405
Благодарностей
196
Баллы
43
Чесно думал будет статья посильнее от Михи. :(
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 673
Благодарностей
1 855
Баллы
113
А если имя фамилия не определяется? например Саша Цой или Женя Ладник и т.п. :-)
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
Александр
Aлексaндp

и что твой код ответит на это ? к какому полу относятся эти имена ?
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
113
Чесно думал будет статья посильнее от Михи. :(
Я не планировал даже участвовать. Решение принял спонтанно. Извините если не оправдал ожиданий.

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

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

и что твой код ответит на это ? к какому полу относятся эти имена ?
Подъебать меня решил? =)
 
Последнее редактирование:

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
почему подъебать
просто метод сравнивания по имени самый древний и ресурсоёмкий
минус - базы искать или собирать вручную ручками
а люди сейчас имена пишут как хотят, и что когда ты парсить будешь так же им говорить будешь, вы что меня подъёбываете меняете кирилицу на латиницу у меня шаб куёво отрабатывает )))

поэтому в своём коде поставь замену латиницы на кирилицу некоторых символов,букв
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
113
почему подъебать
просто метод сравнивания по имени самый древний и ресурсоёмкий
минус - базы искать или собирать вручную ручками
а люди сейчас имена пишут как хотят, и что когда ты парсить будешь так же им говорить будешь, вы что меня подъёбываете меняете кирилицу на латиницу у меня шаб куёво отрабатывает )))

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

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
Я вобще то вчера писал...
не заметил так как не читал все сообщения, ну тогда исправляй )))
а с двойными можешь так придумать, сравнивай два слова, и смотри что выдаст
Екатерина Андреева - выдаст что оба Ж - значит сука ))
Егор Криминалов Криминальщиков - все М - кабель ))
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
113
Екатерина Андреева - выдаст что оба Ж - значит сука ))
Егор Криминалов Криминальщиков - все М - кабель ))
Не так работает. Шаб оборачивает каждое слово в регулярку, в твоем примере после проверки первого слова шаб определит пол.

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

Имя 1 = ^Екатерина$ - Ж
Имя 2 = ^Андреева$ - не определен
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
поэтому и добавляй и фамилии и отчество, или для начала без базы делаешь проверку кодом по окончанию
что не распознало прогоняешь по базам
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
113
поэтому и добавляй и фамилии и отчество
Слушай хорошая идея, пополнить список популярными фамилиями и отчествами в женском и мужском роде.

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

UPD. По отчествам можно сделать проверку о окончанию. А вот с фамилиями сложнее. Некоторые окончания пересекаются с условно популярными именами.
Примеры:
Яков
Вова
Иегова
 
Последнее редактирование:

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
Да мне много кто говорил про это.)) На этапе создания в приоритете было сделать быстрее. Я честно не знаю mysql и не готов был (не хотел) его изучать на тот момент. То решение которое я предоставил не оказывает большой нагрузки на систему. Но вот если значительно расширять базы имен, то конечно лучше БД использовать.
Что там изучать? Залил готовую базу на сервер https://mydata.biz/ru/catalog/databases/names_db
И спросил у людей как сделать всего один запрос к БД.
 
  • Спасибо
Реакции: DmitryAk и Vavildi

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
651
Баллы
93

yriy158

Client
Регистрация
10.08.2013
Сообщения
491
Благодарностей
300
Баллы
63
Полезно и практично, пригодится в парсерах 100%! Жаль под бурж имена пока ничего годного нету
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
Полезно и практично, пригодится в парсерах 100%! Жаль под бурж имена пока ничего годного нету
под бурж таким методом сложнее будет распознать, там может быть на гласную имя женское, не может а 100% так и есть
 
  • Спасибо
Реакции: yriy158

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
113
Первое обновление.
  • Почистил списки.
  • Добавил 500 популярных фамилий.
  • Добавил проверку по отчеству.
Процент распознавания остался на прежнем уровне. =)
 
  • Спасибо
Реакции: Vavildi

Vavildi

Client
Регистрация
29.02.2016
Сообщения
188
Благодарностей
103
Баллы
43
Первое обновление.
  • Почистил списки.
  • Добавил 500 популярных фамилий.
  • Добавил проверку по отчеству.
Процент распознавания остался на прежнем уровне. =)
За самоиронию плюс :-)
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
113
За самоиронию плюс :-)
Знаешь. В списках имен нашел ошибки и удалил (+ удалил Саша, Валя, Женя), соответственно процент снизился. Добавил фамилии и отчества и это компенсировало слегка.
Большую роль играет источник имен. На авито просто тьма ошибок, по этому если человек пишет Отчество или Фамилию, то уже в 90% случаев он напишет грамотно и без ошибок, соответственно на примере авито толку от фамилий и отчеств практически 0. Куда важнее идентифицировать имена со смешанной раскладкой, на днях выкачу решение и сравню еще раз.
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 852
Баллы
113
Данный метод является самым примитивным и первым, что приходит на ум. Но нужно приучить себя к тому, что многие вещи уже были реализованы задолго до того, как данная задача появилась у нас в голове.
Если процент распознавания не критичен, то можно оставить всё как есть - более-менее популярные имена он будет обрабатывать с хорошей степенью корректности, но предложу почитать следующие статьи и вопросы с комментариями для тех, кому процент распознавания критичен:
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 для этого репа на гитхабе видел).
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
113
PS: если бы у меня появилась такая задача, то я бы обучил классификатор fastText для этого. Но почему-то мне кажется, что я уже где-то читал, что есть готовый датасет для определения имени под fastText (вроде где-то в issue's для этого репа на гитхабе видел).
Звучит супер! Только ничего не понятно :D
 
  • Спасибо
Реакции: Vavildi

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 852
Баллы
113
  • Спасибо
Реакции: kagorec и Mikhail B.

radv

Client
Регистрация
11.05.2015
Сообщения
3 673
Благодарностей
1 855
Баллы
113
Фамилия попадает в список "Не определен".
С фамилией понятно, а пол получается по имени тоже не определит? Если имя Саша или Женя и т.п. которое есть и у мужчин и у женщин, как тогда пол определить?
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
113
Если имя Саша или Женя и т.п. которое есть и у мужчин и у женщин, как тогда пол определить?
Никак, необходимо из списка исключить подобные имена. Все привязанно к спискам, если имени в списке нету, то и результат будет "Не определен".
 

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