Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Определение пола по фио на python

#алгоритм #python_3x


Подскажите, пожалуйста, алгоритм определения пола по ФИО. Может есть на питоне какие-то
решения? Я пробовал: 1-по окончаниям;
2-с помощью pymorphy разбивал ФИО на слова и определял род каждого слова.
Есть еще какие-нить библиотеки или может алгоритм? ФИО могут быть не только русские.
    


Ответы

Ответ 1



Мой вариант - это пробегаться по базе данных и спрашивать есть ли совпадения: Сначала достанем базу данных на этом сайте В левом окне в шаге 3 выберем Russian (Cyrillic) - в правом я выбираю United States, для генерации укажем только интересующие нас поля: Gender, Given Name и Surname, саму базу сделаем самой большой: 50000 Также давайте закажем для генерации базу и для английских имён по аналогии. Процесс не быстрый, так что можно пойти заварить чаёк и выкурить сигаретку. Как придём, нам придёт 2 письма со ссылками на скачивание наших БД. Напишем код: import pandas as pd dfru = pd.read_csv('FNru.csv') dfen = pd.read_csv('FNen.csv') # создадим сеты, чтобы не бегать по одному и тому же item'у rumalenames = set(dfru[dfru['Gender'] == 'male']['GivenName']) rumalesurnames = set(dfru[dfru['Gender'] == 'male']['Surname']) rufemalenames = set(dfru[dfru['Gender'] == 'female']['GivenName']) rufemalesurnames = set(dfru[dfru['Gender'] == 'female']['Surname']) enmalenames = set(dfen[dfen['Gender'] == 'male']['GivenName']) enmalesurnames = set(dfen[dfen['Gender'] == 'male']['Surname']) enfemalenames = set(dfen[dfen['Gender'] == 'female']['GivenName']) enfemalesurnames = set(dfen[dfen['Gender'] == 'female']['Surname']) name = input('Name: ') surname = input('Surname: ') if name in rumalenames and surname in rumalesurnames: print(name, surname, 'is male') elif name in rufemalenames and surname in rufemalesurnames: print(name, surname, 'is female') elif name in enmalenames and surname in enmalesurnames: print(name, surname, 'is male') elif name in enfemalenames and surname in enfemalesurnames: print(name, surname, 'is female') else: print('Unkown data') Давайте протестируем что у нас получилось на нескольких входных данных: # Name: Никита # Surname: Токарев # Никита Токарев is male # Name: Ольга # Surname: Соколова # Ольга Соколова is female # Name: Жанна # Surname: Токарева # Жанна Токарева is female # Name: Carolina # Surname: Thompson # Carolina Thompson is female # Name: Mark # Surname: Watson # Mark Watson is male # Но решение не идеально, конечно # Требуется либо очень много данных, либо очень хорошая БД # И то не факт, что все имена будут включены # Name: Олег # Surname: Волоков # Unkown data # Name: Ashley # Surname: Roth # Unknown data

Ответ 2



Также для определения пола по фио можно использовать нейронную сеть. Пример можно взять здесь: https://github.com/Rai220/MlSexDetector Пример работы: Input name: Владимир Путин Sex: М [[ 4.24729733e-05 9.96808589e-01 3.14901001e-03]] Input name: Любовь Петрова Sex: Ж [[ 3.94746803e-06 7.50368787e-03 9.92492378e-01]] Input name: Полад Бюльбюль оглы Sex: М [[ 0.00102036 0.97395748 0.0250222 ]] Input name: Кто Где Sex: unknown [[ 9.99970675e-01 2.07114244e-05 8.59489865e-06]]

Ответ 3



Можно воспользоваться pymorphy2 для определения пола по имени: name_list = ['Константин', 'Виктор', 'Любовь', 'Дамир', 'Венера', 'Таисия', 'Алёна', 'Евгений', 'Егор', 'Никита'] # pip install pymorphy2 import pymorphy2 morph = pymorphy2.MorphAnalyzer() for name in name_list: parsed_word = morph.parse(name)[0] print('{:<15} {}'.format(name, parsed_word.tag.gender)) Результат: Константин masc Виктор masc Любовь femn Дамир masc Венера femn Таисия femn Алёна femn Евгений masc Егор masc Никита masc PS. У некоторых имен есть ё (например, Алёна), которая часто заменяется на е, поэтому такие имена может библиотека неправильно определить. Например, скажет что Алена это мужского пола. PPS. Метод morph.parse возвращает список, т.к. у одного слова может выдать несколько вариантов разбора. Например, для Алена мне выдало несколько вариантов, и один из них был Алена, другой Алёна. Поэтому для своего скрипта я добавлял проверку с заменой е -> ё.

Комментариев нет:

Отправить комментарий