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

Discussion in 'Девятый конкурс статей' started by Mikhail B., May 14, 2018.

  1. Mikhail B.

    Mikhail B. Moderator

    Joined:
    Dec 23, 2014
    Messages:
    5,822
    Likes Received:
    1,893
    male-or-female.jpg

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

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


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

    Code (csharp):
    1. string nameRegexp = project.Variables["NAME"].Value; // NAME - название зенно переменной
    2. IZennoList Names = project.Lists["FEMALE"];
    3. Regex re = new Regex(nameRegexp, RegexOptions.IgnoreCase);
    4. return Names.Any(item => re.IsMatch(item));
    NAME - сюда кладем регулярку или просто имя.
    FEMALE - это список с женскими именами
    return - Ответ будет True (Имя найдено) и False (Имя не найдено)

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

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

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


    Плюс ко всему не экранированные символы приводили к ошибке, по этому я сделал замену этих символов на пробел (Дополнять по мере необходимости, если не знаете как дополнить - пишите в теме).
    Code (text):
    1. (\(|\)|\+|\\|\*|-)
    В процессе обкатки, дополнительно ввел пару мелких правок. (Проверку переменной Имя на пустоту и т.д.)

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

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

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


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

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

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

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

    Attached Files:

    Last edited: May 15, 2018
    GreenWay, andrwork, Hannes and 17 others like this.
  2. nole

    nole Client

    Joined:
    Nov 19, 2010
    Messages:
    341
    Likes Received:
    155
    Есть куча сервисов с апи, которые по имени определят пол на любом языке, например, https://genderize.io/ куча подобных гуглятся легко
     
  3. Mikhail B.

    Mikhail B. Moderator

    Joined:
    Dec 23, 2014
    Messages:
    5,822
    Likes Received:
    1,893
    Ага, только бы он работал =) Вот так будешь парсить 300к строк и сервис отрубится. И пару суток работы коту под хвост. А тут все на компе и не надо беспокоится и нагрузка на систему приемлемая.

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

    texnorip Client

    Joined:
    Oct 22, 2016
    Messages:
    12
    Likes Received:
    7
    Как идея это-отлично,и за шаблон спасибо.
    То есть необходимо изначально иметь базу имен чтобы например спарсить и идентифицировать, например, английские имена?
     
    Mikhail B. likes this.
  5. Mikhail B.

    Mikhail B. Moderator

    Joined:
    Dec 23, 2014
    Messages:
    5,822
    Likes Received:
    1,893
    Благодарю =)
    Да, для англ имен надо найти базу. По скольку у меня парсинг для РФ, то и списки соответствующие. Могу помочь в поиске англ базы.
     
    andrwork likes this.
  6. Risk

    Risk Client

    Joined:
    Aug 26, 2016
    Messages:
    73
    Likes Received:
    25
    с mysql можно было сделать, было бы быстрее и ресурсов ноль по затратам)
     
  7. Mikhail B.

    Mikhail B. Moderator

    Joined:
    Dec 23, 2014
    Messages:
    5,822
    Likes Received:
    1,893
    Да мне много кто говорил про это.)) На этапе создания в приоритете было сделать быстрее. Я честно не знаю mysql и не готов был (не хотел) его изучать на тот момент. То решение которое я предоставил не оказывает большой нагрузки на систему. Но вот если значительно расширять базы имен, то конечно лучше БД использовать.
    --

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

    Strategik Client

    Joined:
    May 25, 2016
    Messages:
    9
    Likes Received:
    3
    Полезная статья. Не только Авито не дает фильтровать по полу. Не встречал таких решений, а применить зенку даже мысль не приходила. Сплошные "не", когда сталкиваешься с такой необходимостью, а тут готовое решение. Спасибо, очень годно. Однозначно пригодится.
     
    Mikhail B. likes this.
  9. AZANIR

    AZANIR Client

    Joined:
    Jun 9, 2014
    Messages:
    267
    Likes Received:
    107
    Чесно думал будет статья посильнее от Михи. :(
     
  10. radv

    radv Client

    Joined:
    May 11, 2015
    Messages:
    254
    Likes Received:
    129
    А если имя фамилия не определяется? например Саша Цой или Женя Ладник и т.п. :-)
     
  11. ssXXXss

    ssXXXss Client

    Joined:
    Dec 23, 2014
    Messages:
    6,925
    Likes Received:
    1,754
    Александр
    Aлексaндp

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

    Mikhail B. Moderator

    Joined:
    Dec 23, 2014
    Messages:
    5,822
    Likes Received:
    1,893
    Я не планировал даже участвовать. Решение принял спонтанно. Извините если не оправдал ожиданий.

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

    Подъебать меня решил? =)
     
    Last edited: May 15, 2018
  13. ssXXXss

    ssXXXss Client

    Joined:
    Dec 23, 2014
    Messages:
    6,925
    Likes Received:
    1,754
    почему подъебать
    просто метод сравнивания по имени самый древний и ресурсоёмкий
    минус - базы искать или собирать вручную ручками
    а люди сейчас имена пишут как хотят, и что когда ты парсить будешь так же им говорить будешь, вы что меня подъёбываете меняете кирилицу на латиницу у меня шаб куёво отрабатывает )))

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

    Mikhail B. Moderator

    Joined:
    Dec 23, 2014
    Messages:
    5,822
    Likes Received:
    1,893
    Я вобще то вчера писал...
     
  15. ssXXXss

    ssXXXss Client

    Joined:
    Dec 23, 2014
    Messages:
    6,925
    Likes Received:
    1,754
    не заметил так как не читал все сообщения, ну тогда исправляй )))
    а с двойными можешь так придумать, сравнивай два слова, и смотри что выдаст
    Екатерина Андреева - выдаст что оба Ж - значит сука ))
    Егор Криминалов Криминальщиков - все М - кабель ))
     
  16. Mikhail B.

    Mikhail B. Moderator

    Joined:
    Dec 23, 2014
    Messages:
    5,822
    Likes Received:
    1,893
    Не так работает. Шаб оборачивает каждое слово в регулярку, в твоем примере после проверки первого слова шаб определит пол.

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

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

    ssXXXss Client

    Joined:
    Dec 23, 2014
    Messages:
    6,925
    Likes Received:
    1,754
    поэтому и добавляй и фамилии и отчество, или для начала без базы делаешь проверку кодом по окончанию
    что не распознало прогоняешь по базам
     
  18. Mikhail B.

    Mikhail B. Moderator

    Joined:
    Dec 23, 2014
    Messages:
    5,822
    Likes Received:
    1,893
    Слушай хорошая идея, пополнить список популярными фамилиями и отчествами в женском и мужском роде.

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

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

    Karamzin Client

    Joined:
    May 24, 2016
    Messages:
    141
    Likes Received:
    222
    Что там изучать? Залил готовую базу на сервер https://mydata.biz/ru/catalog/databases/names_db
    И спросил у людей как сделать всего один запрос к БД.
     
    DmitryAk and Vavildi like this.
  20. Adigen

    Adigen Client

    Joined:
    Jul 28, 2014
    Messages:
    828
    Likes Received:
    605
    Не пойму зачем тут бд вообще, чтобы делать разовый селект всей таблицы ?
     
  21. yriy158

    yriy158 Client

    Joined:
    Aug 10, 2013
    Messages:
    401
    Likes Received:
    230
    Полезно и практично, пригодится в парсерах 100%! Жаль под бурж имена пока ничего годного нету
     
  22. ssXXXss

    ssXXXss Client

    Joined:
    Dec 23, 2014
    Messages:
    6,925
    Likes Received:
    1,754
    под бурж таким методом сложнее будет распознать, там может быть на гласную имя женское, не может а 100% так и есть
     
    yriy158 likes this.
  23. Mikhail B.

    Mikhail B. Moderator

    Joined:
    Dec 23, 2014
    Messages:
    5,822
    Likes Received:
    1,893
    Первое обновление.
    • Почистил списки.
    • Добавил 500 популярных фамилий.
    • Добавил проверку по отчеству.
    Процент распознавания остался на прежнем уровне. =)
     
    Vavildi likes this.
  24. Vavildi

    Vavildi Client

    Joined:
    Feb 29, 2016
    Messages:
    166
    Likes Received:
    93
    За самоиронию плюс :-)
     
    Mikhail B. likes this.
  25. Mikhail B.

    Mikhail B. Moderator

    Joined:
    Dec 23, 2014
    Messages:
    5,822
    Likes Received:
    1,893
    Знаешь. В списках имен нашел ошибки и удалил (+ удалил Саша, Валя, Женя), соответственно процент снизился. Добавил фамилии и отчества и это компенсировало слегка.
    Большую роль играет источник имен. На авито просто тьма ошибок, по этому если человек пишет Отчество или Фамилию, то уже в 90% случаев он напишет грамотно и без ошибок, соответственно на примере авито толку от фамилий и отчеств практически 0. Куда важнее идентифицировать имена со смешанной раскладкой, на днях выкачу решение и сравню еще раз.
     
  26. Lord_Alfred

    Lord_Alfred Client

    Joined:
    Oct 9, 2015
    Messages:
    2,884
    Likes Received:
    2,474
    Данный метод является самым примитивным и первым, что приходит на ум. Но нужно приучить себя к тому, что многие вещи уже были реализованы задолго до того, как данная задача появилась у нас в голове.
    Если процент распознавания не критичен, то можно оставить всё как есть - более-менее популярные имена он будет обрабатывать с хорошей степенью корректности, но предложу почитать следующие статьи и вопросы с комментариями для тех, кому процент распознавания критичен:
    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 для этого репа на гитхабе видел).
     
  27. Mikhail B.

    Mikhail B. Moderator

    Joined:
    Dec 23, 2014
    Messages:
    5,822
    Likes Received:
    1,893
    Звучит супер! Только ничего не понятно :D
     
    Vavildi likes this.
  28. Lord_Alfred

    Lord_Alfred Client

    Joined:
    Oct 9, 2015
    Messages:
    2,884
    Likes Received:
    2,474
    Это я говорил о библиотеке для машинного обучения: https://fasttext.cc/

    Нейронные сети это:

    [​IMG]
     
    kagorec and Mikhail B. like this.

Пользователи просматривающие тему (Пользователей: 0, Гостей: 0)