océrisation et reformatage des données

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Alexandre Dangléant
Messages : 270
Enregistré le : 30 Mar 2010, 14:38

Re: océrisation et reformatage des données

Messagepar Alexandre Dangléant » 03 Nov 2015, 14:17

Je ne connaissais pas ce testeur là, mais je vois qu'il y a le même problème de conversion.

Si ça peut t'aider, j'ai fini par considérer que sous R, il vaut mieux travailler de toute façon en décrivant du début à la fin l'entièreté de la chaîne de caractère sur laquelle on travaille (ce qui se fait automatiquement, alors qu'en regexp "pur", il faut utiliser les balises ^ et $). Donc je cherche d'abord à décrypter, puis à cibler ce qui m'intéresse. La logique d'extraction d'un type de caractère me pose encore problème lors des transcriptions dans R, et dans la plupart des cas je m'en tire mieux comme ça. Au final, l'utilisation de ".+" (qui a ses limites) permet de combler rapidement ce qui ne t'intéresse pas...

Bon, ça c'est pour le système D. Note que je suis assez novice dans le domaine et d'autres contributeurs pourront t'apporter des réponses plus éclairées.

Pour ce qui est de séparer des résultats dans des colonnes, cela n'a plus vraiment de lien avec les expressions régulières, mais avec la gestion de leur résultat. Par exemple, en reprenant l'exemple plus haut, on avait :

Code : Tout sélectionner

gsub('(.+) [0-9]{4}.+', '\\1', artiste4) # Mettons que l'année m'intéresse aussi

gsub('(.+) ([0-9]{4}).+', '\\1', artiste4) # Je rajoute une capture "()" sur les chiffres

# Et voilà un joli tableau dont la construction se fait par un procédé classique de R :
data.frame(Patronyme = gsub('(.+) ([0-9]{4}).+', '\\1', artiste4), annee = gsub('(.+) ([0-9]{4}).+', '\\2', artiste4))


Et là tu m'en veux un peu parce que je n'ai pas répondu à ton problème :-)

Donc la vrai question là dessous c'est "Comment je sépare nom et prénom vu la structure de mes données?"
Et vu ce que tu as, je n'ai pas trouvé le truc qui marche partout, car des fois il n'y a pas de prénom et autres variantes... J'ai juste qq essais à te soumettre :

Code : Tout sélectionner

artiste <- c("SAIN DE HEERS Emilie 1907 née à Nanterre Seine 80 rue Taitbout 9",
       "SAINRICE 1927 né à Gap HautesAlpes 34 me des Boulangers 5",
       "SAINTANGE 1923 né à NeuillysurSeine 8 rue Meissonier 17e",
       "SAINTDELIS René de 1905 né à SaintOmer PdeC Etretat SeineInférieure")
 
gsub('(.+) ([A-Z][a-z]+).+ [0-9]{4}.+', '\\1', artiste)
[1] "SAIN DE HEERS"                                             "SAINRICE 1927 né à Gap HautesAlpes 34 me des Boulangers 5" "SAINTANGE 1923 né à NeuillysurSeine 8 rue Meissonier 17e"
[4] "SAINTDELIS"
Au-dessus, je cherche les prénoms uniquement, car ils ont une structure standard : une majuscule et des minuscules. Par contre, si tu as un "Jean-Claude" je crains que ça ne marche pas... Et donc, le '\\1' vise les caractères qui précèdent le prénom, et le '\\2' le prénom lui même. Mais comme tu peux le voir, quand il n'y a pas de prénom tout fou le camp...

A ta place, j'essayerai de travailler en plusieurs étapes afin de séparer les structures différentes (pas de prénom, etc.).

Une piste :

Code : Tout sélectionner

(aux <- gsub('[A-Z]+ ', "\\1" , artiste)) # Retire les mots en majuscules suivi d'un espace
[1] "Emilie 1907 née à Nanterre Seine 80 rue Taitbout 9"     "1927 né à Gap HautesAlpes 34 me des Boulangers 5"       "1923 né à NeuillysurSeine 8 rue Meissonier 17e"         "René de 1905 né à SaintOmer PdeEtretat SeineInférieure"

# Maintenant, on a les chaine où ça a marché qui commence par 4 décimaux. On s'en sert :
gsub('([0-9]{4}).+', '\\1', aux)
[1] "Emilie 1907"  "1927"         "1923"         "René de 1905"

# donc si on a exactement 4 caractères, c'est qu'on à qu'un nom, sinon on a le prénom.
# On compte les caractères :
nchar(gsub('([0-9]{4}).+', '\\1', aux))
[1] 11  4  4 12

nchar(gsub('([0-9]{4}).+', '\\1', aux)) == 4 # TRUE / FALSE disant si oui ou non il y a un prénom

tri <- nchar(gsub('([0-9]{4}).+', '\\1', aux)) == 4 # Et après tu te sers de ton tri pour travailler sur des choses homogènes

> artiste[tri] # Les "sans-prénoms"
[1] "SAINRICE 1927 né à Gap HautesAlpes 34 me des Boulangers 5" "SAINTANGE 1923 né à NeuillysurSeine 8 rue Meissonier 17e"


Bref, maintenant que tu as l'esprit, a toi de creuser.

Cordialement (et bon courage!).

P.S: au fond de moi je suis persuadé qu'il y en a un qui va nous sortir ça en une ligne de code et je vais être vert...

Wilfrid Car
Messages : 59
Enregistré le : 09 Avr 2015, 13:35

Re: océrisation et reformatage des données

Messagepar Wilfrid Car » 03 Nov 2015, 17:19

Un grand merci pour toutes ces propositions.
Je vais je vais tester dans les prochains jours...


Bien cordialement,

Wilfrid


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité

cron