Comment déterminer le genre (sexe) d’un prénom avec PHP ?

Mathieu Chartier Développement 0 commentaire

PHP est un langage de programmation qui ne cesse de m'étonner, et surtout qui a vraiment de quoi lutter face à d'autres mastodontes, malgré les critiques qu'il peut prendre de temps en temps (à tort ou à raison d'ailleurs). J'aimerais vous présenter plusieurs astuces parfois méconnues en PHP qui peuvent pourtant s'avérer pratique, je commence donc ma série avec la détermination du genre (ou sexe) d'un prénom grâce à la programmation.

Certes, l'intérêt de trouver dynamiquement le genre d'un prénom ou d'un nom peut être jugé comme limité, mais en soi, c'est très intéressant. J'y vois surtout un aspect marketing, notamment dans les emails personnalisés envoyés à des clients. Plutôt que de mettre les "Madame, Monsieur" et de rédiger des phrases dans les deux genres comme "Vous êtes l'heureux(se) gagnant(e)...", on pourrait imaginer des variantes des messages selon le genre de chacun, etc. Ce serait un pas de plus vers la personnalisation automatique des réponses, sans avoir à demander la civilité des gens...

Qu'est-ce que PECL ?

Il faut d'abord savoir que PHP est un langage précompilé qui contient un "coeur" remplit de fonctions, commandes, etc. Toutefois, tout n'est pas inséré par défaut dans le coeur afin d'alléger le programme. Bien que cela ne soit pas aussi bien réalisé que dans des langages comme Python, Java ou C, c'est déjà très bien de penser ainsi, en espérant d'ailleurs que cela continue dans les prochaines versions de PHP. Pour pouvoir trouver le genre d'un prénom ou d'une personne, nous allons devoir utiliser la classe Gender qui provient d'une extension PECL (PHP Extension Community Library).

PECL est donc un ensemble d'extensions validées par PHP et créées au fur et à mesure par la communauté qui viennent compléter les fonctionnalités du langage, à l'image du très connu PEAR. L'intérêt est de bénéficier d'un nombre important de possibilités le plus simplement possible. Voici donc les prérequis nécessaires pour pouvoir trouver le genre d'un prénom français en PHP :

  1. Vérifiez que l'extension Gender de PECL est installée.
  2. Installez et activez l'extension Gender.
  3. Utilisez et programmez ce qui semble intéressant pour vous selon la version de PHP désirée (PHP 7.0.2 ici). :-)

Comment installer une extension PECL avec WampServer sur Windows ?

Les deux premières étapes sont liées, car dans 99% des cas, l'extension de la classe Gender ne sera pas installée dans votre dossier PHP ni dans le fichier php.ini, etc. Selon votre configuration l'installation pourra varier, je vous présente donc la démarche pour WampServer sur Windows 64 Bits :

  1. Téléchargez l'extension DLL sur le site de PECL pour la classe Gender dans votre version de PHP (Gender 1.1.0 en PHP 7.0 ici).
  2. Décompressez l'archive téléchargée et copiez le fichier php_gender.dll dans le dossier "etc" de la version de PHP que vous utilisez (situé dans le dossier "bin/php/php7.0.2/etc").
  3. Ouvrez le fichier phpForApache.ini et recherchez "PECL". Vous devriez tomber sur des lignes ressemblant à "extension=php_xxx.dll". S'il y a un ";" devant le mot "extension", c'est que la ligne est commentée (et l'extension désactivée).
  4. Sous la liste des extensions activées ou désactivées, ajoutez la commande "extension=php_gender.dll".
  5. Redémarrez Apache (ou Wamp) et cela devrait être bon (parfois il faut retenter la procédure pour que cela fonctionne...).

Que faire avec la classe Gender de PECL ?

Maintenant que la classe Gender existe dans notre coeur de PHP, il ne reste qu'à programmer ce qui nous plaît. Pour les exemples à venir, j'ai décidé de créer 3 fonctions simples :

  • getGender() qui récupère le numéro de genre de la classe (les équivalences se trouve dans la documentation) ;
  • getDisplayGender() qui détermine le genre "Masculin", "Féminin", "Unisexe" (...) du prénom donné ;
  • getDisplayTitleByGender() qui détermine l'usage du titre "Monsieur" ou "Madame" si le genre est bien déterminé.

La classe Gender n'est pas conçue de la manière la plus courante en PHP objet. Elle utilise de nombreuses constantes qui déterminent les genres par défaut, ou les pays d'origine des dictionnaires testés (il est possible d'importer ses propres dictionnaires de prénoms). Le seul prérequis à l'utilisation de la classe est d'utiliser un espace de nom déterminé, ce qui est plutôt une bonne pratique en programmation (mais souvent oubliée...). Il faudra donc toujours commencer les programmes avec la ligne "namespace Gender;".

Toutes les fonctions suivantes sont rédigées en PHP 7.0, avec les types de données demandés et les types de retour, à la manière de Java. C'est un des gros avantage de PHP 7, alors il ne faut pas se priver pour développer plus "proprement". :-)

getGender()

// Fonction de détection du genre
function getGender(string $name, string $origin):string {
    // Lancement de la classe Gender()
    $object = new Gender();

    // Récupération du genre (déterminé ou non)
    $gender = $object->get($name, $origin);

    return $gender; // Retourne un code pour le genre (ex: 77 = male, 70 = female...)
}

getDisplayGender()

// Fonction personnelle d'affichage des genres
function getDisplayGender(string $gender):string {
    // Le prénom est féminin
    if($gender == Gender::IS_FEMALE) {
        $result = "Féminin";
    } else
    // Le prénom est masculin
    if($gender == Gender::IS_MALE) {
        $result = "Masculin";
    } else
    // Le prénom est plus souvent féminin
    if($gender == Gender::IS_MOSTLY_FEMALE) {
        $result = "Souvent féminin";
    } else
    // Le prénom est plus souvent masculin
    if($gender == Gender::IS_MOSTLY_MALE) {
        $result = "Souvent masculin";
    } else
    // Le prénom est unisexe
    if($gender == Gender::IS_UNISEX_NAME || $gender == Gender::IS_A_COUPLE) {
        $result = "Unisexe (mixte)";
    } else
    // Le prénom est indéterminé
    if($gender == Gender::NAME_NOT_FOUND || Gender::ERROR_IN_NAME) {
        $result = "Indéterminé";
    } else {
        $result = "Erreur";
    }

    return $result;
}

getDisplayTitleByGender()

// Fonction personnelle d'affichage des genres
function getDisplayTitleByGender(string $gender):string {
    // Le prénom est féminin
    if($gender == Gender::IS_FEMALE || $gender == Gender::IS_MOSTLY_FEMALE) {
        $result = "Madame";
    } else
    // Le prénom est masculin
    if($gender == Gender::IS_MALE || $gender == Gender::IS_MOSTLY_MALE) {
        $result = "Monsieur";
    } else {
    	$result = ""; // Ne retourne rien si le sexe n'est pas déterminé (ou "neutre" si vous préférez).
    }

    return $result;
}

Jusque-là, tout va bien, il ne s'agit que de faire du copier/coller et d'analyser rapidement ces codes. Tout l'intérêt de la classe Gender est présent dans la fonction getGender(), les deux autres fonctions sont personnelles et me permettent de personnaliser l'affichage des genres ou civilités en français. Il ne reste donc qu'à utiliser ces fonctions sans plus tarder. Et dans l'exemple, je vais créer un tableau de prénoms à tester, qui va me retourner la civilité (si déterminée), le prénom, le code du genre (issu de la classe Gender) et le genre attribué, comme dans la capture ci-dessous.

Utilisation de la classe Gender en PHP pour déterminer le genre ou sexe d'un prénom

Voici donc le code simple (en procédurale) qui permet cet affichage (hors CSS) :

// Détermination du pays source => Voir : https://secure.php.net/manual/fr/class.gender.php
$origin = Gender::FRANCE;

// Tableau de prénoms à tester pour l'exemple
$names = array("Mickael", "Mathieu", "Ingrid", "Eden", "Maxime", "Maxence", "Jude", "Charlie", "Marie", "Claude", "Jocelin", "Emmanuel", "Sandy", "Gabriel", "Murielle", "Camille");

// Lancement de la fonction (voir plus bas)
echo "<table>";
echo "<tr>";
echo "<th>Prénom</th>";
echo "<th>Code genre</th>";
echo "<th>Genre</th>";
echo "</tr>";
foreach($names as $name) {
    // Récupération du genre
    $gender = getGender($name, $origin);

    echo "<tr>";
    echo "<td>".getDisplayTitleByGender($gender)." ".$name."</td>";
    echo "<td>".$gender."</td>";
    echo "<td>".getDisplayGender($gender)."</td>";
    echo "</tr>";
}
echo "</table>";

Voilà, vous savez maintenant comment déterminer le sexe d'un prénom en PHP. :-)

Bonus pour la route...

La classe Gender ne possède pas uniquement une méthode get() pour récupérer le genre d'un prénom. Il existe également deux autres méthodes très intéressantes à mes yeux :

  1. isNick qui permet de comparer deux prénoms pour savoir s'ils sont jugés comme similaire ou non ("Jocelyn" et "Jocelin" par exemple).
  2. similarNames qui permet d'obtenir un tableau des prénoms équivalents à celui testés (dans le pays désiré ou dans tous les pays de la classe).

Vous devriez avoir de quoi vous amuser ainsi... ;-)