« GenealogyBot » : différence entre les versions
(13 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 49 : | Ligne 49 : | ||
<u>Vérification d'existence</u> | <u>Vérification d'existence</u> | ||
Afin de ne pas écraser de pages déjà présentes sur Wikipast, on vérifie s'il n'existe pas déjà une page avec pour titre un couple de nom et prénom présent dans nos données. Si tel est le cas, nous ne créons pas de nouvelle page pour cette personne là. En effet, nous considérons que nous n'avons pas assez d'informations dans nos données pour décider s'il s'agit de la même personne ou pas. | Afin de ne pas écraser de pages déjà présentes sur Wikipast, on vérifie s'il n'existe pas déjà une page avec pour titre un couple de nom et prénom présent dans nos données. Si tel est le cas, nous ne créons pas de nouvelle page pour cette personne là. En effet, nous considérons que nous n'avons pas assez d'informations dans nos données pour décider s'il s'agit de la même personne ou pas. Les métiers et la commune d'origine d'une personne ne sont que rarement renseignés tels quels dans les datafications biographiques. De plus, les pages créées par notre bot sont presque les seules à mentionner l'identité des parents d'une personne. Ainsi il ne nous resterait que le nom, prénom et la date de naissance pour déterminer si deux homonymes sont la même personne ou pas, ce qui nous semble trop peu. | ||
<u>Gestion d'homonymies</u> | <u>Gestion d'homonymies</u> | ||
La partie précédente explique comment nous traitons le cas d'une homonymie entre une personne dans nos données et une personne sur une page de Wikipast. Cependant, il y a aussi plusieurs cas d'homonymies au sein de nos données, à la fois dans les chefs de famille et dans les enfants. Il faut donc trouver une façon de différencier ces homonymes pour ne pas "fusionner" deux personnes différentes sur une même page et écraser les informations à propos d'une de ces personnes. | |||
Ainsi, nous avons choisi de donner un titre précis à nos pages : | Ainsi, nous avons choisi de donner un titre précis à nos pages : | ||
Ligne 59 : | Ligne 59 : | ||
[[Prénom Nom]] né en [[Date de naissance]]</nowiki> | [[Prénom Nom]] né en [[Date de naissance]]</nowiki> | ||
Avec cette méthode nous pensons éviter les erreurs d' | Avec cette méthode nous pensons éviter les erreurs d'homonymies. | ||
<u>Création des pages non déjà existantes</u> | <u>Création des pages non déjà existantes</u> | ||
A partir de la liste des chefs de famille, nous créons une page par ligne de données. | A partir de la liste des chefs de famille, nous créons une page par ligne de données. Comme expliqué plus haut, le format du titre est | ||
<nowiki> | <nowiki> | ||
[[Prénom Nom]] né en [[date de naissance]]</nowiki> | |||
Le format du corps de page pour le chef de famille est le suivant: | Le format du corps de page pour le chef de famille est le suivant: | ||
<nowiki> | <nowiki> | ||
* [[Date]]/ -. [[Naissance]] de [[Prénom Nom né en Date| Prénom | * [[Date]]/ -. [[Naissance]] de [[Prénom Nom né en Date| Prénom Nom]]. [source]</nowiki> | ||
Et à partir de la liste des enfants, nous créons une page pour chaque enfant et nous éditons la page du chef de famille afin de prendre en compte la naissance de l'enfant. | Et à partir de la liste des enfants, nous créons une page pour chaque enfant et nous éditons la page du chef de famille afin de prendre en compte la naissance de l'enfant. | ||
Ligne 78 : | Ligne 78 : | ||
* [[Date]]/ -. [[Naissance]] de [[Prénom Nom né en Date| Prénom nom]], enfant de [[Prénom et Nom du père né en Date| Prénom et Nom du père]] et de son épouse née [[Nom de la mère]]. [source]</nowiki> | * [[Date]]/ -. [[Naissance]] de [[Prénom Nom né en Date| Prénom nom]], enfant de [[Prénom et Nom du père né en Date| Prénom et Nom du père]] et de son épouse née [[Nom de la mère]]. [source]</nowiki> | ||
Si | Si on ne connaît pas le nom de jeune fille de la mère, l'entrée devient : | ||
<nowiki> | <nowiki> | ||
* [[Date]]/ -. [[Naissance]] de [[Prénom Nom né en Date| Prénom nom]], enfant de [[Prénom et Nom du père né en Date| Prénom et Nom du père]]. [source]</nowiki> | * [[Date]]/ -. [[Naissance]] de [[Prénom Nom né en Date| Prénom nom]], enfant de [[Prénom et Nom du père né en Date| Prénom et Nom du père]]. [source]</nowiki> | ||
Ligne 88 : | Ligne 88 : | ||
===Performances techniques=== | ===Performances techniques=== | ||
Le temps d'exécution du bot est 2m30. Cela permet la création de 1112 nouvelles pages. | Le temps d'exécution du bot est 2m30. Cela permet la création de 1112 nouvelles pages dont 679 nouvelles pages pour les chefs de famille et 433 nouvelles pages pour les enfants. | ||
Cependant, on perd beaucoup d’informations avec notre gestion des erreurs d’OCR. En effet, il y a 4916 personnes recensées (3701 chefs de famille et 1215 enfants) dans les donées traitées par notre bot et une nouvelle page n'est créée que pour 23% des personnes recensées. | |||
===Améliorations possibles=== | ===Améliorations possibles=== | ||
Ligne 108 : | Ligne 110 : | ||
Exemple d'un chef de famille: [http://wikipast.epfl.ch/wiki/Louis_Collioud_n%C3%A9_en_1793] | Exemple d'un chef de famille: [http://wikipast.epfl.ch/wiki/Louis_Collioud_n%C3%A9_en_1793] | ||
[[Fichier:exempleGenealogyBot.png|1000px]] | |||
Exemple d'un enfant: [http://wikipast.epfl.ch/wiki/Marie_Collioud_n%C3%A9_en_1822] | Exemple d'un enfant: [http://wikipast.epfl.ch/wiki/Marie_Collioud_n%C3%A9_en_1822] | ||
[[Fichier:exempleGenealogyBot1.png|1000px]] | |||
==Code== | ==Code== | ||
L'entièreté du code est disponible sur GitHub. [https://github.com/JeremyDezalos/GenealogyBot] | L'entièreté du code est disponible sur GitHub. [https://github.com/JeremyDezalos/GenealogyBot] |
Dernière version du 1 juin 2021 à 09:15
Le but de ce bot est de traiter les données généalogiques provenant du recensement lausannois de 1832.
Données traitées
Les données traitées par ce bot sont des données généalogiques issues du recensement de 1832 dans la ville de Lausanne. Le document original est accessible sur le site des archives de Lausanne [1]. C'est la transcription automatique par un OCR de ces données qui est utilisée [2]. Cela correspond à 3701 entrées sous le format d'un tableau Excel.
Résumé des fonctionnalités
Dans un premier temps, le bot doit traiter toutes les entrées pour en extraire le nom de tous les chefs de famille et de leurs enfants ainsi que leurs dates de naissances respectives. Ensuite, il doit créer sur Wikipast les pages et/ou les entrées correspondantes en respectant la bonne syntaxe.
Description technique
Extraction des données
Nous utilisons la librairie Pandas de Python qui nous permet d'extraire les données du recensement de 1832 de la ville de Lausanne depuis un fichier .xlsx ("1832_pc.xlsx" [3]) qui contient 3701 entrées, chaque entrée représentant un ménage.
Les données qui nous intéressent sont :
- - Le nom et prénom du chef du ménage
- - L'année de naissance du chef du ménage
- - Le nom de naissance de l'épouse du chef du ménage (s'il est marié)
- - Les noms des enfants du couple
- - Leur année de naissance
On extrait donc uniquement ces informations et on les stocke dans un fichier .csv ("1832_pc_relevant_columns.csv" [4]) sous la forme :
chef_prenom,chef_nom,chef_annee_naissance,epouse_nom,epouse_annee_naissance,enfants_dans_la_commune_prenom,enfants_annee_naissance
Traitement des données
Gestion des erreurs d'OCR
Toutes ces données sont transcrites automatiquement par un OCR et contiennent des erreurs. Il faut donc traiter à la fois les erreurs sur les noms et prénoms et les erreurs sur les date de naissance.
Pour traiter les erreurs d'OCR sur les noms et prénoms, nous avons à disposition un dictionnaire de noms ("family_names.xlsx" [5]) et un dictionnaire de prénoms ("all_prenoms.csv" [6]) provenants de sources historiques croisées. On compare donc les noms et prénoms de nos données généalogiques à ceux présents dans les dictionnaires. Si une ligne de nos données ne correspondent pas aux entrées de ces dictionnaires, nous l'ignorons simplement.
Pour traiter les erreurs d'OCR sur les dates de naissance, nous retirons toutes les dates avant 1730 et après 1832 afin de ne conserver que des dates pouvant réellement correspondre à la date de naissance d'une personne recensée en 1832.
Ainsi, nous commençons par filtrer les noms et prénoms des parents. Nous nous assurons que l'année de naissance du chef de famille soit également cohérente comme expliqué plus haut. Après ce premier passage, il nous reste 679 lignes de données sans erreurs apparentes. Ensuite, nous traitons les enfants d'un couple au cas par cas afin de ne pas évincer toute une fratrie à cause d'une erreur provenant d'un seul enfant. Les critères restent les mêmes que pour les parents. Parmi les 1217 enfants, seuls 433 n'ont aucune erreur et sont ainsi gardés. Cette gestion des erreurs d'OCR nous permet de créer le fichier "filtered.csv" [7] qui contient toutes nos données ainsi filtrées.
Traitement pour faciliter la création des entrées sur Wikipast
Afin de faciliter la création sur les pages de Wikipast des entrées correspondant à la naissance de chaque enfant, on créer également un fichier "chef_enfant.csv" [8]. Ce fichier associe le prénom de chaque enfant au nom et prénom de ses parents sous la forme suivante :
chef_prenom,chef_nom,epouse_nom,enfants_dans_la_commune_prenom,annee_enfant
Ainsi on obtient une ligne par enfant et non plus une ligne par fratrie.
Création des pages sur Wikipast
Vérification d'existence
Afin de ne pas écraser de pages déjà présentes sur Wikipast, on vérifie s'il n'existe pas déjà une page avec pour titre un couple de nom et prénom présent dans nos données. Si tel est le cas, nous ne créons pas de nouvelle page pour cette personne là. En effet, nous considérons que nous n'avons pas assez d'informations dans nos données pour décider s'il s'agit de la même personne ou pas. Les métiers et la commune d'origine d'une personne ne sont que rarement renseignés tels quels dans les datafications biographiques. De plus, les pages créées par notre bot sont presque les seules à mentionner l'identité des parents d'une personne. Ainsi il ne nous resterait que le nom, prénom et la date de naissance pour déterminer si deux homonymes sont la même personne ou pas, ce qui nous semble trop peu.
Gestion d'homonymies
La partie précédente explique comment nous traitons le cas d'une homonymie entre une personne dans nos données et une personne sur une page de Wikipast. Cependant, il y a aussi plusieurs cas d'homonymies au sein de nos données, à la fois dans les chefs de famille et dans les enfants. Il faut donc trouver une façon de différencier ces homonymes pour ne pas "fusionner" deux personnes différentes sur une même page et écraser les informations à propos d'une de ces personnes.
Ainsi, nous avons choisi de donner un titre précis à nos pages :
[[Prénom Nom]] né en [[Date de naissance]]
Avec cette méthode nous pensons éviter les erreurs d'homonymies.
Création des pages non déjà existantes
A partir de la liste des chefs de famille, nous créons une page par ligne de données. Comme expliqué plus haut, le format du titre est
[[Prénom Nom]] né en [[date de naissance]]
Le format du corps de page pour le chef de famille est le suivant:
* [[Date]]/ -. [[Naissance]] de [[Prénom Nom né en Date| Prénom Nom]]. [source]
Et à partir de la liste des enfants, nous créons une page pour chaque enfant et nous éditons la page du chef de famille afin de prendre en compte la naissance de l'enfant.
Le format pour la page des enfants est le suivant:
* [[Date]]/ -. [[Naissance]] de [[Prénom Nom né en Date| Prénom nom]], enfant de [[Prénom et Nom du père né en Date| Prénom et Nom du père]] et de son épouse née [[Nom de la mère]]. [source]
Si on ne connaît pas le nom de jeune fille de la mère, l'entrée devient :
* [[Date]]/ -. [[Naissance]] de [[Prénom Nom né en Date| Prénom nom]], enfant de [[Prénom et Nom du père né en Date| Prénom et Nom du père]]. [source]
Cette ligne est également ajoutée à la page du père.
Discussion des performances
Performances techniques
Le temps d'exécution du bot est 2m30. Cela permet la création de 1112 nouvelles pages dont 679 nouvelles pages pour les chefs de famille et 433 nouvelles pages pour les enfants.
Cependant, on perd beaucoup d’informations avec notre gestion des erreurs d’OCR. En effet, il y a 4916 personnes recensées (3701 chefs de famille et 1215 enfants) dans les donées traitées par notre bot et une nouvelle page n'est créée que pour 23% des personnes recensées.
Améliorations possibles
De futures améliorations de ce bot sont envisageables :
- Exploitation de données issues du recensement et non traitées par le bot actuel :
- - année de naissance de l'épouse
- - métier chef de famille
- - adresse où vit le ménage
- - toutes les informations sur les pensionnaires (nom, prénom, origine, condition)
- - pour la source dans les datafications biographiques, renvoyer vers le bon numéro de page au lieu de renvoyer juste sur le sites des archives de la ville de Lausanne
- Correction de certaines erreurs d'OCR:
- - pour les dates : remettre les | de séparation aux endroits où les dates sont correctes mais qu'ils sont juste manquants
- - pour les noms : corriger les noms et prénoms à l'aide des dictionnaires lorsqu'ils ont juste une lettre de fausse
Exemple type de pages
Exemple d'un chef de famille: [9]
Exemple d'un enfant: [10]
Code
L'entièreté du code est disponible sur GitHub. [11]