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

Langage Perl Discussion :

Comparer deux mots


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5
    Par défaut Comparer deux mots
    Bonjour, je débute en Perl et j'aimerais utiliser une fonction qui renvoie le nombre de lettres différentes entre deux mots.

    Par exemple :
    dupont - dupond : renvoirait 1
    lumiere - laniere : renvoirait 2
    appeler - apeler : renvoirait 1

    Vous m'avez compris
    J'ai beau chercher sur internet, je n'ai pas trouvé.

    Merci de votre aide!!

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Un lettre absente compte comme une lettre différente ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5
    Par défaut
    Idéalement, oui.
    On peut aussi poser la question autrement : Combien il y a-t-il de caractères identiques dans le même ordre ? (En sautant quelques caractères, si nécéssaire).
    Ou encore : quelle est le pourcentage de similarité entre deux chaînes ?

    Ce sont 3 questions différentes, mais on peut arriver à la réponse de la 1ere en bidouillant un peu. IMPORTANT : Dans les deux chaines que je cherche à comparer, il peut y avoir des lettres, mais aussi d'autres caractères. Ils sont traités également.

    Perl doit être capable de faire ca non ? ^^

    Merci

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par Skyba01 Voir le message
    Perl doit être capable de faire ca non ? ^^

    Merci
    Perl peut tout faire à qui s'en donne la peine

    Je veux dire que votre question est plus d'ordre algorithmique que de programmation en perl.

    Une idée de départ : ranger chaque occurrence de lettre dans un hash dont la clé est la lettre et la valeur son nombre d'occurrence.
    De là, compter les écarts...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    use 5.10.0;
    my (%mot1, %mot2);
    $mot1{$_}++ foreach split //, $mot1;
    $mot2{$_}++ foreach split //, $mot2;
    my $distance = 0;
    foreach my $car (keys %mot1, keys %mot2) {
      $distance += abs(($mot1{$car} // 0) - ($mot2{$car} // 0));
    }
    print "distance: ", $distance, "\n";
    J'ai jeté l'algo "en live". Je ne sais ni s'il est correct, ni s'il compile ou s'exécute.

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Le script précédent traite le 1 et le 2 de "mot1" et "mot2" comme étant deux différences (1 n'est pas dans mot2, et 2 n'est pas dans mot1).

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Une meilleure approximation de la distance :
    (int($distance/2)+($distance % 1))

    Précision : l'algo précédent ne tient pas compte de l'ordre des caractères. S'il faut tenir compte de l'ordre, je ne vois alors qu'un algorithme linéaire qui parcoure en parallèle chaque caractère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my @mot1 = split //, $mot1;
    my @mot2 = split //, $mot2;
    my $distance = 0;
    foreach my $car (@mot1) {
      $distance += $car ne (shift(@mot2) // "");
    }
    $distance += @mot2;
    print "distance=", $distance, "\n,";

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Cette dernière version me semble parfaite

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5
    Par défaut
    Merci pour ta réponse Philou.
    J'ai essayé d'éxécuter ton programme, mais il me dit (ayant auparavant défini mot1 et mot2) :
    Use of uninitialized value in concatenation (.) or string at levenshtein.pl line 7.
    Unmatched ) before HERE mark in regex m/ 0) << HERE - ( / at levenshtein.pl line 7.

    Hmmm je ne sais que faire xD

    Quelqu'un ma indiqué que le nombre que je cherchais s'appelle la distance de Levenshtein.
    J'ai donc cherché un peu, et j'ai trouvé un script qui semble marcher :
    http://www.mgilleland.com/ld/ldperl2.htm

    C'est donc bon

    Merci encore. Plus besoin de se casser la tête ^^
    Bonne journée

    EDIT : Tu avais posté ton nouveau programme avant même que j'avais fini ma réponse ^^. Il me semble bien, mais il me dit

    Search pattern not terminated at levenshtein.pl line 10. (c'est la ligne de l'instruction dans la boucle foreach).
    Si il arrive au même résultat que le programme que j'ai trouvé sur internet, chapeau ^^ car il est bcp plus court

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Et voila, quand on sait de quoi l'on parle, il existe un module tout fait en perl : voir Text::Levenshtein

    Cela dit, j'ai testé mes scripts, qui fonctionnent en perl 5.10 ; ton problème vient sans doute du fait que tu n'est qu'en 5.8.
    Pour corriger, il faut remplacer les expressions du type $toto // 0 par (defined $toto ? $toto : 0)

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Cela dit, je suis surpris de la complexité des deux algos Levenshtein à coté du mien... je serais intéressé par connaitre l'écart entre le mien et le Levenshtein (les quelques exemples que j'ai pris donnent pour l'instant des résultats identiques)...

  11. #11
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Je crois en fait que mon algo se rapproche (ou est) la distance de Hamming, qui est un majorant de la distance de Levenshtein.

Discussions similaires

  1. Comparer deux mots avec exactitude
    Par CLeBeR dans le forum VB.NET
    Réponses: 14
    Dernier message: 02/03/2014, 23h57
  2. [Défis][4] Comparer deux listes de mots
    Par ol9245 dans le forum Contribuez
    Réponses: 9
    Dernier message: 26/06/2012, 18h45
  3. Problème pour comparer deux mots
    Par Fredo123456 dans le forum C
    Réponses: 4
    Dernier message: 18/02/2008, 22h25
  4. comparer deux string
    Par jul54 dans le forum MFC
    Réponses: 3
    Dernier message: 22/04/2004, 15h50
  5. [date] Comparer deux formats différents
    Par terziann dans le forum Requêtes
    Réponses: 17
    Dernier message: 21/07/2003, 15h21

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