sábado, 10 de noviembre de 2018

Identificar genero de un nombre

El siguiente script identifica el genero de un nombre dado, utilizando una lista de nombres+genero. Los valores que devuelve son: {m, f, a}, correspondientes a masculino, femenino o ambiguo.

La lista contiene más de 46mil nombres + genero, unificados de las siguientes fuentes:
  • Lista de nombres de la librería nltk
  • Lista nombres de la librería gender_guesser
  • Lista de nombres argentinos publicados aqui

También se hicieron otras modificaciones para nombres hispanos, como borrar apellidos, agregar diminutivos, nombres cortos, alias, entre otros.

Script:
import pandas as pd 
import operator
import re 

def clean_text(txt):
    txt = re.sub("[^a-záéíóúñüäë]", " ", txt.lower())
    txt = re.sub(' +',' ', txt)
    return txt.strip().split()

def df_to_dict(df, key_column, val_column):
    """convierte dos pandas series en un diccionario"""
    xkey = df[key_column].tolist()
    xval = df[val_column].tolist()
    return dict(zip(xkey,xval))

def get_gender2(names):
    names = clean_text(names)
    names = [x for x in names if gender_list.get(x,'a') != 'a']
    gender ={'m':0, 'f':0, 'a':0}
    for i, name in enumerate(names):
        g = gender_list.get(name,'a')
        gender[g] += 1
        gender[g] += 2 if len(names) > 1 and i == 0 and g != 'a' else 0 
    gender['a'] = 0 if (gender['f']+gender['m']) > 0 else 1
    return max(gender.items(), key=operator.itemgetter(1))[0]

if __name__ == '__main__':
    path = 'https://www.dropbox.com/s/edm5383iffurv4x/nombres.csv?dl=1'
    gender_list = pd.read_csv(path)
    gender_list = df_to_dict(gender_list, key_column='nombre', val_column='genero')
    print(get_gender2('lopez jose maria'))
    print(get_gender2('santos contreras'))
    print(get_gender2('maria isabel lopez garcia rodriguez'))
    print(get_gender2('cami lopez'))
    print(get_gender2('majo garcia'))
    print(get_gender2('colon cristobal'))
    print(get_gender2('Cristóbal Colón'))
    print(get_gender2('Cristoforo Colombo'))

end


5 comentarios:

  1. Hola, quería saber si este script sigue vigente? donde reemplazo por mi archivo de nombres para saber que genero tiene cada uno?

    ResponderEliminar
  2. Hola, mil gracias por montar esto! tienes todavia vigente el archivo de nombres?

    ResponderEliminar
  3. Gracias por la información, es de gran utilidad. ¿Podría explicar un poco la función get_gender2 ?

    ResponderEliminar