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

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

Marsh Posté le 09-03-2014 à 20:42:44    

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

Reply

Marsh Posté le 09-03-2014 à 20:42:44   

Reply

Marsh Posté le 09-03-2014 à 23:52:36    

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!

Reply

Marsh Posté le 10-03-2014 à 14:25:21    

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é!  --
Reply

Marsh Posté le 11-03-2014 à 10:56:23    

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.
 

Reply

Marsh Posté le 11-03-2014 à 22:23:03    

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é!  --
Reply

Marsh Posté le 21-03-2014 à 03:16:03    

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

Reply

Marsh Posté le 21-03-2014 à 12:52:44    

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é!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed