miércoles, 21 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.

R script:
libs<-c('tm','stringi')
lapply(libs,require, character.only= TRUE)

# FUNCIONES ------------------------------
clean_txt <- function(txt){
   txt <- stri_trim(gsub('[[:punct:][:digit:] ]+',' ',tolower(txt)))
    return(strsplit(txt, " ")[[1]])
}

get_gender2 <- function(nombre, lista_nombres="") {
  nombre <- clean_txt(nombre)
  nombre <- subset(nombre, nombre %in% lista_nombres)
  mylist <- list()
  mylist[c("f", "m","a")] <- 0
  for (i in 1:length(nombre)){
    g <- as.character(df[which(df$nombre == nombre[i]),"genero"])
    g <- ifelse(identical(g, character(0)), 'a', g)
    if(i==1){
    mylist[[g]] <- mylist[[g]] + 2
    } else{
    mylist[[g]] <- mylist[[g]] + 1
    }
  g2 = sapply(mylist, function(x) x[which.max(abs(x))])
  return(names(g2[g2==max(g2)])[1])
  }
}

# DATOS ---------------------------------
path <- 'https://www.dropbox.com/s/15usc7vi1nlimfj/nombres.csv?dl=1'
df <- read.csv(path, sep=",",  colClasses = "character")
get_gender2("jose maria altagracia", df$nombre)

2 comentarios:

  1. Me sirvió la base que generaste un montón, muchas gracias!

    ResponderEliminar
  2. Y si quiero meter un vector lleno de nombres?

    ResponderEliminar