Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2997 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  la distance de levenshtein pour calculer le nombre d'apparition dans u

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

la distance de levenshtein pour calculer le nombre d'apparition dans u

n°2221917
djewel
Posté le 09-03-2014 à 20:42:44  profilanswer
 

Bonjour
J'ai un fichier sur plusieurs lignes et colonnes (fichier A) et un autre sur une seule colonne(fichier B).
je voudrais utiliser la distance de levenshtein pour vérifier l’existence de chaque élément  de B dans chaque ligne de A et compter le nombre de zéros (pour chaque ligne)
.
Mon code pour le moment me donne des résultats erronés. Si quelqu'un a une idée sur comment m'y prendre.  
Merci d'avance

mood
Publicité
Posté le 09-03-2014 à 20:42:44  profilanswer
 

n°2221924
Devil'sTig​er
Posté le 09-03-2014 à 23:52:36  profilanswer
 

Si c'est un test strict (cad tu cherches EXACTEMENT) tu n'as nullement besoin de levenshtein.
 
N'ayant pas l'algo il va être dur de répondre, cela dit voici une piste possible:
Sachant la langue dans laquelle sont chaque fichier, il est possible de savoir statistiquement le nombre d'apparition moyen de la lettre 'e', 'a', 'v' et ainsi de suite, si ton algo n'a pas d'erreur mais donne des résultats erronés, ce peut être une piste pour affiner tes résultats!

n°2221986
gilou
Modérateur
Modzilla
Posté le 10-03-2014 à 14:25:21  profilanswer
 

Je vois pas ce que la distance de levenshtein vient faire ici (mais il y a des modules perl pour cela, dont Text::Levenshtein).
> je voudrais utiliser la distance de levenshtein pour vérifier l’existence de chaque élément  de B dans chaque ligne de A
Tu lis B et crées un hash dont les clés sont les mots lus, et les valeurs 0.
Puis tu lis A et pour chaque mot de A, si le hash, avec pour clé le mot (de A) est défini, tu incrémentes sa valeur.
En sortie de tout ça, tu boucles sur le hash, et les éléments de ce hash pour lesquels les valeurs sont a 0 auront pour clé les mots de B qui n'ont pas d'occurrence dans A.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2222056
djewel
Posté le 11-03-2014 à 10:56:23  profilanswer
 

merci pour vos réponses
comme je suis débutante en perl j'ai voulu utiliser un module tout prés qui est Text::Levenshtein.
je vais essayer d'appliquer ce que Gilou me conseille.
 

n°2222097
gilou
Modérateur
Modzilla
Posté le 11-03-2014 à 22:23:03  profilanswer
 

La solution que je t'indique est standard.
 
Un exemple pédagogique de son principe:
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my @A = qw(un petit exemple de perl);
  6. my @B = qw(un autre exemple en perl);
  7. my %H;
  8.  
  9. foreach my $mot (@B) {
  10.  $H{$mot} = 0;
  11. }
  12.  
  13. print "Test des mots de A\n";
  14. foreach my $mot (@A) {
  15.  print "Le mot \"$mot\" ";
  16.  if (defined $H{$mot}) {
  17.    print "est present dans B";
  18.  }
  19.  else {
  20.    print "est absent de B";
  21.  }
  22.  print "\n";
  23. }


 
et une version dans les deux sens
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;
  5.  
  6. my @A = qw(un petit exemple de perl);
  7. my @B = qw(un autre petit petit exemple en perl);
  8. my (%MA, %MB);
  9.  
  10. foreach my $mot (@A) {
  11.  $MA{$mot} = 0;
  12. }
  13.  
  14. foreach my $mot (@B) {
  15.  $MB{$mot} = 0;
  16. }
  17.  
  18. foreach my $mot (@A) {
  19.  if (defined $MB{$mot}) {
  20.    $MB{$mot}++;
  21.  }
  22. }
  23.  
  24. foreach my $mot (@B) {
  25.  if (defined $MA{$mot}) {
  26.    $MA{$mot}++;
  27.  }
  28. }
  29.  
  30. print "Test des mots de A\n";
  31. foreach my $mot (sort (keys %MA)) {
  32.  print "Le mot \"$mot\" ";
  33.  if (not $MA{$mot}) {
  34.    print "est absent de B";
  35.  } else {
  36.    print "est present $MA{$mot} fois dans B";
  37.  }
  38.  print "\n";
  39. }
  40. print "\n";
  41. print "\n";
  42. print "Test des mots de B\n";
  43. foreach my $mot (sort (keys %MB)) {
  44.  print "Le mot \"$mot\" ";
  45.  if (not $MB{$mot}) {
  46.    print "est absent de A";
  47.  } else {
  48.    print "est present $MB{$mot} fois dans A";
  49.  }
  50.  print "\n";
  51. }


A+,


Message édité par gilou le 11-03-2014 à 22:48:05

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2222771
djewel
Posté le 21-03-2014 à 03:16:03  profilanswer
 

votre code marche très bien pour une seule ligne, mais la encore j'arrive pas à l'appliquer pour tous le fichier :o  
voici comment est mon fichier A: voiture
                                             argent
                                             grande
                                             avoir
 
et le fichier B: comment faire pour avoir un grande maison
                    ma voiture et la voiture de mon voisin sont de même marque  
                    pourquoi vous sortez par ce froid
 
la sortie désirée est de la forme suivante: 0  2  0
                                                        0  0  0
                                                        1  0  0
                                                        1  0  0
 
merci de bien vouloir m'aider

n°2222804
gilou
Modérateur
Modzilla
Posté le 21-03-2014 à 12:52:44  profilanswer
 

Ben oui, je vous ai donné le principe avec deux listes de mots, a vous de transformer cela lorsque l'on a une liste de mots et une liste de lignes, soit une liste de listes de mots.
Il suffit de faire cela avec des structures de données un peu plus adaptées.
Je n'allais pas non plus faire intégralement votre exercice.
 
Un indice:
Lire A -> liste de mots
Lire  une ligne de B -> liste de mots
-- appliquer la méthode indiquée
-- stocker le résultat comme ligne d'un matrice 2D
recommencer avec la ligne suivante de B
et au final, prendre la transposée der la matrice 2D au moyen du module Array::Transpose
 
En perl, une matrice 2D, c'est une une référence à liste de listes.
Par exemple le tableau de valeurs
0  2  0  
1  0  0  
se représente en perl comme  
matrice = [ [0, 2, 0],
                [1, 0, 0]
              ];
 
A+,


Message édité par gilou le 21-03-2014 à 13:53:39

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  la distance de levenshtein pour calculer le nombre d'apparition dans u

 

Sujets relatifs
Distance entre deux objetsCalculer le factorielle d'un nombre. // (Dev-C++)
[PowerShell] Compte le nombre de ligne d'un fichierCompter le nombre de 1 dans une ligne
Déterminer le nombre de slots RAM[C] Calculer la Normale d'un vecteur en C
Faire un tri dans un tableau avec un nombre de colonnes et lignes aléanommer le contenu d'un nombre de feuilles aléatoire [XL2013]
Mon serveur Nas veut pas récupérer le contenu du dossier à distance ? 
Plus de sujets relatifs à : la distance de levenshtein pour calculer le nombre d'apparition dans u


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR