IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Comparaison de noms de villes


Sujet :

Python

  1. #1
    Membre à l'essai
    Femme Profil pro
    Data
    Inscrit en
    Mai 2023
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Data

    Informations forums :
    Inscription : Mai 2023
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Comparaison de noms de villes
    Bonjour !

    J'aimerais trouver un moyen de comparer deux colonnes. Ici des villes. L'idée est de créer une troisieme colonne qui permette d'obtenir un score de similarité par exemple afin de savoir si une ville est dans la Source 1 et dans le Source 2 ou seulement dans la source 1/seulement dans la source 2.
    Je ne sais pas si je m'y prends correctement avec cette histoire de score de similarité, jai entendu parlé des NLP mais je n'en n'ai jamais fait. Pensez vous que ce soit une bonne idée ?

    Merci beaucoup

    (j'utilise google collab pour m'exercer)

    VILLES_exo.xlsx

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 172
    Points : 4 594
    Points
    4 594
    Par défaut
    bonjour

    c'est un exercice comme l'indique le nom ? alors utiliser un truc (NLP ou autre) est forcément une très mauvaise idée si cela n'a pas été vu en cours.
    Et prendre une usine qui construit des bulldozers pour enfoncer un seul clou, est aussi généralement une idée pas très lumineuse.
    Dans ta liste, on peut voir une différence majuscule/miniscule entre les colonnes, peut être que c'est ton unique problème ?

    "score de similarité" ? un score est directement lié à ta méthode de comparaison, cela ne veux rien dire, c'est a toi de l'inventer. 0/1 true/false est un scrore qui semble pertinent pour un début
    $moi= ( !== ) ? : ;

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 474
    Points : 9 274
    Points
    9 274
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Comparer si deux mots sont similaires (à un ratio de similitude près) est facile en Python, grâce à SequenceMatcher du module difflib. Je l'ai beaucoup utilisé pour des recherches de mots dans une liste, en tenant compte d'éventuels fautes de frappe.

    Il faut aussi utiliser deux options: sans casse (majuscules/minuscules) et sans accent. Si on voulait comparer des noms de fichiers, il faudrait ajouter une option "sans extension".

    Voilà un petit code qui fait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    # -*- coding: utf-8 -*-
     
    from difflib import SequenceMatcher  # pour recherche de mot similaire
    from unicodedata import normalize, combining # pour supprimer les accents
     
    ##############################################################################
    def supaccents(chaine):
        """Supprime les accents de la chaine de caractères 'chaine' (unicode)
           Utilise unicodedata (.normalize et .combining)
        """
        chnorm = normalize('NFKD', chaine)
        return "".join([car for car in chnorm if not combining(car)])
     
    ##############################################################################
    class Simil(object):
        """Vérifie si un mot est similaire au mot de référence au ratio près
        """
     
        #=========================================================================
        def __init__(self, motref, sanscasse=True, sansaccent=True, ratio=0.75):
            """Initialise le test
               - motref: mot de référence
               - sanscasse: si True => ne tient pas compte de la casse (maj-min)
               - sansaccent: si True => ne tient pas compte des accents
               - ratio: ratio de similitude (1.0: identique, 0.0: accepte tout)
            """
            self.motref = motref
            self.ratio = ratio
            self.sanscasse = sanscasse
            self.sansaccent = sansaccent
     
            # tient compte ou pas de la casse (majuscule/minuscule)
            self.motref = self.motref.lower() if self.sanscasse else self.motref
     
            # tient compte ou pas des accents
            self.motref = supaccents(self.motref) if self.sansaccent else self.motref
     
        #=========================================================================
        def __call__(self, mot):
            """retourne True si la similitude calculée est >= au ratio objectif,
            """
            # tient compte ou pas de la casse (majuscule/minuscule)
            mot = mot.lower() if self.sanscasse else mot
     
            # tient compte ou pas des accents
            mot = supaccents(mot) if self.sansaccent else mot
     
            ratiofic = SequenceMatcher(None, mot, self.motref).ratio()
     
            return ratiofic>=self.ratio, ratiofic

    Exemples d'utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    motref = "Dupont"
    mot = "dupond"
     
    simil = Simil(motref, ratio=0.80)
    print(mot, "ratio=0.80", simil(mot))
     
    simil = Simil(motref, ratio=0.90)
    print(mot, "ratio=0.90", simil(mot))
     
    simil = Simil(motref, sanscasse=False, ratio=1.00)
    print(mot, "ratio=1.00", simil(mot))# n'accepte que si les mots sont identiques
     
    simil = Simil(motref, sanscasse=False, ratio=1.00)
    print("Dupont", "ratio=1.00", simil("Dupont"))# n'accepte que si les mots sont identiques
     
    simil = Simil(motref, sanscasse=False, ratio=0.0)
    print(mot, "ratio=0.00", simil(mot)) # accepte dans tous les cas
     
    simil = Simil(motref, sanscasse=False, ratio=0.0)
    print("abcdef", "ratio=0.00", simil("abcdef")) # accepte dans tous les cas
    Ce qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dupond ratio=0.80 (True, 0.8333333333333334)
    dupond ratio=0.90 (False, 0.8333333333333334)
    dupond ratio=1.00 (False, 0.6666666666666666)
    Dupont ratio=1.00 (True, 1.0)
    dupond ratio=0.00 (True, 0.6666666666666666)
    abcdef ratio=0.00 (True, 0.0)
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 876
    Points : 7 212
    Points
    7 212
    Par défaut
    Bonjour,

    Je ne connais pas la complexité de la source 2, mais je commencerai par quelque chose de simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from difflib import SequenceMatcher
    import unicodedata
     
    def normalize(text):
        text = unicodedata.normalize('NFKD', text).encode('ASCII', 'ignore').decode('ASCII')
        return text.lower()
     
    def similarity(*cities):
        return SequenceMatcher(None, *map(normalize, cities)).ratio()
     
     
    print(similarity('Bézier', 'BEZier'))
    Si tu vois que certaines villes ne sont pas correctement comparées, il faudra créer des tests unitaires et faire du cas par cas, jusqu'à trouver la fonction parfaite qui te conviendra...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 172
    Points : 4 594
    Points
    4 594
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    connais pas la complexité de la source 2, mais je commencerai par quelque chose de simple
    Le fichier est fourni Et tous les 2 vous ne partez pas vers une "chose de simple", moi, je ne vois aucun rapport entre les 2 colonnes (sources) ! Soit la ville est la même mais en minuscule, soit il n'y a aucun rapport (je suppose vu les datas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    SOURCE 1	SOURCE 2
    ZURICH	Zurich
    WUXI	West Palm Beach
    WUPPERTAL-OBERBARMEN	Wellington
    WUHAN	Waterloo
    WUERZBURG	Waterford
    WROCLAW	Washington DC
    WINTERTHUR	Warszawa
    WINDHOEK	Warrington
    WIESBADEN	Waco
    WIEN (AUSTRIA)	Vitoria-Gasteiz
    WIEN	Vitória
    WHISTLER	Visalia
    WHENZHOU	Visakhapatnam
    WEST PERTH	Villahermosa
    WENTWORTHVILLE	Vigo
    WELLINGTON	Victoria
    WEINAN	Verona
    WEIFANG	Veracruz
    WAVRE	Ventura County
    WATSON ACT	Venezia
    WATERLOO	Vancouver
    WASQUEHAL	Valparaíso
    WASHINGTON, D. C.	Valladolid
    WARSZAWA	Valenciennes
    WARSAW	Valencia
    WARRAGUL	Utsunomiya
    WAKAYAMA	Utrecht
    VIRY	Tours
    VINA DEL MAR	Toulouse
    VILNUS	Toulon
    TORONTO	Seattle
    TOKYO	Savannah
    TOKAJ	Saskatoon
    De plus lorsque l'on lit la demande, pour moi cela n'a pas de sens
    score de similarité par exemple afin de savoir si une ville est dans la Source 1 et dans le Source 2 ou seulement dans la source 1/seulement dans la source 2.
    Il écrit bien que le score c'est pour savoir si une (nouvelle) villle est uniquement en colonne 1 ou colonne 2 (ou dans les 2). Donc 3 possibilités : 3 scores

    A comprendre que s'il entre "Paris". Et en réponse , ?? il réaffiche ces 2 colonnes avec une troisième qui dit si paris est (présent) dans la colonne 1 OU 2 ou, présente dans 1 ET 2

    Avec les datas, si on cherche "zurich", on va avoir un scrore "ET" à la première ligne
    $moi= ( !== ) ? : ;

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 876
    Points : 7 212
    Points
    7 212
    Par défaut
    Citation Envoyé par papajoker
    Le fichier est fourni
    Pour moi le fichier représente la source 1.

    La source 2 n'est donc pas présente dans le post du PO. Mais je peux me tromper et dans ce cas j'ai pas compris le problème.

    Citation Envoyé par papajoker
    je ne vois aucun rapport entre les 2 colonnes
    Il n'y en a pas, et du coup je me demande si c'est moi qui n'est pas compris le problème

    Citation Envoyé par papajoker
    Soit la ville est la même mais en minuscule, soit il n'y a aucun rapport (je suppose vu les datas)
    Ah, les problèmes sont souvent sous estimé dans leur difficulté. N'ayant pas tous les tenants et les aboutissants, je ne m'avancerai pas sur la simplicité du problème.
    C'est pour cela que je parle de tests unitaires dans le cas où un résultat ne convient pas, on ajoute un test.

    Citation Envoyé par papajoker
    Créer une 3ème colonne pour dire que WUHAN et Waterloo ont 2 caractères commum ?
    Là on se rejoint...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 172
    Points : 4 594
    Points
    4 594
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Pour moi le fichier représente la source 1.
    La source 2 n'est donc pas présente
    J'ai réédité mon message (désolé)
    Si, la source 2 est la colonne 2 (je ne fais que lire l'entete)

    Et (réédité maintenant), pour moi, son "score" ne prend que 3 valeurs (false, "ou" , "et") : une ville (à saisir) est présente dans une,deux colonne
    $moi= ( !== ) ? : ;

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 876
    Points : 7 212
    Points
    7 212
    Par défaut
    Citation Envoyé par papajoker
    Si, la source 2 est la colonne 2 (je ne fais que lire l'entete)
    Citation Envoyé par Judicieursement
    J'aimerais trouver un moyen de comparer deux colonnes. Ici des villes.
    Si la 2ème colonne ne concerne pas des villes, alors il me semble que le terme source 2 représente un fichier.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 568
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 568
    Points : 19 402
    Points
    19 402
    Par défaut
    s'il est question de créer une troisième colonne, cela ne veut-il pas dire que l'intégralité des données est dans un seul fichier de deux colonnes ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 172
    Points : 4 594
    Points
    4 594
    Par défaut
    Citation Envoyé par Judicieusement Voir le message
    comparer deux colonnes
    C'est cela qui fait mal à la tête dans ce sujet.
    puisque qu'ensuite il décrit le score comme une simple recherche (d'un mot) dans ces 2 colonnes
    Que ce soit des villes, prénoms ou noms , cela ne change rien. Moi, je ne vois qu'un petit exercice python de premier niveau avec une boucle sur chaque ligne
    il faut "comparer" (pour chaque ligne) un mot avec le contenu de deux colonnes et donner le résultat en troisième colonne
    $moi= ( !== ) ? : ;

  11. #11
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 876
    Points : 7 212
    Points
    7 212
    Par défaut
    Citation Envoyé par N_Bah
    s'il est question de créer une troisième colonne, cela ne veut-il pas dire que l'intégralité des données est dans un seul fichier de deux colonnes ?
    Bah non
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 568
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 568
    Points : 19 402
    Points
    19 402
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bah non
    ça c'est de l'argumentation.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 876
    Points : 7 212
    Points
    7 212
    Par défaut
    Citation Envoyé par N_Bah
    ça c'est de l'argumentation.
    Peut-être que c'est un manque d'argumentation qui mène à une réflexion
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. Gestion des erreurs sur les noms des villes
    Par yosryosr dans le forum Pascal
    Réponses: 3
    Dernier message: 18/04/2008, 11h52
  2. gestions des erreurs sur les Noms des villes
    Par yosryosr dans le forum Langage
    Réponses: 2
    Dernier message: 15/04/2008, 12h07
  3. [XML 1.1] Règle de comparaison des noms et chaînes XML
    Par Hibou57 dans le forum XML/XSL et SOAP
    Réponses: 0
    Dernier message: 03/08/2007, 18h43
  4. Problème de comparaison de noms de fichiers
    Par ProviewJava1 dans le forum C
    Réponses: 4
    Dernier message: 19/01/2007, 14h31
  5. Fonction de normalisation Nom de ville
    Par Didier77 dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 19/07/2006, 13h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo