Newer
Older
web-services / authors-tools / v1 / first-name / preprocessing.py
import pandas as pd
from unidecode import unidecode
import pickle

"""
Script qui permet de générer un pickle à partir des données fusionnées de la librairie 'gender_guesser' (https://pypi.org/project/gender-guesser/)
et de Kaggle (https://www.kaggle.com/datasets/haezer/french-baby-names?select=national_names.csv). 
Présentes dans le fichier 'nam_dict_merged.txt'.
"""



with open('nam_dict_merged.txt', 'r') as f :
    names = []
    genders = []
    frequencies = []
    for line in f :
        if line[0] not in "#=" and line[29] != "+" :
            parts = line.split()
            country_values = line[30:-1]
            name = parts[1]
            name = name.lower()
            name = unidecode(name)
            freq_max = max(country_values)
            names.append(name)
            genders.append(parts[0])
            frequencies.append(freq_max)
    
    df = pd.DataFrame({'gender': genders, 'name': names, 'freq': frequencies})
    df = df.sort_values("freq",ignore_index=True)
    df = df.drop_duplicates(subset=["gender","name"], keep='last',ignore_index=True)
    df = df.drop(columns=['freq'])
    # print(df.to_string())

my_dict = {}
for index, row in df.iterrows():
    my_dict[row['name'].lower()] = row['gender']
# print(my_dict)

def modified_name_plus(my_dict):
    key_plus = []
    for key in my_dict :
        if "+" in key :
            key_plus.append(key)
    for key in key_plus:
        value = my_dict[key]
        new_key_space = key.replace('+', ' ')
        new_key = key.replace('+', '')
        new_key_dash = key.replace('+', '-')
        my_dict[new_key_space] = value # ajouter une copie de la paire clé-valeur avec un espace à la fin du dictionnaire
        my_dict[new_key] = value # ajouter une copie de la paire clé-valeur sans le "+" à la fin du dictionnaire
        my_dict[new_key_dash] = value
        del my_dict[key] # supprimer la paire clé-valeur d'origine contenant le "+"
    return my_dict

def modified_name_apostrophe(my_dict) :
    key_apostrophe = []
    for key in my_dict :
        if "'" in key :
            key_apostrophe.append(key)
    for key in key_apostrophe:
        value = my_dict[key]
        new_key = key.replace("'", "")
        my_dict[new_key] = value # ajouter une copie de la paire clé-valeur sans le "+" à la fin du dictionnaire
        del my_dict[key] # supprimer la paire clé-valeur d'origine contenant le "+"
    return my_dict

my_dict_1 = modified_name_plus(my_dict)
my_dict_modified = modified_name_apostrophe(my_dict_1)
# print(my_dict_modified)

with open('name_gender.pickle', 'wb') as handle:
    pickle.dump(my_dict_modified, handle, protocol=pickle.HIGHEST_PROTOCOL)