Skip to content

Instantly share code, notes, and snippets.

@cbertelegni
Last active May 3, 2022 21:40
Show Gist options
  • Select an option

  • Save cbertelegni/c2d050131e10ea6045f29b13789a9d1a to your computer and use it in GitHub Desktop.

Select an option

Save cbertelegni/c2d050131e10ea6045f29b13789a9d1a to your computer and use it in GitHub Desktop.
Script para obtener sexo desde un csv
output_all.csv
*.zip

Script para obtener el sexo desde un csv con listado de nombres en español.

Forma de uso.

Descargar el código e instalar las dependencias, en mi caso usu virtualenv

$ git clone [email protected]:c2d050131e10ea6045f29b13789a9d1a.git gender_from_csv
$ cd gender_from_csv
$ virtualenv .venv
$ source .venv/bin/activate
$ pip install -r requirements.txt

En el archivo get_gender.py designar la columna que tiene el nombre en la variable COL_NAMES

COL_NAMES = "nombres"

En el contexto que se usó este código, los nombres venian en una misma columna sin separadores de ningún tipo: Apellido + Nombre1 + (nombre2)?.

En el caso de tener los nombre de otra manera en el csv, ya sea en distintas columnas o con otro tipó de delimitador deberá modificar las siguientes lineas:

nombre_long = re.sub("\(|\)|\.|[0-9]", "", row[COL_NAMES])
n2, n1 = nombre_long.strip().split(" ")[-2:]
nombre = n2 if len(n1)<2 and n2 else n1
print nombre

Lanzar el programa

$ python get_gender.py path/to/my_csv.csv

Por default se genera el archivo ./output_all.csv con el output de los datos separado por |.

TODOS

  • Los nombres compuestos no funcionan correctamente, ej: José María || María José
  • Hay que agrandar la base de datos de los nombres para encontrar mas matchs gender-detector de Marco Vanetta
  • Agregar la posibilidad de cambiar el nombre del archivo de output
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import csv
import re
import json
import sys
from gender_detector import GenderDetector
import gender_guesser.detector as gender
BASE = os.path.dirname(os.path.abspath(__file__))
detector_ar = GenderDetector('ar') # It can also be ar, uk, uy.
detector_uy = GenderDetector('uy') # It can also be ar, uk, uy.
detector_uk = GenderDetector('uk') # It can also be ar, uk, uy.
# print detector_ar.guess('ADRIAN') # => 'male'
d = gender.Detector(case_sensitive=False)
COL_NAMES = "Nombre"
class ParserData(object):
"""Parseo de datos para watson IBM"""
def __init__(self, path_csv):
super(ParserData, self).__init__()
self.file = path_csv
# self.output = os.path.join(BASE, "./output.csv")
self.output = os.path.join(BASE, "./output_all.csv")
data = open(self.file, "rb")
with data as csvfile:
reader = csv.DictReader(csvfile)
csv_file = csv.writer(open(self.output, "wb"),delimiter="|")
reader = list(reader);
headers = reader[0].keys()
headers.append("gender_ar")
headers.append("gender_uy")
headers.append("gender_uk")
headers.append("gender_other")
csv_file.writerow(headers)
for row in reader:
r = []
for n in row: # append old data
r.append(row[n])
nombre_long = re.sub("\(|\)|\.|[0-9]", "", row[COL_NAMES])
n2, n1 = nombre_long.strip().split(" ")[-2:]
nombre = n2 if len(n1)<2 and n2 else n1
print nombre
r.append(detector_ar.guess(nombre))
r.append(detector_uy.guess(nombre))
r.append(detector_uk.guess(nombre))
r.append(d.get_gender(nombre))
csv_file.writerow(r)
print "***\nCon sol datos provistos se ha generado el archivo %s \n***" % self.output
if __name__ == "__main__":
if len(sys.argv) > 1:
_file_name = sys.argv[1]
print _file_name
else:
_file_name = "./list_names.csv"
path_csv = os.path.join(BASE, _file_name)
ParserData(path_csv, )
gender-detector==0.1.0
gender-guesser==0.3.0
Nombre Sexo
APELLIDO1 PABLO ARIEL M
APELLIDO2 LOPEZ ELIAS JORGE M
APELLIDO8 LUIS M
APELLIDO3 BLANCA MARTA F
APELLIDO4 CARLOS FRANCISCO M
APELLIDO5 GREGORIO ARSENIO M
APELLIDO6 HERMINIO OSCAR M
APELLIDO2 APELLIDO2 ELIAS JORGE M
APELLIDO7 JOSE ANIBAL M
APELLIDO8 JOSE LUIS M
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment