Vérifier qu'on a bien les formes masculines et féminines des professions sur Wikidata

Ash_Crow Wikidata

Une petite requête du dimanche pour Wikidata, ça faisait longtemps !

Quand on cherche à récupérer la profession de quelqu'un via une requête SPARQL, on se retrouve souvent face à un problème : le libellé est soit formulé au masculin (pas pratique quand la personne dont on veut la profession est une femme), soit sous une forme de type « travailleur ou travailleuse » (pas pratique quelque soit le genre de la personne), sauf bien sûr dans les cas où le libellé est épicène. Il existe bien des propriétés forme féminine du libellé (P2521) et forme masculine du libellé (P3321) [1] mais elles ne sont pas toujours remplies pour une langue donnée.

Si on ne cherche qu'un élément, c'est vite vérifié, mais quand on travaille sur un groupe de personnes, il peut être utile de vérifier si c'est bien rempli pour tout le monde au premier coup d’œil. Voici une requête d’exemple qui fait juste ça pour les membres du mouvement artistique des Seiz Breur:

SELECT DISTINCT ?occupation ?occupationLabel ?label_fem ?label_masc
WHERE 
{
  ?person wdt:P31 wd:Q5 .        # Nature de l’élément : être humain
  ?person wdt:P135 wd:Q3477959 . # Membre de : Seiz Breur (à remplacer par ce que vous cherchez)
  
  # Recherche de la profession et des formes genrées associées en français
  ?person wdt:P106 ?occupation .
  
  OPTIONAL { ?occupation wdt:P2521 ?label_fem . FILTER(langmatches(lang(?label_fem), 'fr')) }
  OPTIONAL { ?occupation wdt:P3321 ?label_masc . FILTER(langmatches(lang(?label_masc), 'fr')) }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "fr". }
} ORDER BY ?occupationLabel

(Lien vers la requête et vers le résultat)

Résultat de la requête : on voit qu'il y a du boulot

S'il y a plusieurs formes féminines ou masculines, cette requête en fait apparaître une par ligne. Il est cependant possible de les regrouper pour n’avoir qu’une ligne par occupation :

SELECT DISTINCT ?occupation ?occupationLabel (GROUP_CONCAT(DISTINCT(?label_fem) ; separator=", ") AS ?labels_fem)  (GROUP_CONCAT(DISTINCT(?label_masc) ; separator=", ") AS ?labels_masc)
WHERE 
{
  ?person wdt:P31 wd:Q5 .        # Nature de l’élément : être humain
  ?person wdt:P135 wd:Q3477959 . # Membre de : Seiz Breur (à remplacer par ce que vous cherchez)
  
  # Recherche de la profession et des formes genrées associées en français
  ?person wdt:P106 ?occupation .
  
  OPTIONAL { ?occupation wdt:P2521 ?label_fem . FILTER(langmatches(lang(?label_fem), 'fr')) }
  OPTIONAL { ?occupation wdt:P3321 ?label_masc . FILTER(langmatches(lang(?label_masc), 'fr')) }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "fr". }
} GROUP BY  ?occupation ?occupationLabel ORDER BY ?occupationLabel

(Lien vers la requête et vers le résultat)

Enfin, une fois que les formes féminines et masculines ont bien été remplies, on peut envisager de les récupérer dans une requête sur les membres du groupe directement avec le bon genre :

SELECT DISTINCT ?person ?personLabel (SAMPLE(?given_name_label) AS ?given_name_label) (SAMPLE(?last_name_label) AS ?last_name_label) (SAMPLE(?gender_label) AS ?gender_label) (SAMPLE(?birthdate) AS ?birthdate) (SAMPLE(?deathdate) AS ?deathdate) (GROUP_CONCAT(DISTINCT ?occupation_label; SEPARATOR = ", ") AS ?occupations) WHERE {
  ?person wdt:P31 wd:Q5;
    wdt:P135 wd:Q3477959;
    wdt:P735 ?given_name.

  # Given name
  ?given_name rdfs:label ?given_name_label . FILTER(LANGMATCHES(LANG(?given_name_label), "fr"))
  
  # Last name
  ?person wdt:P734 ?last_name .
  ?last_name rdfs:label ?last_name_label. FILTER(LANGMATCHES(LANG(?last_name_label), "fr"))

  # Gender
  ?person wdt:P21 ?gender .
  ?gender rdfs:label ?gender_label . FILTER(LANGMATCHES(LANG(?gender_label), "fr"))
  
  # Occupation
  OPTIONAL {
    ?person wdt:P106 ?occupation .
    ?occupation wdt:P2521 ?label_fem . FILTER(LANGMATCHES(LANG(?label_fem), "fr"))
    
    ?occupation wdt:P3321 ?label_masc. FILTER(LANGMATCHES(LANG(?label_masc), "fr"))
  }
  BIND(IF(?gender = wd:Q6581072, ?label_fem, ?label_masc) AS ?occupation_label)

  OPTIONAL { ?person wdt:P569 ?birthdate. }
  OPTIONAL { ?person wdt:P570 ?deathdate. }

  SERVICE wikibase:label { bd:serviceParam wikibase:language "fr, en". }
}
GROUP BY ?person ?personLabel
ORDER BY (?nameLabel)

(Lien vers la requête et vers le résultat)

En gros, on récupère le genre de la personne (?gender) et la profession (?occupation) ainsi que les deux formes en français (?label_fem et ?label_masc)
Si le genre vaut wd:Q6581072 (« féminin »), on donne la valeur de ?label_fem à la variable ?occupation_label, sinon on lui donne la valeur de ?label_masc.

Enfin, au moment de l'affichage des résultats, on concatène les éventuelles différentes valeurs de ?occupation_label dans une nouvelle variable ?occupations, en les séparant par une virgule et une espace : (GROUP_CONCAT(DISTINCT ?occupation_label; SEPARATOR = ", ") AS ?occupations).

Extrait simplifié des résultats de la requête précédente (en masquant les champs supplémentaires)

Comme on le voit, les résultats sont à la fois agrégés et correctement genrés. Ainsi, sur la ligne correspondant à Jeanne Malivel on a bien « peintre, enseignante, autrice de littérature pour la jeunesse, infirmière, illustratrice, graveuse » et sur celle de René-Yves Creston « ethnologue, peintre, conservateur de musée, résistant, graveur ».

Image d’en-tête:

La Pyramide du capitalisme (restaurée, détail), 1911, par Industrial Workers of the World, domaine public.

0 commentaire publié.

Notes de bas de page

  1. Ça me scie toujours qu’il y ait autant d’écart entre les libellés de ces deux propriétés. Elles auraient dû être créées en même temps.

Commentaires

Ajouter un nouveau commentaire

Required for comment verification