Страницы

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

пятница, 19 апреля 2019 г.

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

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


Ответ

Мой вариант - это пробегаться по базе данных и спрашивать есть ли совпадения:
Сначала достанем базу данных на этом сайте
В левом окне в шаге 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

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

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