Подскажите, пожалуйста, алгоритм определения пола по ФИО. Может есть на питоне какие-то решения? Я пробовал: 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
Комментариев нет:
Отправить комментарий